1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a semantic tree transformation that takes a given 10 // AST and rebuilds it, possibly transforming some nodes in the process. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 16 17 #include "CoroutineStmtBuilder.h" 18 #include "TypeLocBuilder.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclObjC.h" 21 #include "clang/AST/DeclTemplate.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/Stmt.h" 27 #include "clang/AST/StmtCXX.h" 28 #include "clang/AST/StmtObjC.h" 29 #include "clang/AST/StmtOpenMP.h" 30 #include "clang/Sema/Designator.h" 31 #include "clang/Sema/Lookup.h" 32 #include "clang/Sema/Ownership.h" 33 #include "clang/Sema/ParsedTemplate.h" 34 #include "clang/Sema/ScopeInfo.h" 35 #include "clang/Sema/SemaDiagnostic.h" 36 #include "clang/Sema/SemaInternal.h" 37 #include "llvm/ADT/ArrayRef.h" 38 #include "llvm/Support/ErrorHandling.h" 39 #include <algorithm> 40 41 namespace clang { 42 using namespace sema; 43 44 /// A semantic tree transformation that allows one to transform one 45 /// abstract syntax tree into another. 46 /// 47 /// A new tree transformation is defined by creating a new subclass \c X of 48 /// \c TreeTransform<X> and then overriding certain operations to provide 49 /// behavior specific to that transformation. For example, template 50 /// instantiation is implemented as a tree transformation where the 51 /// transformation of TemplateTypeParmType nodes involves substituting the 52 /// template arguments for their corresponding template parameters; a similar 53 /// transformation is performed for non-type template parameters and 54 /// template template parameters. 55 /// 56 /// This tree-transformation template uses static polymorphism to allow 57 /// subclasses to customize any of its operations. Thus, a subclass can 58 /// override any of the transformation or rebuild operators by providing an 59 /// operation with the same signature as the default implementation. The 60 /// overriding function should not be virtual. 61 /// 62 /// Semantic tree transformations are split into two stages, either of which 63 /// can be replaced by a subclass. The "transform" step transforms an AST node 64 /// or the parts of an AST node using the various transformation functions, 65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 66 /// node of the appropriate kind from the pieces. The default transformation 67 /// routines recursively transform the operands to composite AST nodes (e.g., 68 /// the pointee type of a PointerType node) and, if any of those operand nodes 69 /// were changed by the transformation, invokes the rebuild operation to create 70 /// a new AST node. 71 /// 72 /// Subclasses can customize the transformation at various levels. The 73 /// most coarse-grained transformations involve replacing TransformType(), 74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 76 /// new implementations. 77 /// 78 /// For more fine-grained transformations, subclasses can replace any of the 79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 81 /// replacing TransformTemplateTypeParmType() allows template instantiation 82 /// to substitute template arguments for their corresponding template 83 /// parameters. Additionally, subclasses can override the \c RebuildXXX 84 /// functions to control how AST nodes are rebuilt when their operands change. 85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 87 /// be able to use more efficient rebuild steps. 88 /// 89 /// There are a handful of other functions that can be overridden, allowing one 90 /// to avoid traversing nodes that don't need any transformation 91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 92 /// operands have not changed (\c AlwaysRebuild()), and customize the 93 /// default locations and entity names used for type-checking 94 /// (\c getBaseLocation(), \c getBaseEntity()). 95 template<typename Derived> 96 class TreeTransform { 97 /// Private RAII object that helps us forget and then re-remember 98 /// the template argument corresponding to a partially-substituted parameter 99 /// pack. 100 class ForgetPartiallySubstitutedPackRAII { 101 Derived &Self; 102 TemplateArgument Old; 103 104 public: 105 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 106 Old = Self.ForgetPartiallySubstitutedPack(); 107 } 108 109 ~ForgetPartiallySubstitutedPackRAII() { 110 Self.RememberPartiallySubstitutedPack(Old); 111 } 112 }; 113 114 protected: 115 Sema &SemaRef; 116 117 /// The set of local declarations that have been transformed, for 118 /// cases where we are forced to build new declarations within the transformer 119 /// rather than in the subclass (e.g., lambda closure types). 120 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 121 122 public: 123 /// Initializes a new tree transformer. 124 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 125 126 /// Retrieves a reference to the derived class. 127 Derived &getDerived() { return static_cast<Derived&>(*this); } 128 129 /// Retrieves a reference to the derived class. 130 const Derived &getDerived() const { 131 return static_cast<const Derived&>(*this); 132 } 133 134 static inline ExprResult Owned(Expr *E) { return E; } 135 static inline StmtResult Owned(Stmt *S) { return S; } 136 137 /// Retrieves a reference to the semantic analysis object used for 138 /// this tree transform. 139 Sema &getSema() const { return SemaRef; } 140 141 /// Whether the transformation should always rebuild AST nodes, even 142 /// if none of the children have changed. 143 /// 144 /// Subclasses may override this function to specify when the transformation 145 /// should rebuild all AST nodes. 146 /// 147 /// We must always rebuild all AST nodes when performing variadic template 148 /// pack expansion, in order to avoid violating the AST invariant that each 149 /// statement node appears at most once in its containing declaration. 150 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 151 152 /// Returns the location of the entity being transformed, if that 153 /// information was not available elsewhere in the AST. 154 /// 155 /// By default, returns no source-location information. Subclasses can 156 /// provide an alternative implementation that provides better location 157 /// information. 158 SourceLocation getBaseLocation() { return SourceLocation(); } 159 160 /// Returns the name of the entity being transformed, if that 161 /// information was not available elsewhere in the AST. 162 /// 163 /// By default, returns an empty name. Subclasses can provide an alternative 164 /// implementation with a more precise name. 165 DeclarationName getBaseEntity() { return DeclarationName(); } 166 167 /// Sets the "base" location and entity when that 168 /// information is known based on another transformation. 169 /// 170 /// By default, the source location and entity are ignored. Subclasses can 171 /// override this function to provide a customized implementation. 172 void setBase(SourceLocation Loc, DeclarationName Entity) { } 173 174 /// RAII object that temporarily sets the base location and entity 175 /// used for reporting diagnostics in types. 176 class TemporaryBase { 177 TreeTransform &Self; 178 SourceLocation OldLocation; 179 DeclarationName OldEntity; 180 181 public: 182 TemporaryBase(TreeTransform &Self, SourceLocation Location, 183 DeclarationName Entity) : Self(Self) { 184 OldLocation = Self.getDerived().getBaseLocation(); 185 OldEntity = Self.getDerived().getBaseEntity(); 186 187 if (Location.isValid()) 188 Self.getDerived().setBase(Location, Entity); 189 } 190 191 ~TemporaryBase() { 192 Self.getDerived().setBase(OldLocation, OldEntity); 193 } 194 }; 195 196 /// Determine whether the given type \p T has already been 197 /// transformed. 198 /// 199 /// Subclasses can provide an alternative implementation of this routine 200 /// to short-circuit evaluation when it is known that a given type will 201 /// not change. For example, template instantiation need not traverse 202 /// non-dependent types. 203 bool AlreadyTransformed(QualType T) { 204 return T.isNull(); 205 } 206 207 /// Determine whether the given call argument should be dropped, e.g., 208 /// because it is a default argument. 209 /// 210 /// Subclasses can provide an alternative implementation of this routine to 211 /// determine which kinds of call arguments get dropped. By default, 212 /// CXXDefaultArgument nodes are dropped (prior to transformation). 213 bool DropCallArgument(Expr *E) { 214 return E->isDefaultArgument(); 215 } 216 217 /// Determine whether we should expand a pack expansion with the 218 /// given set of parameter packs into separate arguments by repeatedly 219 /// transforming the pattern. 220 /// 221 /// By default, the transformer never tries to expand pack expansions. 222 /// Subclasses can override this routine to provide different behavior. 223 /// 224 /// \param EllipsisLoc The location of the ellipsis that identifies the 225 /// pack expansion. 226 /// 227 /// \param PatternRange The source range that covers the entire pattern of 228 /// the pack expansion. 229 /// 230 /// \param Unexpanded The set of unexpanded parameter packs within the 231 /// pattern. 232 /// 233 /// \param ShouldExpand Will be set to \c true if the transformer should 234 /// expand the corresponding pack expansions into separate arguments. When 235 /// set, \c NumExpansions must also be set. 236 /// 237 /// \param RetainExpansion Whether the caller should add an unexpanded 238 /// pack expansion after all of the expanded arguments. This is used 239 /// when extending explicitly-specified template argument packs per 240 /// C++0x [temp.arg.explicit]p9. 241 /// 242 /// \param NumExpansions The number of separate arguments that will be in 243 /// the expanded form of the corresponding pack expansion. This is both an 244 /// input and an output parameter, which can be set by the caller if the 245 /// number of expansions is known a priori (e.g., due to a prior substitution) 246 /// and will be set by the callee when the number of expansions is known. 247 /// The callee must set this value when \c ShouldExpand is \c true; it may 248 /// set this value in other cases. 249 /// 250 /// \returns true if an error occurred (e.g., because the parameter packs 251 /// are to be instantiated with arguments of different lengths), false 252 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 253 /// must be set. 254 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 255 SourceRange PatternRange, 256 ArrayRef<UnexpandedParameterPack> Unexpanded, 257 bool &ShouldExpand, 258 bool &RetainExpansion, 259 Optional<unsigned> &NumExpansions) { 260 ShouldExpand = false; 261 return false; 262 } 263 264 /// "Forget" about the partially-substituted pack template argument, 265 /// when performing an instantiation that must preserve the parameter pack 266 /// use. 267 /// 268 /// This routine is meant to be overridden by the template instantiator. 269 TemplateArgument ForgetPartiallySubstitutedPack() { 270 return TemplateArgument(); 271 } 272 273 /// "Remember" the partially-substituted pack template argument 274 /// after performing an instantiation that must preserve the parameter pack 275 /// use. 276 /// 277 /// This routine is meant to be overridden by the template instantiator. 278 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 279 280 /// Note to the derived class when a function parameter pack is 281 /// being expanded. 282 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 283 284 /// Transforms the given type into another type. 285 /// 286 /// By default, this routine transforms a type by creating a 287 /// TypeSourceInfo for it and delegating to the appropriate 288 /// function. This is expensive, but we don't mind, because 289 /// this method is deprecated anyway; all users should be 290 /// switched to storing TypeSourceInfos. 291 /// 292 /// \returns the transformed type. 293 QualType TransformType(QualType T); 294 295 /// Transforms the given type-with-location into a new 296 /// type-with-location. 297 /// 298 /// By default, this routine transforms a type by delegating to the 299 /// appropriate TransformXXXType to build a new type. Subclasses 300 /// may override this function (to take over all type 301 /// transformations) or some set of the TransformXXXType functions 302 /// to alter the transformation. 303 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 304 305 /// Transform the given type-with-location into a new 306 /// type, collecting location information in the given builder 307 /// as necessary. 308 /// 309 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 310 311 /// Transform a type that is permitted to produce a 312 /// DeducedTemplateSpecializationType. 313 /// 314 /// This is used in the (relatively rare) contexts where it is acceptable 315 /// for transformation to produce a class template type with deduced 316 /// template arguments. 317 /// @{ 318 QualType TransformTypeWithDeducedTST(QualType T); 319 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 320 /// @} 321 322 /// Transform the given statement. 323 /// 324 /// By default, this routine transforms a statement by delegating to the 325 /// appropriate TransformXXXStmt function to transform a specific kind of 326 /// statement or the TransformExpr() function to transform an expression. 327 /// Subclasses may override this function to transform statements using some 328 /// other mechanism. 329 /// 330 /// \returns the transformed statement. 331 StmtResult TransformStmt(Stmt *S); 332 333 /// Transform the given statement. 334 /// 335 /// By default, this routine transforms a statement by delegating to the 336 /// appropriate TransformOMPXXXClause function to transform a specific kind 337 /// of clause. Subclasses may override this function to transform statements 338 /// using some other mechanism. 339 /// 340 /// \returns the transformed OpenMP clause. 341 OMPClause *TransformOMPClause(OMPClause *S); 342 343 /// Transform the given attribute. 344 /// 345 /// By default, this routine transforms a statement by delegating to the 346 /// appropriate TransformXXXAttr function to transform a specific kind 347 /// of attribute. Subclasses may override this function to transform 348 /// attributed statements using some other mechanism. 349 /// 350 /// \returns the transformed attribute 351 const Attr *TransformAttr(const Attr *S); 352 353 /// Transform the specified attribute. 354 /// 355 /// Subclasses should override the transformation of attributes with a pragma 356 /// spelling to transform expressions stored within the attribute. 357 /// 358 /// \returns the transformed attribute. 359 #define ATTR(X) 360 #define PRAGMA_SPELLING_ATTR(X) \ 361 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 362 #include "clang/Basic/AttrList.inc" 363 364 /// Transform the given expression. 365 /// 366 /// By default, this routine transforms an expression by delegating to the 367 /// appropriate TransformXXXExpr function to build a new expression. 368 /// Subclasses may override this function to transform expressions using some 369 /// other mechanism. 370 /// 371 /// \returns the transformed expression. 372 ExprResult TransformExpr(Expr *E); 373 374 /// Transform the given initializer. 375 /// 376 /// By default, this routine transforms an initializer by stripping off the 377 /// semantic nodes added by initialization, then passing the result to 378 /// TransformExpr or TransformExprs. 379 /// 380 /// \returns the transformed initializer. 381 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 382 383 /// Transform the given list of expressions. 384 /// 385 /// This routine transforms a list of expressions by invoking 386 /// \c TransformExpr() for each subexpression. However, it also provides 387 /// support for variadic templates by expanding any pack expansions (if the 388 /// derived class permits such expansion) along the way. When pack expansions 389 /// are present, the number of outputs may not equal the number of inputs. 390 /// 391 /// \param Inputs The set of expressions to be transformed. 392 /// 393 /// \param NumInputs The number of expressions in \c Inputs. 394 /// 395 /// \param IsCall If \c true, then this transform is being performed on 396 /// function-call arguments, and any arguments that should be dropped, will 397 /// be. 398 /// 399 /// \param Outputs The transformed input expressions will be added to this 400 /// vector. 401 /// 402 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 403 /// due to transformation. 404 /// 405 /// \returns true if an error occurred, false otherwise. 406 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 407 SmallVectorImpl<Expr *> &Outputs, 408 bool *ArgChanged = nullptr); 409 410 /// Transform the given declaration, which is referenced from a type 411 /// or expression. 412 /// 413 /// By default, acts as the identity function on declarations, unless the 414 /// transformer has had to transform the declaration itself. Subclasses 415 /// may override this function to provide alternate behavior. 416 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 417 llvm::DenseMap<Decl *, Decl *>::iterator Known 418 = TransformedLocalDecls.find(D); 419 if (Known != TransformedLocalDecls.end()) 420 return Known->second; 421 422 return D; 423 } 424 425 /// Transform the specified condition. 426 /// 427 /// By default, this transforms the variable and expression and rebuilds 428 /// the condition. 429 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 430 Expr *Expr, 431 Sema::ConditionKind Kind); 432 433 /// Transform the attributes associated with the given declaration and 434 /// place them on the new declaration. 435 /// 436 /// By default, this operation does nothing. Subclasses may override this 437 /// behavior to transform attributes. 438 void transformAttrs(Decl *Old, Decl *New) { } 439 440 /// Note that a local declaration has been transformed by this 441 /// transformer. 442 /// 443 /// Local declarations are typically transformed via a call to 444 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 445 /// the transformer itself has to transform the declarations. This routine 446 /// can be overridden by a subclass that keeps track of such mappings. 447 void transformedLocalDecl(Decl *Old, Decl *New) { 448 TransformedLocalDecls[Old] = New; 449 } 450 451 /// Transform the definition of the given declaration. 452 /// 453 /// By default, invokes TransformDecl() to transform the declaration. 454 /// Subclasses may override this function to provide alternate behavior. 455 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 456 return getDerived().TransformDecl(Loc, D); 457 } 458 459 /// Transform the given declaration, which was the first part of a 460 /// nested-name-specifier in a member access expression. 461 /// 462 /// This specific declaration transformation only applies to the first 463 /// identifier in a nested-name-specifier of a member access expression, e.g., 464 /// the \c T in \c x->T::member 465 /// 466 /// By default, invokes TransformDecl() to transform the declaration. 467 /// Subclasses may override this function to provide alternate behavior. 468 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 469 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 470 } 471 472 /// Transform the set of declarations in an OverloadExpr. 473 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 474 LookupResult &R); 475 476 /// Transform the given nested-name-specifier with source-location 477 /// information. 478 /// 479 /// By default, transforms all of the types and declarations within the 480 /// nested-name-specifier. Subclasses may override this function to provide 481 /// alternate behavior. 482 NestedNameSpecifierLoc 483 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 484 QualType ObjectType = QualType(), 485 NamedDecl *FirstQualifierInScope = nullptr); 486 487 /// Transform the given declaration name. 488 /// 489 /// By default, transforms the types of conversion function, constructor, 490 /// and destructor names and then (if needed) rebuilds the declaration name. 491 /// Identifiers and selectors are returned unmodified. Sublcasses may 492 /// override this function to provide alternate behavior. 493 DeclarationNameInfo 494 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 495 496 /// Transform the given template name. 497 /// 498 /// \param SS The nested-name-specifier that qualifies the template 499 /// name. This nested-name-specifier must already have been transformed. 500 /// 501 /// \param Name The template name to transform. 502 /// 503 /// \param NameLoc The source location of the template name. 504 /// 505 /// \param ObjectType If we're translating a template name within a member 506 /// access expression, this is the type of the object whose member template 507 /// is being referenced. 508 /// 509 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 510 /// also refers to a name within the current (lexical) scope, this is the 511 /// declaration it refers to. 512 /// 513 /// By default, transforms the template name by transforming the declarations 514 /// and nested-name-specifiers that occur within the template name. 515 /// Subclasses may override this function to provide alternate behavior. 516 TemplateName 517 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 518 SourceLocation NameLoc, 519 QualType ObjectType = QualType(), 520 NamedDecl *FirstQualifierInScope = nullptr, 521 bool AllowInjectedClassName = false); 522 523 /// Transform the given template argument. 524 /// 525 /// By default, this operation transforms the type, expression, or 526 /// declaration stored within the template argument and constructs a 527 /// new template argument from the transformed result. Subclasses may 528 /// override this function to provide alternate behavior. 529 /// 530 /// Returns true if there was an error. 531 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 532 TemplateArgumentLoc &Output, 533 bool Uneval = false); 534 535 /// Transform the given set of template arguments. 536 /// 537 /// By default, this operation transforms all of the template arguments 538 /// in the input set using \c TransformTemplateArgument(), and appends 539 /// the transformed arguments to the output list. 540 /// 541 /// Note that this overload of \c TransformTemplateArguments() is merely 542 /// a convenience function. Subclasses that wish to override this behavior 543 /// should override the iterator-based member template version. 544 /// 545 /// \param Inputs The set of template arguments to be transformed. 546 /// 547 /// \param NumInputs The number of template arguments in \p Inputs. 548 /// 549 /// \param Outputs The set of transformed template arguments output by this 550 /// routine. 551 /// 552 /// Returns true if an error occurred. 553 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 554 unsigned NumInputs, 555 TemplateArgumentListInfo &Outputs, 556 bool Uneval = false) { 557 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 558 Uneval); 559 } 560 561 /// Transform the given set of template arguments. 562 /// 563 /// By default, this operation transforms all of the template arguments 564 /// in the input set using \c TransformTemplateArgument(), and appends 565 /// the transformed arguments to the output list. 566 /// 567 /// \param First An iterator to the first template argument. 568 /// 569 /// \param Last An iterator one step past the last template argument. 570 /// 571 /// \param Outputs The set of transformed template arguments output by this 572 /// routine. 573 /// 574 /// Returns true if an error occurred. 575 template<typename InputIterator> 576 bool TransformTemplateArguments(InputIterator First, 577 InputIterator Last, 578 TemplateArgumentListInfo &Outputs, 579 bool Uneval = false); 580 581 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 582 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 583 TemplateArgumentLoc &ArgLoc); 584 585 /// Fakes up a TypeSourceInfo for a type. 586 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 587 return SemaRef.Context.getTrivialTypeSourceInfo(T, 588 getDerived().getBaseLocation()); 589 } 590 591 #define ABSTRACT_TYPELOC(CLASS, PARENT) 592 #define TYPELOC(CLASS, PARENT) \ 593 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 594 #include "clang/AST/TypeLocNodes.def" 595 596 template<typename Fn> 597 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 598 FunctionProtoTypeLoc TL, 599 CXXRecordDecl *ThisContext, 600 unsigned ThisTypeQuals, 601 Fn TransformExceptionSpec); 602 603 bool TransformExceptionSpec(SourceLocation Loc, 604 FunctionProtoType::ExceptionSpecInfo &ESI, 605 SmallVectorImpl<QualType> &Exceptions, 606 bool &Changed); 607 608 StmtResult TransformSEHHandler(Stmt *Handler); 609 610 QualType 611 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 612 TemplateSpecializationTypeLoc TL, 613 TemplateName Template); 614 615 QualType 616 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 617 DependentTemplateSpecializationTypeLoc TL, 618 TemplateName Template, 619 CXXScopeSpec &SS); 620 621 QualType TransformDependentTemplateSpecializationType( 622 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 623 NestedNameSpecifierLoc QualifierLoc); 624 625 /// Transforms the parameters of a function type into the 626 /// given vectors. 627 /// 628 /// The result vectors should be kept in sync; null entries in the 629 /// variables vector are acceptable. 630 /// 631 /// Return true on error. 632 bool TransformFunctionTypeParams( 633 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 634 const QualType *ParamTypes, 635 const FunctionProtoType::ExtParameterInfo *ParamInfos, 636 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 637 Sema::ExtParameterInfoBuilder &PInfos); 638 639 /// Transforms a single function-type parameter. Return null 640 /// on error. 641 /// 642 /// \param indexAdjustment - A number to add to the parameter's 643 /// scope index; can be negative 644 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 645 int indexAdjustment, 646 Optional<unsigned> NumExpansions, 647 bool ExpectParameterPack); 648 649 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 650 651 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 652 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 653 654 TemplateParameterList *TransformTemplateParameterList( 655 TemplateParameterList *TPL) { 656 return TPL; 657 } 658 659 ExprResult TransformAddressOfOperand(Expr *E); 660 661 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 662 bool IsAddressOfOperand, 663 TypeSourceInfo **RecoveryTSI); 664 665 ExprResult TransformParenDependentScopeDeclRefExpr( 666 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 667 TypeSourceInfo **RecoveryTSI); 668 669 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 670 671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 672 // amount of stack usage with clang. 673 #define STMT(Node, Parent) \ 674 LLVM_ATTRIBUTE_NOINLINE \ 675 StmtResult Transform##Node(Node *S); 676 #define EXPR(Node, Parent) \ 677 LLVM_ATTRIBUTE_NOINLINE \ 678 ExprResult Transform##Node(Node *E); 679 #define ABSTRACT_STMT(Stmt) 680 #include "clang/AST/StmtNodes.inc" 681 682 #define OPENMP_CLAUSE(Name, Class) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 OMPClause *Transform ## Class(Class *S); 685 #include "clang/Basic/OpenMPKinds.def" 686 687 /// Build a new qualified type given its unqualified type and type 688 /// qualifiers. 689 /// 690 /// By default, this routine adds type qualifiers only to types that can 691 /// have qualifiers, and silently suppresses those qualifiers that are not 692 /// permitted. Subclasses may override this routine to provide different 693 /// behavior. 694 QualType RebuildQualifiedType(QualType T, SourceLocation Loc, 695 Qualifiers Quals); 696 697 /// Build a new pointer type given its pointee type. 698 /// 699 /// By default, performs semantic analysis when building the pointer type. 700 /// Subclasses may override this routine to provide different behavior. 701 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 702 703 /// Build a new block pointer type given its pointee type. 704 /// 705 /// By default, performs semantic analysis when building the block pointer 706 /// type. Subclasses may override this routine to provide different behavior. 707 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 708 709 /// Build a new reference type given the type it references. 710 /// 711 /// By default, performs semantic analysis when building the 712 /// reference type. Subclasses may override this routine to provide 713 /// different behavior. 714 /// 715 /// \param LValue whether the type was written with an lvalue sigil 716 /// or an rvalue sigil. 717 QualType RebuildReferenceType(QualType ReferentType, 718 bool LValue, 719 SourceLocation Sigil); 720 721 /// Build a new member pointer type given the pointee type and the 722 /// class type it refers into. 723 /// 724 /// By default, performs semantic analysis when building the member pointer 725 /// type. Subclasses may override this routine to provide different behavior. 726 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 727 SourceLocation Sigil); 728 729 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 730 SourceLocation ProtocolLAngleLoc, 731 ArrayRef<ObjCProtocolDecl *> Protocols, 732 ArrayRef<SourceLocation> ProtocolLocs, 733 SourceLocation ProtocolRAngleLoc); 734 735 /// Build an Objective-C object type. 736 /// 737 /// By default, performs semantic analysis when building the object type. 738 /// Subclasses may override this routine to provide different behavior. 739 QualType RebuildObjCObjectType(QualType BaseType, 740 SourceLocation Loc, 741 SourceLocation TypeArgsLAngleLoc, 742 ArrayRef<TypeSourceInfo *> TypeArgs, 743 SourceLocation TypeArgsRAngleLoc, 744 SourceLocation ProtocolLAngleLoc, 745 ArrayRef<ObjCProtocolDecl *> Protocols, 746 ArrayRef<SourceLocation> ProtocolLocs, 747 SourceLocation ProtocolRAngleLoc); 748 749 /// Build a new Objective-C object pointer type given the pointee type. 750 /// 751 /// By default, directly builds the pointer type, with no additional semantic 752 /// analysis. 753 QualType RebuildObjCObjectPointerType(QualType PointeeType, 754 SourceLocation Star); 755 756 /// Build a new array type given the element type, size 757 /// modifier, size of the array (if known), size expression, and index type 758 /// qualifiers. 759 /// 760 /// By default, performs semantic analysis when building the array type. 761 /// Subclasses may override this routine to provide different behavior. 762 /// Also by default, all of the other Rebuild*Array 763 QualType RebuildArrayType(QualType ElementType, 764 ArrayType::ArraySizeModifier SizeMod, 765 const llvm::APInt *Size, 766 Expr *SizeExpr, 767 unsigned IndexTypeQuals, 768 SourceRange BracketsRange); 769 770 /// Build a new constant array type given the element type, size 771 /// modifier, (known) size of the array, and index type qualifiers. 772 /// 773 /// By default, performs semantic analysis when building the array type. 774 /// Subclasses may override this routine to provide different behavior. 775 QualType RebuildConstantArrayType(QualType ElementType, 776 ArrayType::ArraySizeModifier SizeMod, 777 const llvm::APInt &Size, 778 unsigned IndexTypeQuals, 779 SourceRange BracketsRange); 780 781 /// Build a new incomplete array type given the element type, size 782 /// modifier, and index type qualifiers. 783 /// 784 /// By default, performs semantic analysis when building the array type. 785 /// Subclasses may override this routine to provide different behavior. 786 QualType RebuildIncompleteArrayType(QualType ElementType, 787 ArrayType::ArraySizeModifier SizeMod, 788 unsigned IndexTypeQuals, 789 SourceRange BracketsRange); 790 791 /// Build a new variable-length array type given the element type, 792 /// size modifier, size expression, and index type qualifiers. 793 /// 794 /// By default, performs semantic analysis when building the array type. 795 /// Subclasses may override this routine to provide different behavior. 796 QualType RebuildVariableArrayType(QualType ElementType, 797 ArrayType::ArraySizeModifier SizeMod, 798 Expr *SizeExpr, 799 unsigned IndexTypeQuals, 800 SourceRange BracketsRange); 801 802 /// Build a new dependent-sized array type given the element type, 803 /// size modifier, size expression, and index type qualifiers. 804 /// 805 /// By default, performs semantic analysis when building the array type. 806 /// Subclasses may override this routine to provide different behavior. 807 QualType RebuildDependentSizedArrayType(QualType ElementType, 808 ArrayType::ArraySizeModifier SizeMod, 809 Expr *SizeExpr, 810 unsigned IndexTypeQuals, 811 SourceRange BracketsRange); 812 813 /// Build a new vector type given the element type and 814 /// number of elements. 815 /// 816 /// By default, performs semantic analysis when building the vector type. 817 /// Subclasses may override this routine to provide different behavior. 818 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 819 VectorType::VectorKind VecKind); 820 821 /// Build a new potentially dependently-sized extended vector type 822 /// given the element type and number of elements. 823 /// 824 /// By default, performs semantic analysis when building the vector type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 827 SourceLocation AttributeLoc, 828 VectorType::VectorKind); 829 830 /// Build a new extended vector type given the element type and 831 /// number of elements. 832 /// 833 /// By default, performs semantic analysis when building the vector type. 834 /// Subclasses may override this routine to provide different behavior. 835 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 836 SourceLocation AttributeLoc); 837 838 /// Build a new potentially dependently-sized extended vector type 839 /// given the element type and number of elements. 840 /// 841 /// By default, performs semantic analysis when building the vector type. 842 /// Subclasses may override this routine to provide different behavior. 843 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 844 Expr *SizeExpr, 845 SourceLocation AttributeLoc); 846 847 /// Build a new DependentAddressSpaceType or return the pointee 848 /// type variable with the correct address space (retrieved from 849 /// AddrSpaceExpr) applied to it. The former will be returned in cases 850 /// where the address space remains dependent. 851 /// 852 /// By default, performs semantic analysis when building the type with address 853 /// space applied. Subclasses may override this routine to provide different 854 /// behavior. 855 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 856 Expr *AddrSpaceExpr, 857 SourceLocation AttributeLoc); 858 859 /// Build a new function type. 860 /// 861 /// By default, performs semantic analysis when building the function type. 862 /// Subclasses may override this routine to provide different behavior. 863 QualType RebuildFunctionProtoType(QualType T, 864 MutableArrayRef<QualType> ParamTypes, 865 const FunctionProtoType::ExtProtoInfo &EPI); 866 867 /// Build a new unprototyped function type. 868 QualType RebuildFunctionNoProtoType(QualType ResultType); 869 870 /// Rebuild an unresolved typename type, given the decl that 871 /// the UnresolvedUsingTypenameDecl was transformed to. 872 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 873 874 /// Build a new typedef type. 875 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 876 return SemaRef.Context.getTypeDeclType(Typedef); 877 } 878 879 /// Build a new class/struct/union type. 880 QualType RebuildRecordType(RecordDecl *Record) { 881 return SemaRef.Context.getTypeDeclType(Record); 882 } 883 884 /// Build a new Enum type. 885 QualType RebuildEnumType(EnumDecl *Enum) { 886 return SemaRef.Context.getTypeDeclType(Enum); 887 } 888 889 /// Build a new typeof(expr) type. 890 /// 891 /// By default, performs semantic analysis when building the typeof type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 894 895 /// Build a new typeof(type) type. 896 /// 897 /// By default, builds a new TypeOfType with the given underlying type. 898 QualType RebuildTypeOfType(QualType Underlying); 899 900 /// Build a new unary transform type. 901 QualType RebuildUnaryTransformType(QualType BaseType, 902 UnaryTransformType::UTTKind UKind, 903 SourceLocation Loc); 904 905 /// Build a new C++11 decltype type. 906 /// 907 /// By default, performs semantic analysis when building the decltype type. 908 /// Subclasses may override this routine to provide different behavior. 909 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 910 911 /// Build a new C++11 auto type. 912 /// 913 /// By default, builds a new AutoType with the given deduced type. 914 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 915 // Note, IsDependent is always false here: we implicitly convert an 'auto' 916 // which has been deduced to a dependent type into an undeduced 'auto', so 917 // that we'll retry deduction after the transformation. 918 return SemaRef.Context.getAutoType(Deduced, Keyword, 919 /*IsDependent*/ false); 920 } 921 922 /// By default, builds a new DeducedTemplateSpecializationType with the given 923 /// deduced type. 924 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 925 QualType Deduced) { 926 return SemaRef.Context.getDeducedTemplateSpecializationType( 927 Template, Deduced, /*IsDependent*/ false); 928 } 929 930 /// Build a new template specialization type. 931 /// 932 /// By default, performs semantic analysis when building the template 933 /// specialization type. Subclasses may override this routine to provide 934 /// different behavior. 935 QualType RebuildTemplateSpecializationType(TemplateName Template, 936 SourceLocation TemplateLoc, 937 TemplateArgumentListInfo &Args); 938 939 /// Build a new parenthesized type. 940 /// 941 /// By default, builds a new ParenType type from the inner type. 942 /// Subclasses may override this routine to provide different behavior. 943 QualType RebuildParenType(QualType InnerType) { 944 return SemaRef.BuildParenType(InnerType); 945 } 946 947 /// Build a new qualified name type. 948 /// 949 /// By default, builds a new ElaboratedType type from the keyword, 950 /// the nested-name-specifier and the named type. 951 /// Subclasses may override this routine to provide different behavior. 952 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 953 ElaboratedTypeKeyword Keyword, 954 NestedNameSpecifierLoc QualifierLoc, 955 QualType Named) { 956 return SemaRef.Context.getElaboratedType(Keyword, 957 QualifierLoc.getNestedNameSpecifier(), 958 Named); 959 } 960 961 /// Build a new typename type that refers to a template-id. 962 /// 963 /// By default, builds a new DependentNameType type from the 964 /// nested-name-specifier and the given type. Subclasses may override 965 /// this routine to provide different behavior. 966 QualType RebuildDependentTemplateSpecializationType( 967 ElaboratedTypeKeyword Keyword, 968 NestedNameSpecifierLoc QualifierLoc, 969 SourceLocation TemplateKWLoc, 970 const IdentifierInfo *Name, 971 SourceLocation NameLoc, 972 TemplateArgumentListInfo &Args, 973 bool AllowInjectedClassName) { 974 // Rebuild the template name. 975 // TODO: avoid TemplateName abstraction 976 CXXScopeSpec SS; 977 SS.Adopt(QualifierLoc); 978 TemplateName InstName = getDerived().RebuildTemplateName( 979 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 980 AllowInjectedClassName); 981 982 if (InstName.isNull()) 983 return QualType(); 984 985 // If it's still dependent, make a dependent specialization. 986 if (InstName.getAsDependentTemplateName()) 987 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 988 QualifierLoc.getNestedNameSpecifier(), 989 Name, 990 Args); 991 992 // Otherwise, make an elaborated type wrapping a non-dependent 993 // specialization. 994 QualType T = 995 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 996 if (T.isNull()) return QualType(); 997 998 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 999 return T; 1000 1001 return SemaRef.Context.getElaboratedType(Keyword, 1002 QualifierLoc.getNestedNameSpecifier(), 1003 T); 1004 } 1005 1006 /// Build a new typename type that refers to an identifier. 1007 /// 1008 /// By default, performs semantic analysis when building the typename type 1009 /// (or elaborated type). Subclasses may override this routine to provide 1010 /// different behavior. 1011 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1012 SourceLocation KeywordLoc, 1013 NestedNameSpecifierLoc QualifierLoc, 1014 const IdentifierInfo *Id, 1015 SourceLocation IdLoc, 1016 bool DeducedTSTContext) { 1017 CXXScopeSpec SS; 1018 SS.Adopt(QualifierLoc); 1019 1020 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1021 // If the name is still dependent, just build a new dependent name type. 1022 if (!SemaRef.computeDeclContext(SS)) 1023 return SemaRef.Context.getDependentNameType(Keyword, 1024 QualifierLoc.getNestedNameSpecifier(), 1025 Id); 1026 } 1027 1028 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1029 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1030 *Id, IdLoc); 1031 // If a dependent name resolves to a deduced template specialization type, 1032 // check that we're in one of the syntactic contexts permitting it. 1033 if (!DeducedTSTContext) { 1034 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1035 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1036 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1037 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1038 Deduced->getTemplateName()) 1039 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1040 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1041 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1042 return QualType(); 1043 } 1044 } 1045 return T; 1046 } 1047 1048 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1049 1050 // We had a dependent elaborated-type-specifier that has been transformed 1051 // into a non-dependent elaborated-type-specifier. Find the tag we're 1052 // referring to. 1053 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1054 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1055 if (!DC) 1056 return QualType(); 1057 1058 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1059 return QualType(); 1060 1061 TagDecl *Tag = nullptr; 1062 SemaRef.LookupQualifiedName(Result, DC); 1063 switch (Result.getResultKind()) { 1064 case LookupResult::NotFound: 1065 case LookupResult::NotFoundInCurrentInstantiation: 1066 break; 1067 1068 case LookupResult::Found: 1069 Tag = Result.getAsSingle<TagDecl>(); 1070 break; 1071 1072 case LookupResult::FoundOverloaded: 1073 case LookupResult::FoundUnresolvedValue: 1074 llvm_unreachable("Tag lookup cannot find non-tags"); 1075 1076 case LookupResult::Ambiguous: 1077 // Let the LookupResult structure handle ambiguities. 1078 return QualType(); 1079 } 1080 1081 if (!Tag) { 1082 // Check where the name exists but isn't a tag type and use that to emit 1083 // better diagnostics. 1084 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1085 SemaRef.LookupQualifiedName(Result, DC); 1086 switch (Result.getResultKind()) { 1087 case LookupResult::Found: 1088 case LookupResult::FoundOverloaded: 1089 case LookupResult::FoundUnresolvedValue: { 1090 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1091 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1092 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1093 << NTK << Kind; 1094 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1095 break; 1096 } 1097 default: 1098 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1099 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1100 break; 1101 } 1102 return QualType(); 1103 } 1104 1105 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1106 IdLoc, Id)) { 1107 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1108 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1109 return QualType(); 1110 } 1111 1112 // Build the elaborated-type-specifier type. 1113 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1114 return SemaRef.Context.getElaboratedType(Keyword, 1115 QualifierLoc.getNestedNameSpecifier(), 1116 T); 1117 } 1118 1119 /// Build a new pack expansion type. 1120 /// 1121 /// By default, builds a new PackExpansionType type from the given pattern. 1122 /// Subclasses may override this routine to provide different behavior. 1123 QualType RebuildPackExpansionType(QualType Pattern, 1124 SourceRange PatternRange, 1125 SourceLocation EllipsisLoc, 1126 Optional<unsigned> NumExpansions) { 1127 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1128 NumExpansions); 1129 } 1130 1131 /// Build a new atomic type given its value type. 1132 /// 1133 /// By default, performs semantic analysis when building the atomic type. 1134 /// Subclasses may override this routine to provide different behavior. 1135 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1136 1137 /// Build a new pipe type given its value type. 1138 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1139 bool isReadPipe); 1140 1141 /// Build a new template name given a nested name specifier, a flag 1142 /// indicating whether the "template" keyword was provided, and the template 1143 /// that the template name refers to. 1144 /// 1145 /// By default, builds the new template name directly. Subclasses may override 1146 /// this routine to provide different behavior. 1147 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1148 bool TemplateKW, 1149 TemplateDecl *Template); 1150 1151 /// Build a new template name given a nested name specifier and the 1152 /// name that is referred to as a template. 1153 /// 1154 /// By default, performs semantic analysis to determine whether the name can 1155 /// be resolved to a specific template, then builds the appropriate kind of 1156 /// template name. Subclasses may override this routine to provide different 1157 /// behavior. 1158 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1159 SourceLocation TemplateKWLoc, 1160 const IdentifierInfo &Name, 1161 SourceLocation NameLoc, QualType ObjectType, 1162 NamedDecl *FirstQualifierInScope, 1163 bool AllowInjectedClassName); 1164 1165 /// Build a new template name given a nested name specifier and the 1166 /// overloaded operator name that is referred to as a template. 1167 /// 1168 /// By default, performs semantic analysis to determine whether the name can 1169 /// be resolved to a specific template, then builds the appropriate kind of 1170 /// template name. Subclasses may override this routine to provide different 1171 /// behavior. 1172 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1173 SourceLocation TemplateKWLoc, 1174 OverloadedOperatorKind Operator, 1175 SourceLocation NameLoc, QualType ObjectType, 1176 bool AllowInjectedClassName); 1177 1178 /// Build a new template name given a template template parameter pack 1179 /// and the 1180 /// 1181 /// By default, performs semantic analysis to determine whether the name can 1182 /// be resolved to a specific template, then builds the appropriate kind of 1183 /// template name. Subclasses may override this routine to provide different 1184 /// behavior. 1185 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1186 const TemplateArgument &ArgPack) { 1187 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1188 } 1189 1190 /// Build a new compound statement. 1191 /// 1192 /// By default, performs semantic analysis to build the new statement. 1193 /// Subclasses may override this routine to provide different behavior. 1194 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1195 MultiStmtArg Statements, 1196 SourceLocation RBraceLoc, 1197 bool IsStmtExpr) { 1198 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1199 IsStmtExpr); 1200 } 1201 1202 /// Build a new case statement. 1203 /// 1204 /// By default, performs semantic analysis to build the new statement. 1205 /// Subclasses may override this routine to provide different behavior. 1206 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1207 Expr *LHS, 1208 SourceLocation EllipsisLoc, 1209 Expr *RHS, 1210 SourceLocation ColonLoc) { 1211 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1212 ColonLoc); 1213 } 1214 1215 /// Attach the body to a new case statement. 1216 /// 1217 /// By default, performs semantic analysis to build the new statement. 1218 /// Subclasses may override this routine to provide different behavior. 1219 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1220 getSema().ActOnCaseStmtBody(S, Body); 1221 return S; 1222 } 1223 1224 /// Build a new default statement. 1225 /// 1226 /// By default, performs semantic analysis to build the new statement. 1227 /// Subclasses may override this routine to provide different behavior. 1228 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1229 SourceLocation ColonLoc, 1230 Stmt *SubStmt) { 1231 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1232 /*CurScope=*/nullptr); 1233 } 1234 1235 /// Build a new label statement. 1236 /// 1237 /// By default, performs semantic analysis to build the new statement. 1238 /// Subclasses may override this routine to provide different behavior. 1239 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1240 SourceLocation ColonLoc, Stmt *SubStmt) { 1241 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1242 } 1243 1244 /// Build a new label statement. 1245 /// 1246 /// By default, performs semantic analysis to build the new statement. 1247 /// Subclasses may override this routine to provide different behavior. 1248 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1249 ArrayRef<const Attr*> Attrs, 1250 Stmt *SubStmt) { 1251 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1252 } 1253 1254 /// Build a new "if" statement. 1255 /// 1256 /// By default, performs semantic analysis to build the new statement. 1257 /// Subclasses may override this routine to provide different behavior. 1258 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1259 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1260 SourceLocation ElseLoc, Stmt *Else) { 1261 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1262 ElseLoc, Else); 1263 } 1264 1265 /// Start building a new switch statement. 1266 /// 1267 /// By default, performs semantic analysis to build the new statement. 1268 /// Subclasses may override this routine to provide different behavior. 1269 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1270 Sema::ConditionResult Cond) { 1271 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1272 } 1273 1274 /// Attach the body to the switch statement. 1275 /// 1276 /// By default, performs semantic analysis to build the new statement. 1277 /// Subclasses may override this routine to provide different behavior. 1278 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1279 Stmt *Switch, Stmt *Body) { 1280 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1281 } 1282 1283 /// Build a new while statement. 1284 /// 1285 /// By default, performs semantic analysis to build the new statement. 1286 /// Subclasses may override this routine to provide different behavior. 1287 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1288 Sema::ConditionResult Cond, Stmt *Body) { 1289 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1290 } 1291 1292 /// Build a new do-while statement. 1293 /// 1294 /// By default, performs semantic analysis to build the new statement. 1295 /// Subclasses may override this routine to provide different behavior. 1296 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1297 SourceLocation WhileLoc, SourceLocation LParenLoc, 1298 Expr *Cond, SourceLocation RParenLoc) { 1299 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1300 Cond, RParenLoc); 1301 } 1302 1303 /// Build a new for statement. 1304 /// 1305 /// By default, performs semantic analysis to build the new statement. 1306 /// Subclasses may override this routine to provide different behavior. 1307 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1308 Stmt *Init, Sema::ConditionResult Cond, 1309 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1310 Stmt *Body) { 1311 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1312 Inc, RParenLoc, Body); 1313 } 1314 1315 /// Build a new goto statement. 1316 /// 1317 /// By default, performs semantic analysis to build the new statement. 1318 /// Subclasses may override this routine to provide different behavior. 1319 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1320 LabelDecl *Label) { 1321 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1322 } 1323 1324 /// Build a new indirect goto statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1329 SourceLocation StarLoc, 1330 Expr *Target) { 1331 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1332 } 1333 1334 /// Build a new return statement. 1335 /// 1336 /// By default, performs semantic analysis to build the new statement. 1337 /// Subclasses may override this routine to provide different behavior. 1338 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1339 return getSema().BuildReturnStmt(ReturnLoc, Result); 1340 } 1341 1342 /// Build a new declaration statement. 1343 /// 1344 /// By default, performs semantic analysis to build the new statement. 1345 /// Subclasses may override this routine to provide different behavior. 1346 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1347 SourceLocation StartLoc, SourceLocation EndLoc) { 1348 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1349 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1350 } 1351 1352 /// Build a new inline asm statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1357 bool IsVolatile, unsigned NumOutputs, 1358 unsigned NumInputs, IdentifierInfo **Names, 1359 MultiExprArg Constraints, MultiExprArg Exprs, 1360 Expr *AsmString, MultiExprArg Clobbers, 1361 SourceLocation RParenLoc) { 1362 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1363 NumInputs, Names, Constraints, Exprs, 1364 AsmString, Clobbers, RParenLoc); 1365 } 1366 1367 /// Build a new MS style inline asm statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1372 ArrayRef<Token> AsmToks, 1373 StringRef AsmString, 1374 unsigned NumOutputs, unsigned NumInputs, 1375 ArrayRef<StringRef> Constraints, 1376 ArrayRef<StringRef> Clobbers, 1377 ArrayRef<Expr*> Exprs, 1378 SourceLocation EndLoc) { 1379 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1380 NumOutputs, NumInputs, 1381 Constraints, Clobbers, Exprs, EndLoc); 1382 } 1383 1384 /// Build a new co_return statement. 1385 /// 1386 /// By default, performs semantic analysis to build the new statement. 1387 /// Subclasses may override this routine to provide different behavior. 1388 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1389 bool IsImplicit) { 1390 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1391 } 1392 1393 /// Build a new co_await expression. 1394 /// 1395 /// By default, performs semantic analysis to build the new expression. 1396 /// Subclasses may override this routine to provide different behavior. 1397 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1398 bool IsImplicit) { 1399 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1400 } 1401 1402 /// Build a new co_await expression. 1403 /// 1404 /// By default, performs semantic analysis to build the new expression. 1405 /// Subclasses may override this routine to provide different behavior. 1406 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1407 Expr *Result, 1408 UnresolvedLookupExpr *Lookup) { 1409 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1410 } 1411 1412 /// Build a new co_yield expression. 1413 /// 1414 /// By default, performs semantic analysis to build the new expression. 1415 /// Subclasses may override this routine to provide different behavior. 1416 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1417 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1418 } 1419 1420 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1421 return getSema().BuildCoroutineBodyStmt(Args); 1422 } 1423 1424 /// Build a new Objective-C \@try statement. 1425 /// 1426 /// By default, performs semantic analysis to build the new statement. 1427 /// Subclasses may override this routine to provide different behavior. 1428 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1429 Stmt *TryBody, 1430 MultiStmtArg CatchStmts, 1431 Stmt *Finally) { 1432 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1433 Finally); 1434 } 1435 1436 /// Rebuild an Objective-C exception declaration. 1437 /// 1438 /// By default, performs semantic analysis to build the new declaration. 1439 /// Subclasses may override this routine to provide different behavior. 1440 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1441 TypeSourceInfo *TInfo, QualType T) { 1442 return getSema().BuildObjCExceptionDecl(TInfo, T, 1443 ExceptionDecl->getInnerLocStart(), 1444 ExceptionDecl->getLocation(), 1445 ExceptionDecl->getIdentifier()); 1446 } 1447 1448 /// Build a new Objective-C \@catch statement. 1449 /// 1450 /// By default, performs semantic analysis to build the new statement. 1451 /// Subclasses may override this routine to provide different behavior. 1452 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1453 SourceLocation RParenLoc, 1454 VarDecl *Var, 1455 Stmt *Body) { 1456 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1457 Var, Body); 1458 } 1459 1460 /// Build a new Objective-C \@finally statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1465 Stmt *Body) { 1466 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1467 } 1468 1469 /// Build a new Objective-C \@throw statement. 1470 /// 1471 /// By default, performs semantic analysis to build the new statement. 1472 /// Subclasses may override this routine to provide different behavior. 1473 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1474 Expr *Operand) { 1475 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1476 } 1477 1478 /// Build a new OpenMP executable directive. 1479 /// 1480 /// By default, performs semantic analysis to build the new statement. 1481 /// Subclasses may override this routine to provide different behavior. 1482 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1483 DeclarationNameInfo DirName, 1484 OpenMPDirectiveKind CancelRegion, 1485 ArrayRef<OMPClause *> Clauses, 1486 Stmt *AStmt, SourceLocation StartLoc, 1487 SourceLocation EndLoc) { 1488 return getSema().ActOnOpenMPExecutableDirective( 1489 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1490 } 1491 1492 /// Build a new OpenMP 'if' clause. 1493 /// 1494 /// By default, performs semantic analysis to build the new OpenMP clause. 1495 /// Subclasses may override this routine to provide different behavior. 1496 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1497 Expr *Condition, SourceLocation StartLoc, 1498 SourceLocation LParenLoc, 1499 SourceLocation NameModifierLoc, 1500 SourceLocation ColonLoc, 1501 SourceLocation EndLoc) { 1502 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1503 LParenLoc, NameModifierLoc, ColonLoc, 1504 EndLoc); 1505 } 1506 1507 /// Build a new OpenMP 'final' clause. 1508 /// 1509 /// By default, performs semantic analysis to build the new OpenMP clause. 1510 /// Subclasses may override this routine to provide different behavior. 1511 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1512 SourceLocation LParenLoc, 1513 SourceLocation EndLoc) { 1514 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1515 EndLoc); 1516 } 1517 1518 /// Build a new OpenMP 'num_threads' clause. 1519 /// 1520 /// By default, performs semantic analysis to build the new OpenMP clause. 1521 /// Subclasses may override this routine to provide different behavior. 1522 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1523 SourceLocation StartLoc, 1524 SourceLocation LParenLoc, 1525 SourceLocation EndLoc) { 1526 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1527 LParenLoc, EndLoc); 1528 } 1529 1530 /// Build a new OpenMP 'safelen' clause. 1531 /// 1532 /// By default, performs semantic analysis to build the new OpenMP clause. 1533 /// Subclasses may override this routine to provide different behavior. 1534 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1535 SourceLocation LParenLoc, 1536 SourceLocation EndLoc) { 1537 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1538 } 1539 1540 /// Build a new OpenMP 'simdlen' clause. 1541 /// 1542 /// By default, performs semantic analysis to build the new OpenMP clause. 1543 /// Subclasses may override this routine to provide different behavior. 1544 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1545 SourceLocation LParenLoc, 1546 SourceLocation EndLoc) { 1547 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1548 } 1549 1550 /// Build a new OpenMP 'collapse' clause. 1551 /// 1552 /// By default, performs semantic analysis to build the new OpenMP clause. 1553 /// Subclasses may override this routine to provide different behavior. 1554 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1555 SourceLocation LParenLoc, 1556 SourceLocation EndLoc) { 1557 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1558 EndLoc); 1559 } 1560 1561 /// Build a new OpenMP 'default' clause. 1562 /// 1563 /// By default, performs semantic analysis to build the new OpenMP clause. 1564 /// Subclasses may override this routine to provide different behavior. 1565 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1566 SourceLocation KindKwLoc, 1567 SourceLocation StartLoc, 1568 SourceLocation LParenLoc, 1569 SourceLocation EndLoc) { 1570 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1571 StartLoc, LParenLoc, EndLoc); 1572 } 1573 1574 /// Build a new OpenMP 'proc_bind' clause. 1575 /// 1576 /// By default, performs semantic analysis to build the new OpenMP clause. 1577 /// Subclasses may override this routine to provide different behavior. 1578 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1579 SourceLocation KindKwLoc, 1580 SourceLocation StartLoc, 1581 SourceLocation LParenLoc, 1582 SourceLocation EndLoc) { 1583 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1584 StartLoc, LParenLoc, EndLoc); 1585 } 1586 1587 /// Build a new OpenMP 'schedule' clause. 1588 /// 1589 /// By default, performs semantic analysis to build the new OpenMP clause. 1590 /// Subclasses may override this routine to provide different behavior. 1591 OMPClause *RebuildOMPScheduleClause( 1592 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1593 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1594 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1595 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1596 return getSema().ActOnOpenMPScheduleClause( 1597 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1598 CommaLoc, EndLoc); 1599 } 1600 1601 /// Build a new OpenMP 'ordered' clause. 1602 /// 1603 /// By default, performs semantic analysis to build the new OpenMP clause. 1604 /// Subclasses may override this routine to provide different behavior. 1605 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1606 SourceLocation EndLoc, 1607 SourceLocation LParenLoc, Expr *Num) { 1608 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1609 } 1610 1611 /// Build a new OpenMP 'private' clause. 1612 /// 1613 /// By default, performs semantic analysis to build the new OpenMP clause. 1614 /// Subclasses may override this routine to provide different behavior. 1615 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1616 SourceLocation StartLoc, 1617 SourceLocation LParenLoc, 1618 SourceLocation EndLoc) { 1619 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1620 EndLoc); 1621 } 1622 1623 /// Build a new OpenMP 'firstprivate' clause. 1624 /// 1625 /// By default, performs semantic analysis to build the new OpenMP clause. 1626 /// Subclasses may override this routine to provide different behavior. 1627 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1628 SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1632 EndLoc); 1633 } 1634 1635 /// Build a new OpenMP 'lastprivate' clause. 1636 /// 1637 /// By default, performs semantic analysis to build the new OpenMP clause. 1638 /// Subclasses may override this routine to provide different behavior. 1639 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1640 SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1644 EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'shared' clause. 1648 /// 1649 /// By default, performs semantic analysis to build the new OpenMP clause. 1650 /// Subclasses may override this routine to provide different behavior. 1651 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1652 SourceLocation StartLoc, 1653 SourceLocation LParenLoc, 1654 SourceLocation EndLoc) { 1655 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1656 EndLoc); 1657 } 1658 1659 /// Build a new OpenMP 'reduction' clause. 1660 /// 1661 /// By default, performs semantic analysis to build the new statement. 1662 /// Subclasses may override this routine to provide different behavior. 1663 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1664 SourceLocation StartLoc, 1665 SourceLocation LParenLoc, 1666 SourceLocation ColonLoc, 1667 SourceLocation EndLoc, 1668 CXXScopeSpec &ReductionIdScopeSpec, 1669 const DeclarationNameInfo &ReductionId, 1670 ArrayRef<Expr *> UnresolvedReductions) { 1671 return getSema().ActOnOpenMPReductionClause( 1672 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1673 ReductionId, UnresolvedReductions); 1674 } 1675 1676 /// Build a new OpenMP 'task_reduction' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new statement. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPTaskReductionClause( 1681 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1682 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1683 CXXScopeSpec &ReductionIdScopeSpec, 1684 const DeclarationNameInfo &ReductionId, 1685 ArrayRef<Expr *> UnresolvedReductions) { 1686 return getSema().ActOnOpenMPTaskReductionClause( 1687 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1688 ReductionId, UnresolvedReductions); 1689 } 1690 1691 /// Build a new OpenMP 'in_reduction' clause. 1692 /// 1693 /// By default, performs semantic analysis to build the new statement. 1694 /// Subclasses may override this routine to provide different behavior. 1695 OMPClause * 1696 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1697 SourceLocation LParenLoc, SourceLocation ColonLoc, 1698 SourceLocation EndLoc, 1699 CXXScopeSpec &ReductionIdScopeSpec, 1700 const DeclarationNameInfo &ReductionId, 1701 ArrayRef<Expr *> UnresolvedReductions) { 1702 return getSema().ActOnOpenMPInReductionClause( 1703 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1704 ReductionId, UnresolvedReductions); 1705 } 1706 1707 /// Build a new OpenMP 'linear' clause. 1708 /// 1709 /// By default, performs semantic analysis to build the new OpenMP clause. 1710 /// Subclasses may override this routine to provide different behavior. 1711 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1712 SourceLocation StartLoc, 1713 SourceLocation LParenLoc, 1714 OpenMPLinearClauseKind Modifier, 1715 SourceLocation ModifierLoc, 1716 SourceLocation ColonLoc, 1717 SourceLocation EndLoc) { 1718 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1719 Modifier, ModifierLoc, ColonLoc, 1720 EndLoc); 1721 } 1722 1723 /// Build a new OpenMP 'aligned' clause. 1724 /// 1725 /// By default, performs semantic analysis to build the new OpenMP clause. 1726 /// Subclasses may override this routine to provide different behavior. 1727 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1728 SourceLocation StartLoc, 1729 SourceLocation LParenLoc, 1730 SourceLocation ColonLoc, 1731 SourceLocation EndLoc) { 1732 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1733 LParenLoc, ColonLoc, EndLoc); 1734 } 1735 1736 /// Build a new OpenMP 'copyin' clause. 1737 /// 1738 /// By default, performs semantic analysis to build the new OpenMP clause. 1739 /// Subclasses may override this routine to provide different behavior. 1740 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1741 SourceLocation StartLoc, 1742 SourceLocation LParenLoc, 1743 SourceLocation EndLoc) { 1744 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1745 EndLoc); 1746 } 1747 1748 /// Build a new OpenMP 'copyprivate' clause. 1749 /// 1750 /// By default, performs semantic analysis to build the new OpenMP clause. 1751 /// Subclasses may override this routine to provide different behavior. 1752 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1753 SourceLocation StartLoc, 1754 SourceLocation LParenLoc, 1755 SourceLocation EndLoc) { 1756 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1757 EndLoc); 1758 } 1759 1760 /// Build a new OpenMP 'flush' pseudo clause. 1761 /// 1762 /// By default, performs semantic analysis to build the new OpenMP clause. 1763 /// Subclasses may override this routine to provide different behavior. 1764 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1765 SourceLocation StartLoc, 1766 SourceLocation LParenLoc, 1767 SourceLocation EndLoc) { 1768 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1769 EndLoc); 1770 } 1771 1772 /// Build a new OpenMP 'depend' pseudo clause. 1773 /// 1774 /// By default, performs semantic analysis to build the new OpenMP clause. 1775 /// Subclasses may override this routine to provide different behavior. 1776 OMPClause * 1777 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1778 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1779 SourceLocation StartLoc, SourceLocation LParenLoc, 1780 SourceLocation EndLoc) { 1781 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1782 StartLoc, LParenLoc, EndLoc); 1783 } 1784 1785 /// Build a new OpenMP 'device' clause. 1786 /// 1787 /// By default, performs semantic analysis to build the new statement. 1788 /// Subclasses may override this routine to provide different behavior. 1789 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1790 SourceLocation LParenLoc, 1791 SourceLocation EndLoc) { 1792 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1793 EndLoc); 1794 } 1795 1796 /// Build a new OpenMP 'map' clause. 1797 /// 1798 /// By default, performs semantic analysis to build the new OpenMP clause. 1799 /// Subclasses may override this routine to provide different behavior. 1800 OMPClause * 1801 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1802 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1803 SourceLocation MapLoc, SourceLocation ColonLoc, 1804 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1805 SourceLocation LParenLoc, SourceLocation EndLoc) { 1806 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1807 IsMapTypeImplicit, MapLoc, ColonLoc, 1808 VarList, StartLoc, LParenLoc, EndLoc); 1809 } 1810 1811 /// Build a new OpenMP 'num_teams' clause. 1812 /// 1813 /// By default, performs semantic analysis to build the new statement. 1814 /// Subclasses may override this routine to provide different behavior. 1815 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1816 SourceLocation LParenLoc, 1817 SourceLocation EndLoc) { 1818 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1819 EndLoc); 1820 } 1821 1822 /// Build a new OpenMP 'thread_limit' clause. 1823 /// 1824 /// By default, performs semantic analysis to build the new statement. 1825 /// Subclasses may override this routine to provide different behavior. 1826 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1827 SourceLocation StartLoc, 1828 SourceLocation LParenLoc, 1829 SourceLocation EndLoc) { 1830 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1831 LParenLoc, EndLoc); 1832 } 1833 1834 /// Build a new OpenMP 'priority' clause. 1835 /// 1836 /// By default, performs semantic analysis to build the new statement. 1837 /// Subclasses may override this routine to provide different behavior. 1838 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'grainsize' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new statement. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1850 SourceLocation LParenLoc, 1851 SourceLocation EndLoc) { 1852 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1853 EndLoc); 1854 } 1855 1856 /// Build a new OpenMP 'num_tasks' clause. 1857 /// 1858 /// By default, performs semantic analysis to build the new statement. 1859 /// Subclasses may override this routine to provide different behavior. 1860 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1861 SourceLocation LParenLoc, 1862 SourceLocation EndLoc) { 1863 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1864 EndLoc); 1865 } 1866 1867 /// Build a new OpenMP 'hint' clause. 1868 /// 1869 /// By default, performs semantic analysis to build the new statement. 1870 /// Subclasses may override this routine to provide different behavior. 1871 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1872 SourceLocation LParenLoc, 1873 SourceLocation EndLoc) { 1874 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1875 } 1876 1877 /// Build a new OpenMP 'dist_schedule' clause. 1878 /// 1879 /// By default, performs semantic analysis to build the new OpenMP clause. 1880 /// Subclasses may override this routine to provide different behavior. 1881 OMPClause * 1882 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1883 Expr *ChunkSize, SourceLocation StartLoc, 1884 SourceLocation LParenLoc, SourceLocation KindLoc, 1885 SourceLocation CommaLoc, SourceLocation EndLoc) { 1886 return getSema().ActOnOpenMPDistScheduleClause( 1887 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1888 } 1889 1890 /// Build a new OpenMP 'to' clause. 1891 /// 1892 /// By default, performs semantic analysis to build the new statement. 1893 /// Subclasses may override this routine to provide different behavior. 1894 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1895 SourceLocation StartLoc, 1896 SourceLocation LParenLoc, 1897 SourceLocation EndLoc) { 1898 return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); 1899 } 1900 1901 /// Build a new OpenMP 'from' clause. 1902 /// 1903 /// By default, performs semantic analysis to build the new statement. 1904 /// Subclasses may override this routine to provide different behavior. 1905 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1906 SourceLocation StartLoc, 1907 SourceLocation LParenLoc, 1908 SourceLocation EndLoc) { 1909 return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, 1910 EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'use_device_ptr' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new OpenMP clause. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1918 SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation EndLoc) { 1921 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc, 1922 EndLoc); 1923 } 1924 1925 /// Build a new OpenMP 'is_device_ptr' clause. 1926 /// 1927 /// By default, performs semantic analysis to build the new OpenMP clause. 1928 /// Subclasses may override this routine to provide different behavior. 1929 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1930 SourceLocation StartLoc, 1931 SourceLocation LParenLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc, 1934 EndLoc); 1935 } 1936 1937 /// Rebuild the operand to an Objective-C \@synchronized statement. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1942 Expr *object) { 1943 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1944 } 1945 1946 /// Build a new Objective-C \@synchronized statement. 1947 /// 1948 /// By default, performs semantic analysis to build the new statement. 1949 /// Subclasses may override this routine to provide different behavior. 1950 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1951 Expr *Object, Stmt *Body) { 1952 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1953 } 1954 1955 /// Build a new Objective-C \@autoreleasepool statement. 1956 /// 1957 /// By default, performs semantic analysis to build the new statement. 1958 /// Subclasses may override this routine to provide different behavior. 1959 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1960 Stmt *Body) { 1961 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1962 } 1963 1964 /// Build a new Objective-C fast enumeration statement. 1965 /// 1966 /// By default, performs semantic analysis to build the new statement. 1967 /// Subclasses may override this routine to provide different behavior. 1968 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1969 Stmt *Element, 1970 Expr *Collection, 1971 SourceLocation RParenLoc, 1972 Stmt *Body) { 1973 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1974 Element, 1975 Collection, 1976 RParenLoc); 1977 if (ForEachStmt.isInvalid()) 1978 return StmtError(); 1979 1980 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1981 } 1982 1983 /// Build a new C++ exception declaration. 1984 /// 1985 /// By default, performs semantic analysis to build the new decaration. 1986 /// Subclasses may override this routine to provide different behavior. 1987 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1988 TypeSourceInfo *Declarator, 1989 SourceLocation StartLoc, 1990 SourceLocation IdLoc, 1991 IdentifierInfo *Id) { 1992 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1993 StartLoc, IdLoc, Id); 1994 if (Var) 1995 getSema().CurContext->addDecl(Var); 1996 return Var; 1997 } 1998 1999 /// Build a new C++ catch statement. 2000 /// 2001 /// By default, performs semantic analysis to build the new statement. 2002 /// Subclasses may override this routine to provide different behavior. 2003 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2004 VarDecl *ExceptionDecl, 2005 Stmt *Handler) { 2006 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2007 Handler)); 2008 } 2009 2010 /// Build a new C++ try statement. 2011 /// 2012 /// By default, performs semantic analysis to build the new statement. 2013 /// Subclasses may override this routine to provide different behavior. 2014 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2015 ArrayRef<Stmt *> Handlers) { 2016 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2017 } 2018 2019 /// Build a new C++0x range-based for statement. 2020 /// 2021 /// By default, performs semantic analysis to build the new statement. 2022 /// Subclasses may override this routine to provide different behavior. 2023 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2024 SourceLocation CoawaitLoc, Stmt *Init, 2025 SourceLocation ColonLoc, Stmt *Range, 2026 Stmt *Begin, Stmt *End, Expr *Cond, 2027 Expr *Inc, Stmt *LoopVar, 2028 SourceLocation RParenLoc) { 2029 // If we've just learned that the range is actually an Objective-C 2030 // collection, treat this as an Objective-C fast enumeration loop. 2031 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2032 if (RangeStmt->isSingleDecl()) { 2033 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2034 if (RangeVar->isInvalidDecl()) 2035 return StmtError(); 2036 2037 Expr *RangeExpr = RangeVar->getInit(); 2038 if (!RangeExpr->isTypeDependent() && 2039 RangeExpr->getType()->isObjCObjectPointerType()) { 2040 // FIXME: Support init-statements in Objective-C++20 ranged for 2041 // statement. 2042 if (Init) { 2043 return SemaRef.Diag(Init->getBeginLoc(), 2044 diag::err_objc_for_range_init_stmt) 2045 << Init->getSourceRange(); 2046 } 2047 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2048 RangeExpr, RParenLoc); 2049 } 2050 } 2051 } 2052 } 2053 2054 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2055 Range, Begin, End, Cond, Inc, LoopVar, 2056 RParenLoc, Sema::BFRK_Rebuild); 2057 } 2058 2059 /// Build a new C++0x range-based for statement. 2060 /// 2061 /// By default, performs semantic analysis to build the new statement. 2062 /// Subclasses may override this routine to provide different behavior. 2063 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2064 bool IsIfExists, 2065 NestedNameSpecifierLoc QualifierLoc, 2066 DeclarationNameInfo NameInfo, 2067 Stmt *Nested) { 2068 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2069 QualifierLoc, NameInfo, Nested); 2070 } 2071 2072 /// Attach body to a C++0x range-based for statement. 2073 /// 2074 /// By default, performs semantic analysis to finish the new statement. 2075 /// Subclasses may override this routine to provide different behavior. 2076 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2077 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2078 } 2079 2080 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2081 Stmt *TryBlock, Stmt *Handler) { 2082 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2083 } 2084 2085 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2086 Stmt *Block) { 2087 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2088 } 2089 2090 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2091 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2092 } 2093 2094 /// Build a new predefined expression. 2095 /// 2096 /// By default, performs semantic analysis to build the new expression. 2097 /// Subclasses may override this routine to provide different behavior. 2098 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2099 PredefinedExpr::IdentKind IK) { 2100 return getSema().BuildPredefinedExpr(Loc, IK); 2101 } 2102 2103 /// Build a new expression that references a declaration. 2104 /// 2105 /// By default, performs semantic analysis to build the new expression. 2106 /// Subclasses may override this routine to provide different behavior. 2107 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2108 LookupResult &R, 2109 bool RequiresADL) { 2110 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2111 } 2112 2113 2114 /// Build a new expression that references a declaration. 2115 /// 2116 /// By default, performs semantic analysis to build the new expression. 2117 /// Subclasses may override this routine to provide different behavior. 2118 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2119 ValueDecl *VD, 2120 const DeclarationNameInfo &NameInfo, 2121 TemplateArgumentListInfo *TemplateArgs) { 2122 CXXScopeSpec SS; 2123 SS.Adopt(QualifierLoc); 2124 2125 // FIXME: loses template args. 2126 2127 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2128 } 2129 2130 /// Build a new expression in parentheses. 2131 /// 2132 /// By default, performs semantic analysis to build the new expression. 2133 /// Subclasses may override this routine to provide different behavior. 2134 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2135 SourceLocation RParen) { 2136 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2137 } 2138 2139 /// Build a new pseudo-destructor expression. 2140 /// 2141 /// By default, performs semantic analysis to build the new expression. 2142 /// Subclasses may override this routine to provide different behavior. 2143 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2144 SourceLocation OperatorLoc, 2145 bool isArrow, 2146 CXXScopeSpec &SS, 2147 TypeSourceInfo *ScopeType, 2148 SourceLocation CCLoc, 2149 SourceLocation TildeLoc, 2150 PseudoDestructorTypeStorage Destroyed); 2151 2152 /// Build a new unary operator expression. 2153 /// 2154 /// By default, performs semantic analysis to build the new expression. 2155 /// Subclasses may override this routine to provide different behavior. 2156 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2157 UnaryOperatorKind Opc, 2158 Expr *SubExpr) { 2159 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2160 } 2161 2162 /// Build a new builtin offsetof expression. 2163 /// 2164 /// By default, performs semantic analysis to build the new expression. 2165 /// Subclasses may override this routine to provide different behavior. 2166 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2167 TypeSourceInfo *Type, 2168 ArrayRef<Sema::OffsetOfComponent> Components, 2169 SourceLocation RParenLoc) { 2170 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2171 RParenLoc); 2172 } 2173 2174 /// Build a new sizeof, alignof or vec_step expression with a 2175 /// type argument. 2176 /// 2177 /// By default, performs semantic analysis to build the new expression. 2178 /// Subclasses may override this routine to provide different behavior. 2179 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2180 SourceLocation OpLoc, 2181 UnaryExprOrTypeTrait ExprKind, 2182 SourceRange R) { 2183 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2184 } 2185 2186 /// Build a new sizeof, alignof or vec step expression with an 2187 /// expression argument. 2188 /// 2189 /// By default, performs semantic analysis to build the new expression. 2190 /// Subclasses may override this routine to provide different behavior. 2191 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2192 UnaryExprOrTypeTrait ExprKind, 2193 SourceRange R) { 2194 ExprResult Result 2195 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2196 if (Result.isInvalid()) 2197 return ExprError(); 2198 2199 return Result; 2200 } 2201 2202 /// Build a new array subscript expression. 2203 /// 2204 /// By default, performs semantic analysis to build the new expression. 2205 /// Subclasses may override this routine to provide different behavior. 2206 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2207 SourceLocation LBracketLoc, 2208 Expr *RHS, 2209 SourceLocation RBracketLoc) { 2210 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2211 LBracketLoc, RHS, 2212 RBracketLoc); 2213 } 2214 2215 /// Build a new array section expression. 2216 /// 2217 /// By default, performs semantic analysis to build the new expression. 2218 /// Subclasses may override this routine to provide different behavior. 2219 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2220 Expr *LowerBound, 2221 SourceLocation ColonLoc, Expr *Length, 2222 SourceLocation RBracketLoc) { 2223 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2224 ColonLoc, Length, RBracketLoc); 2225 } 2226 2227 /// Build a new call expression. 2228 /// 2229 /// By default, performs semantic analysis to build the new expression. 2230 /// Subclasses may override this routine to provide different behavior. 2231 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2232 MultiExprArg Args, 2233 SourceLocation RParenLoc, 2234 Expr *ExecConfig = nullptr) { 2235 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2236 Args, RParenLoc, ExecConfig); 2237 } 2238 2239 /// Build a new member access expression. 2240 /// 2241 /// By default, performs semantic analysis to build the new expression. 2242 /// Subclasses may override this routine to provide different behavior. 2243 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2244 bool isArrow, 2245 NestedNameSpecifierLoc QualifierLoc, 2246 SourceLocation TemplateKWLoc, 2247 const DeclarationNameInfo &MemberNameInfo, 2248 ValueDecl *Member, 2249 NamedDecl *FoundDecl, 2250 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2251 NamedDecl *FirstQualifierInScope) { 2252 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2253 isArrow); 2254 if (!Member->getDeclName()) { 2255 // We have a reference to an unnamed field. This is always the 2256 // base of an anonymous struct/union member access, i.e. the 2257 // field is always of record type. 2258 assert(Member->getType()->isRecordType() && 2259 "unnamed member not of record type?"); 2260 2261 BaseResult = 2262 getSema().PerformObjectMemberConversion(BaseResult.get(), 2263 QualifierLoc.getNestedNameSpecifier(), 2264 FoundDecl, Member); 2265 if (BaseResult.isInvalid()) 2266 return ExprError(); 2267 Base = BaseResult.get(); 2268 2269 CXXScopeSpec EmptySS; 2270 return getSema().BuildFieldReferenceExpr( 2271 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2272 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2273 } 2274 2275 CXXScopeSpec SS; 2276 SS.Adopt(QualifierLoc); 2277 2278 Base = BaseResult.get(); 2279 QualType BaseType = Base->getType(); 2280 2281 if (isArrow && !BaseType->isPointerType()) 2282 return ExprError(); 2283 2284 // FIXME: this involves duplicating earlier analysis in a lot of 2285 // cases; we should avoid this when possible. 2286 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2287 R.addDecl(FoundDecl); 2288 R.resolveKind(); 2289 2290 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2291 SS, TemplateKWLoc, 2292 FirstQualifierInScope, 2293 R, ExplicitTemplateArgs, 2294 /*S*/nullptr); 2295 } 2296 2297 /// Build a new binary operator expression. 2298 /// 2299 /// By default, performs semantic analysis to build the new expression. 2300 /// Subclasses may override this routine to provide different behavior. 2301 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2302 BinaryOperatorKind Opc, 2303 Expr *LHS, Expr *RHS) { 2304 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2305 } 2306 2307 /// Build a new conditional operator expression. 2308 /// 2309 /// By default, performs semantic analysis to build the new expression. 2310 /// Subclasses may override this routine to provide different behavior. 2311 ExprResult RebuildConditionalOperator(Expr *Cond, 2312 SourceLocation QuestionLoc, 2313 Expr *LHS, 2314 SourceLocation ColonLoc, 2315 Expr *RHS) { 2316 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2317 LHS, RHS); 2318 } 2319 2320 /// Build a new C-style cast expression. 2321 /// 2322 /// By default, performs semantic analysis to build the new expression. 2323 /// Subclasses may override this routine to provide different behavior. 2324 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2325 TypeSourceInfo *TInfo, 2326 SourceLocation RParenLoc, 2327 Expr *SubExpr) { 2328 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2329 SubExpr); 2330 } 2331 2332 /// Build a new compound literal expression. 2333 /// 2334 /// By default, performs semantic analysis to build the new expression. 2335 /// Subclasses may override this routine to provide different behavior. 2336 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2337 TypeSourceInfo *TInfo, 2338 SourceLocation RParenLoc, 2339 Expr *Init) { 2340 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2341 Init); 2342 } 2343 2344 /// Build a new extended vector element access expression. 2345 /// 2346 /// By default, performs semantic analysis to build the new expression. 2347 /// Subclasses may override this routine to provide different behavior. 2348 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2349 SourceLocation OpLoc, 2350 SourceLocation AccessorLoc, 2351 IdentifierInfo &Accessor) { 2352 2353 CXXScopeSpec SS; 2354 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2355 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2356 OpLoc, /*IsArrow*/ false, 2357 SS, SourceLocation(), 2358 /*FirstQualifierInScope*/ nullptr, 2359 NameInfo, 2360 /* TemplateArgs */ nullptr, 2361 /*S*/ nullptr); 2362 } 2363 2364 /// Build a new initializer list expression. 2365 /// 2366 /// By default, performs semantic analysis to build the new expression. 2367 /// Subclasses may override this routine to provide different behavior. 2368 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2369 MultiExprArg Inits, 2370 SourceLocation RBraceLoc) { 2371 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2372 } 2373 2374 /// Build a new designated initializer expression. 2375 /// 2376 /// By default, performs semantic analysis to build the new expression. 2377 /// Subclasses may override this routine to provide different behavior. 2378 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2379 MultiExprArg ArrayExprs, 2380 SourceLocation EqualOrColonLoc, 2381 bool GNUSyntax, 2382 Expr *Init) { 2383 ExprResult Result 2384 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2385 Init); 2386 if (Result.isInvalid()) 2387 return ExprError(); 2388 2389 return Result; 2390 } 2391 2392 /// Build a new value-initialized expression. 2393 /// 2394 /// By default, builds the implicit value initialization without performing 2395 /// any semantic analysis. Subclasses may override this routine to provide 2396 /// different behavior. 2397 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2398 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2399 } 2400 2401 /// Build a new \c va_arg expression. 2402 /// 2403 /// By default, performs semantic analysis to build the new expression. 2404 /// Subclasses may override this routine to provide different behavior. 2405 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2406 Expr *SubExpr, TypeSourceInfo *TInfo, 2407 SourceLocation RParenLoc) { 2408 return getSema().BuildVAArgExpr(BuiltinLoc, 2409 SubExpr, TInfo, 2410 RParenLoc); 2411 } 2412 2413 /// Build a new expression list in parentheses. 2414 /// 2415 /// By default, performs semantic analysis to build the new expression. 2416 /// Subclasses may override this routine to provide different behavior. 2417 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2418 MultiExprArg SubExprs, 2419 SourceLocation RParenLoc) { 2420 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2421 } 2422 2423 /// Build a new address-of-label expression. 2424 /// 2425 /// By default, performs semantic analysis, using the name of the label 2426 /// rather than attempting to map the label statement itself. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2429 SourceLocation LabelLoc, LabelDecl *Label) { 2430 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2431 } 2432 2433 /// Build a new GNU statement expression. 2434 /// 2435 /// By default, performs semantic analysis to build the new expression. 2436 /// Subclasses may override this routine to provide different behavior. 2437 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2438 Stmt *SubStmt, 2439 SourceLocation RParenLoc) { 2440 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2441 } 2442 2443 /// Build a new __builtin_choose_expr expression. 2444 /// 2445 /// By default, performs semantic analysis to build the new expression. 2446 /// Subclasses may override this routine to provide different behavior. 2447 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2448 Expr *Cond, Expr *LHS, Expr *RHS, 2449 SourceLocation RParenLoc) { 2450 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2451 Cond, LHS, RHS, 2452 RParenLoc); 2453 } 2454 2455 /// Build a new generic selection expression. 2456 /// 2457 /// By default, performs semantic analysis to build the new expression. 2458 /// Subclasses may override this routine to provide different behavior. 2459 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2460 SourceLocation DefaultLoc, 2461 SourceLocation RParenLoc, 2462 Expr *ControllingExpr, 2463 ArrayRef<TypeSourceInfo *> Types, 2464 ArrayRef<Expr *> Exprs) { 2465 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2466 ControllingExpr, Types, Exprs); 2467 } 2468 2469 /// Build a new overloaded operator call expression. 2470 /// 2471 /// By default, performs semantic analysis to build the new expression. 2472 /// The semantic analysis provides the behavior of template instantiation, 2473 /// copying with transformations that turn what looks like an overloaded 2474 /// operator call into a use of a builtin operator, performing 2475 /// argument-dependent lookup, etc. Subclasses may override this routine to 2476 /// provide different behavior. 2477 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2478 SourceLocation OpLoc, 2479 Expr *Callee, 2480 Expr *First, 2481 Expr *Second); 2482 2483 /// Build a new C++ "named" cast expression, such as static_cast or 2484 /// reinterpret_cast. 2485 /// 2486 /// By default, this routine dispatches to one of the more-specific routines 2487 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2488 /// Subclasses may override this routine to provide different behavior. 2489 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2490 Stmt::StmtClass Class, 2491 SourceLocation LAngleLoc, 2492 TypeSourceInfo *TInfo, 2493 SourceLocation RAngleLoc, 2494 SourceLocation LParenLoc, 2495 Expr *SubExpr, 2496 SourceLocation RParenLoc) { 2497 switch (Class) { 2498 case Stmt::CXXStaticCastExprClass: 2499 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2500 RAngleLoc, LParenLoc, 2501 SubExpr, RParenLoc); 2502 2503 case Stmt::CXXDynamicCastExprClass: 2504 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2505 RAngleLoc, LParenLoc, 2506 SubExpr, RParenLoc); 2507 2508 case Stmt::CXXReinterpretCastExprClass: 2509 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2510 RAngleLoc, LParenLoc, 2511 SubExpr, 2512 RParenLoc); 2513 2514 case Stmt::CXXConstCastExprClass: 2515 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2516 RAngleLoc, LParenLoc, 2517 SubExpr, RParenLoc); 2518 2519 default: 2520 llvm_unreachable("Invalid C++ named cast"); 2521 } 2522 } 2523 2524 /// Build a new C++ static_cast expression. 2525 /// 2526 /// By default, performs semantic analysis to build the new expression. 2527 /// Subclasses may override this routine to provide different behavior. 2528 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2529 SourceLocation LAngleLoc, 2530 TypeSourceInfo *TInfo, 2531 SourceLocation RAngleLoc, 2532 SourceLocation LParenLoc, 2533 Expr *SubExpr, 2534 SourceLocation RParenLoc) { 2535 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2536 TInfo, SubExpr, 2537 SourceRange(LAngleLoc, RAngleLoc), 2538 SourceRange(LParenLoc, RParenLoc)); 2539 } 2540 2541 /// Build a new C++ dynamic_cast expression. 2542 /// 2543 /// By default, performs semantic analysis to build the new expression. 2544 /// Subclasses may override this routine to provide different behavior. 2545 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2546 SourceLocation LAngleLoc, 2547 TypeSourceInfo *TInfo, 2548 SourceLocation RAngleLoc, 2549 SourceLocation LParenLoc, 2550 Expr *SubExpr, 2551 SourceLocation RParenLoc) { 2552 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2553 TInfo, SubExpr, 2554 SourceRange(LAngleLoc, RAngleLoc), 2555 SourceRange(LParenLoc, RParenLoc)); 2556 } 2557 2558 /// Build a new C++ reinterpret_cast expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2563 SourceLocation LAngleLoc, 2564 TypeSourceInfo *TInfo, 2565 SourceLocation RAngleLoc, 2566 SourceLocation LParenLoc, 2567 Expr *SubExpr, 2568 SourceLocation RParenLoc) { 2569 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2570 TInfo, SubExpr, 2571 SourceRange(LAngleLoc, RAngleLoc), 2572 SourceRange(LParenLoc, RParenLoc)); 2573 } 2574 2575 /// Build a new C++ const_cast expression. 2576 /// 2577 /// By default, performs semantic analysis to build the new expression. 2578 /// Subclasses may override this routine to provide different behavior. 2579 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2580 SourceLocation LAngleLoc, 2581 TypeSourceInfo *TInfo, 2582 SourceLocation RAngleLoc, 2583 SourceLocation LParenLoc, 2584 Expr *SubExpr, 2585 SourceLocation RParenLoc) { 2586 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2587 TInfo, SubExpr, 2588 SourceRange(LAngleLoc, RAngleLoc), 2589 SourceRange(LParenLoc, RParenLoc)); 2590 } 2591 2592 /// Build a new C++ functional-style cast expression. 2593 /// 2594 /// By default, performs semantic analysis to build the new expression. 2595 /// Subclasses may override this routine to provide different behavior. 2596 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2597 SourceLocation LParenLoc, 2598 Expr *Sub, 2599 SourceLocation RParenLoc, 2600 bool ListInitialization) { 2601 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2602 MultiExprArg(&Sub, 1), RParenLoc, 2603 ListInitialization); 2604 } 2605 2606 /// Build a new C++ typeid(type) expression. 2607 /// 2608 /// By default, performs semantic analysis to build the new expression. 2609 /// Subclasses may override this routine to provide different behavior. 2610 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2611 SourceLocation TypeidLoc, 2612 TypeSourceInfo *Operand, 2613 SourceLocation RParenLoc) { 2614 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2615 RParenLoc); 2616 } 2617 2618 2619 /// Build a new C++ typeid(expr) expression. 2620 /// 2621 /// By default, performs semantic analysis to build the new expression. 2622 /// Subclasses may override this routine to provide different behavior. 2623 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2624 SourceLocation TypeidLoc, 2625 Expr *Operand, 2626 SourceLocation RParenLoc) { 2627 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2628 RParenLoc); 2629 } 2630 2631 /// Build a new C++ __uuidof(type) expression. 2632 /// 2633 /// By default, performs semantic analysis to build the new expression. 2634 /// Subclasses may override this routine to provide different behavior. 2635 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2636 SourceLocation TypeidLoc, 2637 TypeSourceInfo *Operand, 2638 SourceLocation RParenLoc) { 2639 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2640 RParenLoc); 2641 } 2642 2643 /// Build a new C++ __uuidof(expr) expression. 2644 /// 2645 /// By default, performs semantic analysis to build the new expression. 2646 /// Subclasses may override this routine to provide different behavior. 2647 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2648 SourceLocation TypeidLoc, 2649 Expr *Operand, 2650 SourceLocation RParenLoc) { 2651 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2652 RParenLoc); 2653 } 2654 2655 /// Build a new C++ "this" expression. 2656 /// 2657 /// By default, builds a new "this" expression without performing any 2658 /// semantic analysis. Subclasses may override this routine to provide 2659 /// different behavior. 2660 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2661 QualType ThisType, 2662 bool isImplicit) { 2663 getSema().CheckCXXThisCapture(ThisLoc); 2664 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2665 } 2666 2667 /// Build a new C++ throw expression. 2668 /// 2669 /// By default, performs semantic analysis to build the new expression. 2670 /// Subclasses may override this routine to provide different behavior. 2671 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2672 bool IsThrownVariableInScope) { 2673 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2674 } 2675 2676 /// Build a new C++ default-argument expression. 2677 /// 2678 /// By default, builds a new default-argument expression, which does not 2679 /// require any semantic analysis. Subclasses may override this routine to 2680 /// provide different behavior. 2681 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2682 ParmVarDecl *Param) { 2683 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2684 } 2685 2686 /// Build a new C++11 default-initialization expression. 2687 /// 2688 /// By default, builds a new default field initialization expression, which 2689 /// does not require any semantic analysis. Subclasses may override this 2690 /// routine to provide different behavior. 2691 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2692 FieldDecl *Field) { 2693 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2694 } 2695 2696 /// Build a new C++ zero-initialization expression. 2697 /// 2698 /// By default, performs semantic analysis to build the new expression. 2699 /// Subclasses may override this routine to provide different behavior. 2700 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2701 SourceLocation LParenLoc, 2702 SourceLocation RParenLoc) { 2703 return getSema().BuildCXXTypeConstructExpr( 2704 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2705 } 2706 2707 /// Build a new C++ "new" expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2712 bool UseGlobal, 2713 SourceLocation PlacementLParen, 2714 MultiExprArg PlacementArgs, 2715 SourceLocation PlacementRParen, 2716 SourceRange TypeIdParens, 2717 QualType AllocatedType, 2718 TypeSourceInfo *AllocatedTypeInfo, 2719 Expr *ArraySize, 2720 SourceRange DirectInitRange, 2721 Expr *Initializer) { 2722 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2723 PlacementLParen, 2724 PlacementArgs, 2725 PlacementRParen, 2726 TypeIdParens, 2727 AllocatedType, 2728 AllocatedTypeInfo, 2729 ArraySize, 2730 DirectInitRange, 2731 Initializer); 2732 } 2733 2734 /// Build a new C++ "delete" expression. 2735 /// 2736 /// By default, performs semantic analysis to build the new expression. 2737 /// Subclasses may override this routine to provide different behavior. 2738 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2739 bool IsGlobalDelete, 2740 bool IsArrayForm, 2741 Expr *Operand) { 2742 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2743 Operand); 2744 } 2745 2746 /// Build a new type trait expression. 2747 /// 2748 /// By default, performs semantic analysis to build the new expression. 2749 /// Subclasses may override this routine to provide different behavior. 2750 ExprResult RebuildTypeTrait(TypeTrait Trait, 2751 SourceLocation StartLoc, 2752 ArrayRef<TypeSourceInfo *> Args, 2753 SourceLocation RParenLoc) { 2754 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2755 } 2756 2757 /// Build a new array type trait expression. 2758 /// 2759 /// By default, performs semantic analysis to build the new expression. 2760 /// Subclasses may override this routine to provide different behavior. 2761 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2762 SourceLocation StartLoc, 2763 TypeSourceInfo *TSInfo, 2764 Expr *DimExpr, 2765 SourceLocation RParenLoc) { 2766 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2767 } 2768 2769 /// Build a new expression trait expression. 2770 /// 2771 /// By default, performs semantic analysis to build the new expression. 2772 /// Subclasses may override this routine to provide different behavior. 2773 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2774 SourceLocation StartLoc, 2775 Expr *Queried, 2776 SourceLocation RParenLoc) { 2777 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2778 } 2779 2780 /// Build a new (previously unresolved) declaration reference 2781 /// expression. 2782 /// 2783 /// By default, performs semantic analysis to build the new expression. 2784 /// Subclasses may override this routine to provide different behavior. 2785 ExprResult RebuildDependentScopeDeclRefExpr( 2786 NestedNameSpecifierLoc QualifierLoc, 2787 SourceLocation TemplateKWLoc, 2788 const DeclarationNameInfo &NameInfo, 2789 const TemplateArgumentListInfo *TemplateArgs, 2790 bool IsAddressOfOperand, 2791 TypeSourceInfo **RecoveryTSI) { 2792 CXXScopeSpec SS; 2793 SS.Adopt(QualifierLoc); 2794 2795 if (TemplateArgs || TemplateKWLoc.isValid()) 2796 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2797 TemplateArgs); 2798 2799 return getSema().BuildQualifiedDeclarationNameExpr( 2800 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2801 } 2802 2803 /// Build a new template-id expression. 2804 /// 2805 /// By default, performs semantic analysis to build the new expression. 2806 /// Subclasses may override this routine to provide different behavior. 2807 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2808 SourceLocation TemplateKWLoc, 2809 LookupResult &R, 2810 bool RequiresADL, 2811 const TemplateArgumentListInfo *TemplateArgs) { 2812 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2813 TemplateArgs); 2814 } 2815 2816 /// Build a new object-construction expression. 2817 /// 2818 /// By default, performs semantic analysis to build the new expression. 2819 /// Subclasses may override this routine to provide different behavior. 2820 ExprResult RebuildCXXConstructExpr(QualType T, 2821 SourceLocation Loc, 2822 CXXConstructorDecl *Constructor, 2823 bool IsElidable, 2824 MultiExprArg Args, 2825 bool HadMultipleCandidates, 2826 bool ListInitialization, 2827 bool StdInitListInitialization, 2828 bool RequiresZeroInit, 2829 CXXConstructExpr::ConstructionKind ConstructKind, 2830 SourceRange ParenRange) { 2831 SmallVector<Expr*, 8> ConvertedArgs; 2832 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2833 ConvertedArgs)) 2834 return ExprError(); 2835 2836 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2837 IsElidable, 2838 ConvertedArgs, 2839 HadMultipleCandidates, 2840 ListInitialization, 2841 StdInitListInitialization, 2842 RequiresZeroInit, ConstructKind, 2843 ParenRange); 2844 } 2845 2846 /// Build a new implicit construction via inherited constructor 2847 /// expression. 2848 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2849 CXXConstructorDecl *Constructor, 2850 bool ConstructsVBase, 2851 bool InheritedFromVBase) { 2852 return new (getSema().Context) CXXInheritedCtorInitExpr( 2853 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2854 } 2855 2856 /// Build a new object-construction expression. 2857 /// 2858 /// By default, performs semantic analysis to build the new expression. 2859 /// Subclasses may override this routine to provide different behavior. 2860 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2861 SourceLocation LParenOrBraceLoc, 2862 MultiExprArg Args, 2863 SourceLocation RParenOrBraceLoc, 2864 bool ListInitialization) { 2865 return getSema().BuildCXXTypeConstructExpr( 2866 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2867 } 2868 2869 /// Build a new object-construction expression. 2870 /// 2871 /// By default, performs semantic analysis to build the new expression. 2872 /// Subclasses may override this routine to provide different behavior. 2873 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2874 SourceLocation LParenLoc, 2875 MultiExprArg Args, 2876 SourceLocation RParenLoc, 2877 bool ListInitialization) { 2878 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2879 RParenLoc, ListInitialization); 2880 } 2881 2882 /// Build a new member reference expression. 2883 /// 2884 /// By default, performs semantic analysis to build the new expression. 2885 /// Subclasses may override this routine to provide different behavior. 2886 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2887 QualType BaseType, 2888 bool IsArrow, 2889 SourceLocation OperatorLoc, 2890 NestedNameSpecifierLoc QualifierLoc, 2891 SourceLocation TemplateKWLoc, 2892 NamedDecl *FirstQualifierInScope, 2893 const DeclarationNameInfo &MemberNameInfo, 2894 const TemplateArgumentListInfo *TemplateArgs) { 2895 CXXScopeSpec SS; 2896 SS.Adopt(QualifierLoc); 2897 2898 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2899 OperatorLoc, IsArrow, 2900 SS, TemplateKWLoc, 2901 FirstQualifierInScope, 2902 MemberNameInfo, 2903 TemplateArgs, /*S*/nullptr); 2904 } 2905 2906 /// Build a new member reference expression. 2907 /// 2908 /// By default, performs semantic analysis to build the new expression. 2909 /// Subclasses may override this routine to provide different behavior. 2910 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2911 SourceLocation OperatorLoc, 2912 bool IsArrow, 2913 NestedNameSpecifierLoc QualifierLoc, 2914 SourceLocation TemplateKWLoc, 2915 NamedDecl *FirstQualifierInScope, 2916 LookupResult &R, 2917 const TemplateArgumentListInfo *TemplateArgs) { 2918 CXXScopeSpec SS; 2919 SS.Adopt(QualifierLoc); 2920 2921 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2922 OperatorLoc, IsArrow, 2923 SS, TemplateKWLoc, 2924 FirstQualifierInScope, 2925 R, TemplateArgs, /*S*/nullptr); 2926 } 2927 2928 /// Build a new noexcept expression. 2929 /// 2930 /// By default, performs semantic analysis to build the new expression. 2931 /// Subclasses may override this routine to provide different behavior. 2932 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2933 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2934 } 2935 2936 /// Build a new expression to compute the length of a parameter pack. 2937 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2938 NamedDecl *Pack, 2939 SourceLocation PackLoc, 2940 SourceLocation RParenLoc, 2941 Optional<unsigned> Length, 2942 ArrayRef<TemplateArgument> PartialArgs) { 2943 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2944 RParenLoc, Length, PartialArgs); 2945 } 2946 2947 /// Build a new Objective-C boxed expression. 2948 /// 2949 /// By default, performs semantic analysis to build the new expression. 2950 /// Subclasses may override this routine to provide different behavior. 2951 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2952 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2953 } 2954 2955 /// Build a new Objective-C array literal. 2956 /// 2957 /// By default, performs semantic analysis to build the new expression. 2958 /// Subclasses may override this routine to provide different behavior. 2959 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2960 Expr **Elements, unsigned NumElements) { 2961 return getSema().BuildObjCArrayLiteral(Range, 2962 MultiExprArg(Elements, NumElements)); 2963 } 2964 2965 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2966 Expr *Base, Expr *Key, 2967 ObjCMethodDecl *getterMethod, 2968 ObjCMethodDecl *setterMethod) { 2969 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2970 getterMethod, setterMethod); 2971 } 2972 2973 /// Build a new Objective-C dictionary literal. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2978 MutableArrayRef<ObjCDictionaryElement> Elements) { 2979 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2980 } 2981 2982 /// Build a new Objective-C \@encode expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2987 TypeSourceInfo *EncodeTypeInfo, 2988 SourceLocation RParenLoc) { 2989 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2990 } 2991 2992 /// Build a new Objective-C class message. 2993 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2994 Selector Sel, 2995 ArrayRef<SourceLocation> SelectorLocs, 2996 ObjCMethodDecl *Method, 2997 SourceLocation LBracLoc, 2998 MultiExprArg Args, 2999 SourceLocation RBracLoc) { 3000 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3001 ReceiverTypeInfo->getType(), 3002 /*SuperLoc=*/SourceLocation(), 3003 Sel, Method, LBracLoc, SelectorLocs, 3004 RBracLoc, Args); 3005 } 3006 3007 /// Build a new Objective-C instance message. 3008 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3009 Selector Sel, 3010 ArrayRef<SourceLocation> SelectorLocs, 3011 ObjCMethodDecl *Method, 3012 SourceLocation LBracLoc, 3013 MultiExprArg Args, 3014 SourceLocation RBracLoc) { 3015 return SemaRef.BuildInstanceMessage(Receiver, 3016 Receiver->getType(), 3017 /*SuperLoc=*/SourceLocation(), 3018 Sel, Method, LBracLoc, SelectorLocs, 3019 RBracLoc, Args); 3020 } 3021 3022 /// Build a new Objective-C instance/class message to 'super'. 3023 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3024 Selector Sel, 3025 ArrayRef<SourceLocation> SelectorLocs, 3026 QualType SuperType, 3027 ObjCMethodDecl *Method, 3028 SourceLocation LBracLoc, 3029 MultiExprArg Args, 3030 SourceLocation RBracLoc) { 3031 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3032 SuperType, 3033 SuperLoc, 3034 Sel, Method, LBracLoc, SelectorLocs, 3035 RBracLoc, Args) 3036 : SemaRef.BuildClassMessage(nullptr, 3037 SuperType, 3038 SuperLoc, 3039 Sel, Method, LBracLoc, SelectorLocs, 3040 RBracLoc, Args); 3041 3042 3043 } 3044 3045 /// Build a new Objective-C ivar reference expression. 3046 /// 3047 /// By default, performs semantic analysis to build the new expression. 3048 /// Subclasses may override this routine to provide different behavior. 3049 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3050 SourceLocation IvarLoc, 3051 bool IsArrow, bool IsFreeIvar) { 3052 CXXScopeSpec SS; 3053 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3054 ExprResult Result = getSema().BuildMemberReferenceExpr( 3055 BaseArg, BaseArg->getType(), 3056 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3057 /*FirstQualifierInScope=*/nullptr, NameInfo, 3058 /*TemplateArgs=*/nullptr, 3059 /*S=*/nullptr); 3060 if (IsFreeIvar && Result.isUsable()) 3061 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3062 return Result; 3063 } 3064 3065 /// Build a new Objective-C property reference expression. 3066 /// 3067 /// By default, performs semantic analysis to build the new expression. 3068 /// Subclasses may override this routine to provide different behavior. 3069 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3070 ObjCPropertyDecl *Property, 3071 SourceLocation PropertyLoc) { 3072 CXXScopeSpec SS; 3073 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3074 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3075 /*FIXME:*/PropertyLoc, 3076 /*IsArrow=*/false, 3077 SS, SourceLocation(), 3078 /*FirstQualifierInScope=*/nullptr, 3079 NameInfo, 3080 /*TemplateArgs=*/nullptr, 3081 /*S=*/nullptr); 3082 } 3083 3084 /// Build a new Objective-C property reference expression. 3085 /// 3086 /// By default, performs semantic analysis to build the new expression. 3087 /// Subclasses may override this routine to provide different behavior. 3088 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3089 ObjCMethodDecl *Getter, 3090 ObjCMethodDecl *Setter, 3091 SourceLocation PropertyLoc) { 3092 // Since these expressions can only be value-dependent, we do not 3093 // need to perform semantic analysis again. 3094 return Owned( 3095 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3096 VK_LValue, OK_ObjCProperty, 3097 PropertyLoc, Base)); 3098 } 3099 3100 /// Build a new Objective-C "isa" expression. 3101 /// 3102 /// By default, performs semantic analysis to build the new expression. 3103 /// Subclasses may override this routine to provide different behavior. 3104 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3105 SourceLocation OpLoc, bool IsArrow) { 3106 CXXScopeSpec SS; 3107 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3108 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3109 OpLoc, IsArrow, 3110 SS, SourceLocation(), 3111 /*FirstQualifierInScope=*/nullptr, 3112 NameInfo, 3113 /*TemplateArgs=*/nullptr, 3114 /*S=*/nullptr); 3115 } 3116 3117 /// Build a new shuffle vector expression. 3118 /// 3119 /// By default, performs semantic analysis to build the new expression. 3120 /// Subclasses may override this routine to provide different behavior. 3121 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3122 MultiExprArg SubExprs, 3123 SourceLocation RParenLoc) { 3124 // Find the declaration for __builtin_shufflevector 3125 const IdentifierInfo &Name 3126 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3127 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3128 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3129 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3130 3131 // Build a reference to the __builtin_shufflevector builtin 3132 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3133 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3134 SemaRef.Context.BuiltinFnTy, 3135 VK_RValue, BuiltinLoc); 3136 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3137 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3138 CK_BuiltinFnToFnPtr).get(); 3139 3140 // Build the CallExpr 3141 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3142 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3143 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3144 3145 // Type-check the __builtin_shufflevector expression. 3146 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3147 } 3148 3149 /// Build a new convert vector expression. 3150 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3151 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3152 SourceLocation RParenLoc) { 3153 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3154 BuiltinLoc, RParenLoc); 3155 } 3156 3157 /// Build a new template argument pack expansion. 3158 /// 3159 /// By default, performs semantic analysis to build a new pack expansion 3160 /// for a template argument. Subclasses may override this routine to provide 3161 /// different behavior. 3162 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3163 SourceLocation EllipsisLoc, 3164 Optional<unsigned> NumExpansions) { 3165 switch (Pattern.getArgument().getKind()) { 3166 case TemplateArgument::Expression: { 3167 ExprResult Result 3168 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3169 EllipsisLoc, NumExpansions); 3170 if (Result.isInvalid()) 3171 return TemplateArgumentLoc(); 3172 3173 return TemplateArgumentLoc(Result.get(), Result.get()); 3174 } 3175 3176 case TemplateArgument::Template: 3177 return TemplateArgumentLoc(TemplateArgument( 3178 Pattern.getArgument().getAsTemplate(), 3179 NumExpansions), 3180 Pattern.getTemplateQualifierLoc(), 3181 Pattern.getTemplateNameLoc(), 3182 EllipsisLoc); 3183 3184 case TemplateArgument::Null: 3185 case TemplateArgument::Integral: 3186 case TemplateArgument::Declaration: 3187 case TemplateArgument::Pack: 3188 case TemplateArgument::TemplateExpansion: 3189 case TemplateArgument::NullPtr: 3190 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3191 3192 case TemplateArgument::Type: 3193 if (TypeSourceInfo *Expansion 3194 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3195 EllipsisLoc, 3196 NumExpansions)) 3197 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3198 Expansion); 3199 break; 3200 } 3201 3202 return TemplateArgumentLoc(); 3203 } 3204 3205 /// Build a new expression pack expansion. 3206 /// 3207 /// By default, performs semantic analysis to build a new pack expansion 3208 /// for an expression. Subclasses may override this routine to provide 3209 /// different behavior. 3210 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3211 Optional<unsigned> NumExpansions) { 3212 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3213 } 3214 3215 /// Build a new C++1z fold-expression. 3216 /// 3217 /// By default, performs semantic analysis in order to build a new fold 3218 /// expression. 3219 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3220 BinaryOperatorKind Operator, 3221 SourceLocation EllipsisLoc, Expr *RHS, 3222 SourceLocation RParenLoc) { 3223 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3224 RHS, RParenLoc); 3225 } 3226 3227 /// Build an empty C++1z fold-expression with the given operator. 3228 /// 3229 /// By default, produces the fallback value for the fold-expression, or 3230 /// produce an error if there is no fallback value. 3231 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3232 BinaryOperatorKind Operator) { 3233 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3234 } 3235 3236 /// Build a new atomic operation expression. 3237 /// 3238 /// By default, performs semantic analysis to build the new expression. 3239 /// Subclasses may override this routine to provide different behavior. 3240 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3241 MultiExprArg SubExprs, 3242 QualType RetTy, 3243 AtomicExpr::AtomicOp Op, 3244 SourceLocation RParenLoc) { 3245 // Just create the expression; there is not any interesting semantic 3246 // analysis here because we can't actually build an AtomicExpr until 3247 // we are sure it is semantically sound. 3248 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3249 RParenLoc); 3250 } 3251 3252 private: 3253 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3254 QualType ObjectType, 3255 NamedDecl *FirstQualifierInScope, 3256 CXXScopeSpec &SS); 3257 3258 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3259 QualType ObjectType, 3260 NamedDecl *FirstQualifierInScope, 3261 CXXScopeSpec &SS); 3262 3263 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3264 NamedDecl *FirstQualifierInScope, 3265 CXXScopeSpec &SS); 3266 3267 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3268 DependentNameTypeLoc TL, 3269 bool DeducibleTSTContext); 3270 }; 3271 3272 template<typename Derived> 3273 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3274 if (!S) 3275 return S; 3276 3277 switch (S->getStmtClass()) { 3278 case Stmt::NoStmtClass: break; 3279 3280 // Transform individual statement nodes 3281 #define STMT(Node, Parent) \ 3282 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3283 #define ABSTRACT_STMT(Node) 3284 #define EXPR(Node, Parent) 3285 #include "clang/AST/StmtNodes.inc" 3286 3287 // Transform expressions by calling TransformExpr. 3288 #define STMT(Node, Parent) 3289 #define ABSTRACT_STMT(Stmt) 3290 #define EXPR(Node, Parent) case Stmt::Node##Class: 3291 #include "clang/AST/StmtNodes.inc" 3292 { 3293 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3294 if (E.isInvalid()) 3295 return StmtError(); 3296 3297 return getSema().ActOnExprStmt(E); 3298 } 3299 } 3300 3301 return S; 3302 } 3303 3304 template<typename Derived> 3305 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3306 if (!S) 3307 return S; 3308 3309 switch (S->getClauseKind()) { 3310 default: break; 3311 // Transform individual clause nodes 3312 #define OPENMP_CLAUSE(Name, Class) \ 3313 case OMPC_ ## Name : \ 3314 return getDerived().Transform ## Class(cast<Class>(S)); 3315 #include "clang/Basic/OpenMPKinds.def" 3316 } 3317 3318 return S; 3319 } 3320 3321 3322 template<typename Derived> 3323 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3324 if (!E) 3325 return E; 3326 3327 switch (E->getStmtClass()) { 3328 case Stmt::NoStmtClass: break; 3329 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3330 #define ABSTRACT_STMT(Stmt) 3331 #define EXPR(Node, Parent) \ 3332 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3333 #include "clang/AST/StmtNodes.inc" 3334 } 3335 3336 return E; 3337 } 3338 3339 template<typename Derived> 3340 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3341 bool NotCopyInit) { 3342 // Initializers are instantiated like expressions, except that various outer 3343 // layers are stripped. 3344 if (!Init) 3345 return Init; 3346 3347 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3348 Init = ExprTemp->getSubExpr(); 3349 3350 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3351 Init = AIL->getCommonExpr(); 3352 3353 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3354 Init = MTE->GetTemporaryExpr(); 3355 3356 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3357 Init = Binder->getSubExpr(); 3358 3359 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3360 Init = ICE->getSubExprAsWritten(); 3361 3362 if (CXXStdInitializerListExpr *ILE = 3363 dyn_cast<CXXStdInitializerListExpr>(Init)) 3364 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3365 3366 // If this is copy-initialization, we only need to reconstruct 3367 // InitListExprs. Other forms of copy-initialization will be a no-op if 3368 // the initializer is already the right type. 3369 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3370 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3371 return getDerived().TransformExpr(Init); 3372 3373 // Revert value-initialization back to empty parens. 3374 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3375 SourceRange Parens = VIE->getSourceRange(); 3376 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3377 Parens.getEnd()); 3378 } 3379 3380 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3381 if (isa<ImplicitValueInitExpr>(Init)) 3382 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3383 SourceLocation()); 3384 3385 // Revert initialization by constructor back to a parenthesized or braced list 3386 // of expressions. Any other form of initializer can just be reused directly. 3387 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3388 return getDerived().TransformExpr(Init); 3389 3390 // If the initialization implicitly converted an initializer list to a 3391 // std::initializer_list object, unwrap the std::initializer_list too. 3392 if (Construct && Construct->isStdInitListInitialization()) 3393 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3394 3395 // Enter a list-init context if this was list initialization. 3396 EnterExpressionEvaluationContext Context( 3397 getSema(), EnterExpressionEvaluationContext::InitList, 3398 Construct->isListInitialization()); 3399 3400 SmallVector<Expr*, 8> NewArgs; 3401 bool ArgChanged = false; 3402 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3403 /*IsCall*/true, NewArgs, &ArgChanged)) 3404 return ExprError(); 3405 3406 // If this was list initialization, revert to syntactic list form. 3407 if (Construct->isListInitialization()) 3408 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3409 Construct->getEndLoc()); 3410 3411 // Build a ParenListExpr to represent anything else. 3412 SourceRange Parens = Construct->getParenOrBraceRange(); 3413 if (Parens.isInvalid()) { 3414 // This was a variable declaration's initialization for which no initializer 3415 // was specified. 3416 assert(NewArgs.empty() && 3417 "no parens or braces but have direct init with arguments?"); 3418 return ExprEmpty(); 3419 } 3420 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3421 Parens.getEnd()); 3422 } 3423 3424 template<typename Derived> 3425 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3426 unsigned NumInputs, 3427 bool IsCall, 3428 SmallVectorImpl<Expr *> &Outputs, 3429 bool *ArgChanged) { 3430 for (unsigned I = 0; I != NumInputs; ++I) { 3431 // If requested, drop call arguments that need to be dropped. 3432 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3433 if (ArgChanged) 3434 *ArgChanged = true; 3435 3436 break; 3437 } 3438 3439 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3440 Expr *Pattern = Expansion->getPattern(); 3441 3442 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3443 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3444 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3445 3446 // Determine whether the set of unexpanded parameter packs can and should 3447 // be expanded. 3448 bool Expand = true; 3449 bool RetainExpansion = false; 3450 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3451 Optional<unsigned> NumExpansions = OrigNumExpansions; 3452 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3453 Pattern->getSourceRange(), 3454 Unexpanded, 3455 Expand, RetainExpansion, 3456 NumExpansions)) 3457 return true; 3458 3459 if (!Expand) { 3460 // The transform has determined that we should perform a simple 3461 // transformation on the pack expansion, producing another pack 3462 // expansion. 3463 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3464 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3465 if (OutPattern.isInvalid()) 3466 return true; 3467 3468 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3469 Expansion->getEllipsisLoc(), 3470 NumExpansions); 3471 if (Out.isInvalid()) 3472 return true; 3473 3474 if (ArgChanged) 3475 *ArgChanged = true; 3476 Outputs.push_back(Out.get()); 3477 continue; 3478 } 3479 3480 // Record right away that the argument was changed. This needs 3481 // to happen even if the array expands to nothing. 3482 if (ArgChanged) *ArgChanged = true; 3483 3484 // The transform has determined that we should perform an elementwise 3485 // expansion of the pattern. Do so. 3486 for (unsigned I = 0; I != *NumExpansions; ++I) { 3487 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3488 ExprResult Out = getDerived().TransformExpr(Pattern); 3489 if (Out.isInvalid()) 3490 return true; 3491 3492 if (Out.get()->containsUnexpandedParameterPack()) { 3493 Out = getDerived().RebuildPackExpansion( 3494 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3495 if (Out.isInvalid()) 3496 return true; 3497 } 3498 3499 Outputs.push_back(Out.get()); 3500 } 3501 3502 // If we're supposed to retain a pack expansion, do so by temporarily 3503 // forgetting the partially-substituted parameter pack. 3504 if (RetainExpansion) { 3505 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3506 3507 ExprResult Out = getDerived().TransformExpr(Pattern); 3508 if (Out.isInvalid()) 3509 return true; 3510 3511 Out = getDerived().RebuildPackExpansion( 3512 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3513 if (Out.isInvalid()) 3514 return true; 3515 3516 Outputs.push_back(Out.get()); 3517 } 3518 3519 continue; 3520 } 3521 3522 ExprResult Result = 3523 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3524 : getDerived().TransformExpr(Inputs[I]); 3525 if (Result.isInvalid()) 3526 return true; 3527 3528 if (Result.get() != Inputs[I] && ArgChanged) 3529 *ArgChanged = true; 3530 3531 Outputs.push_back(Result.get()); 3532 } 3533 3534 return false; 3535 } 3536 3537 template <typename Derived> 3538 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3539 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3540 if (Var) { 3541 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3542 getDerived().TransformDefinition(Var->getLocation(), Var)); 3543 3544 if (!ConditionVar) 3545 return Sema::ConditionError(); 3546 3547 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3548 } 3549 3550 if (Expr) { 3551 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3552 3553 if (CondExpr.isInvalid()) 3554 return Sema::ConditionError(); 3555 3556 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3557 } 3558 3559 return Sema::ConditionResult(); 3560 } 3561 3562 template<typename Derived> 3563 NestedNameSpecifierLoc 3564 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3565 NestedNameSpecifierLoc NNS, 3566 QualType ObjectType, 3567 NamedDecl *FirstQualifierInScope) { 3568 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3569 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3570 Qualifier = Qualifier.getPrefix()) 3571 Qualifiers.push_back(Qualifier); 3572 3573 CXXScopeSpec SS; 3574 while (!Qualifiers.empty()) { 3575 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3576 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3577 3578 switch (QNNS->getKind()) { 3579 case NestedNameSpecifier::Identifier: { 3580 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3581 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3582 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3583 SS, FirstQualifierInScope, false)) 3584 return NestedNameSpecifierLoc(); 3585 } 3586 break; 3587 3588 case NestedNameSpecifier::Namespace: { 3589 NamespaceDecl *NS 3590 = cast_or_null<NamespaceDecl>( 3591 getDerived().TransformDecl( 3592 Q.getLocalBeginLoc(), 3593 QNNS->getAsNamespace())); 3594 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3595 break; 3596 } 3597 3598 case NestedNameSpecifier::NamespaceAlias: { 3599 NamespaceAliasDecl *Alias 3600 = cast_or_null<NamespaceAliasDecl>( 3601 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3602 QNNS->getAsNamespaceAlias())); 3603 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3604 Q.getLocalEndLoc()); 3605 break; 3606 } 3607 3608 case NestedNameSpecifier::Global: 3609 // There is no meaningful transformation that one could perform on the 3610 // global scope. 3611 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3612 break; 3613 3614 case NestedNameSpecifier::Super: { 3615 CXXRecordDecl *RD = 3616 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3617 SourceLocation(), QNNS->getAsRecordDecl())); 3618 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3619 break; 3620 } 3621 3622 case NestedNameSpecifier::TypeSpecWithTemplate: 3623 case NestedNameSpecifier::TypeSpec: { 3624 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3625 FirstQualifierInScope, SS); 3626 3627 if (!TL) 3628 return NestedNameSpecifierLoc(); 3629 3630 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3631 (SemaRef.getLangOpts().CPlusPlus11 && 3632 TL.getType()->isEnumeralType())) { 3633 assert(!TL.getType().hasLocalQualifiers() && 3634 "Can't get cv-qualifiers here"); 3635 if (TL.getType()->isEnumeralType()) 3636 SemaRef.Diag(TL.getBeginLoc(), 3637 diag::warn_cxx98_compat_enum_nested_name_spec); 3638 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3639 Q.getLocalEndLoc()); 3640 break; 3641 } 3642 // If the nested-name-specifier is an invalid type def, don't emit an 3643 // error because a previous error should have already been emitted. 3644 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3645 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3646 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3647 << TL.getType() << SS.getRange(); 3648 } 3649 return NestedNameSpecifierLoc(); 3650 } 3651 } 3652 3653 // The qualifier-in-scope and object type only apply to the leftmost entity. 3654 FirstQualifierInScope = nullptr; 3655 ObjectType = QualType(); 3656 } 3657 3658 // Don't rebuild the nested-name-specifier if we don't have to. 3659 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3660 !getDerived().AlwaysRebuild()) 3661 return NNS; 3662 3663 // If we can re-use the source-location data from the original 3664 // nested-name-specifier, do so. 3665 if (SS.location_size() == NNS.getDataLength() && 3666 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3667 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3668 3669 // Allocate new nested-name-specifier location information. 3670 return SS.getWithLocInContext(SemaRef.Context); 3671 } 3672 3673 template<typename Derived> 3674 DeclarationNameInfo 3675 TreeTransform<Derived> 3676 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3677 DeclarationName Name = NameInfo.getName(); 3678 if (!Name) 3679 return DeclarationNameInfo(); 3680 3681 switch (Name.getNameKind()) { 3682 case DeclarationName::Identifier: 3683 case DeclarationName::ObjCZeroArgSelector: 3684 case DeclarationName::ObjCOneArgSelector: 3685 case DeclarationName::ObjCMultiArgSelector: 3686 case DeclarationName::CXXOperatorName: 3687 case DeclarationName::CXXLiteralOperatorName: 3688 case DeclarationName::CXXUsingDirective: 3689 return NameInfo; 3690 3691 case DeclarationName::CXXDeductionGuideName: { 3692 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3693 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3694 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3695 if (!NewTemplate) 3696 return DeclarationNameInfo(); 3697 3698 DeclarationNameInfo NewNameInfo(NameInfo); 3699 NewNameInfo.setName( 3700 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3701 return NewNameInfo; 3702 } 3703 3704 case DeclarationName::CXXConstructorName: 3705 case DeclarationName::CXXDestructorName: 3706 case DeclarationName::CXXConversionFunctionName: { 3707 TypeSourceInfo *NewTInfo; 3708 CanQualType NewCanTy; 3709 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3710 NewTInfo = getDerived().TransformType(OldTInfo); 3711 if (!NewTInfo) 3712 return DeclarationNameInfo(); 3713 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3714 } 3715 else { 3716 NewTInfo = nullptr; 3717 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3718 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3719 if (NewT.isNull()) 3720 return DeclarationNameInfo(); 3721 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3722 } 3723 3724 DeclarationName NewName 3725 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3726 NewCanTy); 3727 DeclarationNameInfo NewNameInfo(NameInfo); 3728 NewNameInfo.setName(NewName); 3729 NewNameInfo.setNamedTypeInfo(NewTInfo); 3730 return NewNameInfo; 3731 } 3732 } 3733 3734 llvm_unreachable("Unknown name kind."); 3735 } 3736 3737 template<typename Derived> 3738 TemplateName 3739 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3740 TemplateName Name, 3741 SourceLocation NameLoc, 3742 QualType ObjectType, 3743 NamedDecl *FirstQualifierInScope, 3744 bool AllowInjectedClassName) { 3745 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3746 TemplateDecl *Template = QTN->getTemplateDecl(); 3747 assert(Template && "qualified template name must refer to a template"); 3748 3749 TemplateDecl *TransTemplate 3750 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3751 Template)); 3752 if (!TransTemplate) 3753 return TemplateName(); 3754 3755 if (!getDerived().AlwaysRebuild() && 3756 SS.getScopeRep() == QTN->getQualifier() && 3757 TransTemplate == Template) 3758 return Name; 3759 3760 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3761 TransTemplate); 3762 } 3763 3764 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3765 if (SS.getScopeRep()) { 3766 // These apply to the scope specifier, not the template. 3767 ObjectType = QualType(); 3768 FirstQualifierInScope = nullptr; 3769 } 3770 3771 if (!getDerived().AlwaysRebuild() && 3772 SS.getScopeRep() == DTN->getQualifier() && 3773 ObjectType.isNull()) 3774 return Name; 3775 3776 // FIXME: Preserve the location of the "template" keyword. 3777 SourceLocation TemplateKWLoc = NameLoc; 3778 3779 if (DTN->isIdentifier()) { 3780 return getDerived().RebuildTemplateName(SS, 3781 TemplateKWLoc, 3782 *DTN->getIdentifier(), 3783 NameLoc, 3784 ObjectType, 3785 FirstQualifierInScope, 3786 AllowInjectedClassName); 3787 } 3788 3789 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3790 DTN->getOperator(), NameLoc, 3791 ObjectType, AllowInjectedClassName); 3792 } 3793 3794 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3795 TemplateDecl *TransTemplate 3796 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3797 Template)); 3798 if (!TransTemplate) 3799 return TemplateName(); 3800 3801 if (!getDerived().AlwaysRebuild() && 3802 TransTemplate == Template) 3803 return Name; 3804 3805 return TemplateName(TransTemplate); 3806 } 3807 3808 if (SubstTemplateTemplateParmPackStorage *SubstPack 3809 = Name.getAsSubstTemplateTemplateParmPack()) { 3810 TemplateTemplateParmDecl *TransParam 3811 = cast_or_null<TemplateTemplateParmDecl>( 3812 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3813 if (!TransParam) 3814 return TemplateName(); 3815 3816 if (!getDerived().AlwaysRebuild() && 3817 TransParam == SubstPack->getParameterPack()) 3818 return Name; 3819 3820 return getDerived().RebuildTemplateName(TransParam, 3821 SubstPack->getArgumentPack()); 3822 } 3823 3824 // These should be getting filtered out before they reach the AST. 3825 llvm_unreachable("overloaded function decl survived to here"); 3826 } 3827 3828 template<typename Derived> 3829 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3830 const TemplateArgument &Arg, 3831 TemplateArgumentLoc &Output) { 3832 SourceLocation Loc = getDerived().getBaseLocation(); 3833 switch (Arg.getKind()) { 3834 case TemplateArgument::Null: 3835 llvm_unreachable("null template argument in TreeTransform"); 3836 break; 3837 3838 case TemplateArgument::Type: 3839 Output = TemplateArgumentLoc(Arg, 3840 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3841 3842 break; 3843 3844 case TemplateArgument::Template: 3845 case TemplateArgument::TemplateExpansion: { 3846 NestedNameSpecifierLocBuilder Builder; 3847 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3848 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3849 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3850 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3851 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3852 3853 if (Arg.getKind() == TemplateArgument::Template) 3854 Output = TemplateArgumentLoc(Arg, 3855 Builder.getWithLocInContext(SemaRef.Context), 3856 Loc); 3857 else 3858 Output = TemplateArgumentLoc(Arg, 3859 Builder.getWithLocInContext(SemaRef.Context), 3860 Loc, Loc); 3861 3862 break; 3863 } 3864 3865 case TemplateArgument::Expression: 3866 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3867 break; 3868 3869 case TemplateArgument::Declaration: 3870 case TemplateArgument::Integral: 3871 case TemplateArgument::Pack: 3872 case TemplateArgument::NullPtr: 3873 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3874 break; 3875 } 3876 } 3877 3878 template<typename Derived> 3879 bool TreeTransform<Derived>::TransformTemplateArgument( 3880 const TemplateArgumentLoc &Input, 3881 TemplateArgumentLoc &Output, bool Uneval) { 3882 EnterExpressionEvaluationContext EEEC( 3883 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3884 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3885 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3886 const TemplateArgument &Arg = Input.getArgument(); 3887 switch (Arg.getKind()) { 3888 case TemplateArgument::Null: 3889 case TemplateArgument::Integral: 3890 case TemplateArgument::Pack: 3891 case TemplateArgument::Declaration: 3892 case TemplateArgument::NullPtr: 3893 llvm_unreachable("Unexpected TemplateArgument"); 3894 3895 case TemplateArgument::Type: { 3896 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3897 if (!DI) 3898 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3899 3900 DI = getDerived().TransformType(DI); 3901 if (!DI) return true; 3902 3903 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3904 return false; 3905 } 3906 3907 case TemplateArgument::Template: { 3908 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3909 if (QualifierLoc) { 3910 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3911 if (!QualifierLoc) 3912 return true; 3913 } 3914 3915 CXXScopeSpec SS; 3916 SS.Adopt(QualifierLoc); 3917 TemplateName Template 3918 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3919 Input.getTemplateNameLoc()); 3920 if (Template.isNull()) 3921 return true; 3922 3923 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3924 Input.getTemplateNameLoc()); 3925 return false; 3926 } 3927 3928 case TemplateArgument::TemplateExpansion: 3929 llvm_unreachable("Caller should expand pack expansions"); 3930 3931 case TemplateArgument::Expression: { 3932 // Template argument expressions are constant expressions. 3933 EnterExpressionEvaluationContext Unevaluated( 3934 getSema(), Uneval 3935 ? Sema::ExpressionEvaluationContext::Unevaluated 3936 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3937 3938 Expr *InputExpr = Input.getSourceExpression(); 3939 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3940 3941 ExprResult E = getDerived().TransformExpr(InputExpr); 3942 E = SemaRef.ActOnConstantExpression(E); 3943 if (E.isInvalid()) return true; 3944 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3945 return false; 3946 } 3947 } 3948 3949 // Work around bogus GCC warning 3950 return true; 3951 } 3952 3953 /// Iterator adaptor that invents template argument location information 3954 /// for each of the template arguments in its underlying iterator. 3955 template<typename Derived, typename InputIterator> 3956 class TemplateArgumentLocInventIterator { 3957 TreeTransform<Derived> &Self; 3958 InputIterator Iter; 3959 3960 public: 3961 typedef TemplateArgumentLoc value_type; 3962 typedef TemplateArgumentLoc reference; 3963 typedef typename std::iterator_traits<InputIterator>::difference_type 3964 difference_type; 3965 typedef std::input_iterator_tag iterator_category; 3966 3967 class pointer { 3968 TemplateArgumentLoc Arg; 3969 3970 public: 3971 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3972 3973 const TemplateArgumentLoc *operator->() const { return &Arg; } 3974 }; 3975 3976 TemplateArgumentLocInventIterator() { } 3977 3978 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3979 InputIterator Iter) 3980 : Self(Self), Iter(Iter) { } 3981 3982 TemplateArgumentLocInventIterator &operator++() { 3983 ++Iter; 3984 return *this; 3985 } 3986 3987 TemplateArgumentLocInventIterator operator++(int) { 3988 TemplateArgumentLocInventIterator Old(*this); 3989 ++(*this); 3990 return Old; 3991 } 3992 3993 reference operator*() const { 3994 TemplateArgumentLoc Result; 3995 Self.InventTemplateArgumentLoc(*Iter, Result); 3996 return Result; 3997 } 3998 3999 pointer operator->() const { return pointer(**this); } 4000 4001 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4002 const TemplateArgumentLocInventIterator &Y) { 4003 return X.Iter == Y.Iter; 4004 } 4005 4006 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4007 const TemplateArgumentLocInventIterator &Y) { 4008 return X.Iter != Y.Iter; 4009 } 4010 }; 4011 4012 template<typename Derived> 4013 template<typename InputIterator> 4014 bool TreeTransform<Derived>::TransformTemplateArguments( 4015 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4016 bool Uneval) { 4017 for (; First != Last; ++First) { 4018 TemplateArgumentLoc Out; 4019 TemplateArgumentLoc In = *First; 4020 4021 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4022 // Unpack argument packs, which we translate them into separate 4023 // arguments. 4024 // FIXME: We could do much better if we could guarantee that the 4025 // TemplateArgumentLocInfo for the pack expansion would be usable for 4026 // all of the template arguments in the argument pack. 4027 typedef TemplateArgumentLocInventIterator<Derived, 4028 TemplateArgument::pack_iterator> 4029 PackLocIterator; 4030 if (TransformTemplateArguments(PackLocIterator(*this, 4031 In.getArgument().pack_begin()), 4032 PackLocIterator(*this, 4033 In.getArgument().pack_end()), 4034 Outputs, Uneval)) 4035 return true; 4036 4037 continue; 4038 } 4039 4040 if (In.getArgument().isPackExpansion()) { 4041 // We have a pack expansion, for which we will be substituting into 4042 // the pattern. 4043 SourceLocation Ellipsis; 4044 Optional<unsigned> OrigNumExpansions; 4045 TemplateArgumentLoc Pattern 4046 = getSema().getTemplateArgumentPackExpansionPattern( 4047 In, Ellipsis, OrigNumExpansions); 4048 4049 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4050 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4051 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4052 4053 // Determine whether the set of unexpanded parameter packs can and should 4054 // be expanded. 4055 bool Expand = true; 4056 bool RetainExpansion = false; 4057 Optional<unsigned> NumExpansions = OrigNumExpansions; 4058 if (getDerived().TryExpandParameterPacks(Ellipsis, 4059 Pattern.getSourceRange(), 4060 Unexpanded, 4061 Expand, 4062 RetainExpansion, 4063 NumExpansions)) 4064 return true; 4065 4066 if (!Expand) { 4067 // The transform has determined that we should perform a simple 4068 // transformation on the pack expansion, producing another pack 4069 // expansion. 4070 TemplateArgumentLoc OutPattern; 4071 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4072 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4073 return true; 4074 4075 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4076 NumExpansions); 4077 if (Out.getArgument().isNull()) 4078 return true; 4079 4080 Outputs.addArgument(Out); 4081 continue; 4082 } 4083 4084 // The transform has determined that we should perform an elementwise 4085 // expansion of the pattern. Do so. 4086 for (unsigned I = 0; I != *NumExpansions; ++I) { 4087 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4088 4089 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4090 return true; 4091 4092 if (Out.getArgument().containsUnexpandedParameterPack()) { 4093 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4094 OrigNumExpansions); 4095 if (Out.getArgument().isNull()) 4096 return true; 4097 } 4098 4099 Outputs.addArgument(Out); 4100 } 4101 4102 // If we're supposed to retain a pack expansion, do so by temporarily 4103 // forgetting the partially-substituted parameter pack. 4104 if (RetainExpansion) { 4105 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4106 4107 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4108 return true; 4109 4110 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4111 OrigNumExpansions); 4112 if (Out.getArgument().isNull()) 4113 return true; 4114 4115 Outputs.addArgument(Out); 4116 } 4117 4118 continue; 4119 } 4120 4121 // The simple case: 4122 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4123 return true; 4124 4125 Outputs.addArgument(Out); 4126 } 4127 4128 return false; 4129 4130 } 4131 4132 //===----------------------------------------------------------------------===// 4133 // Type transformation 4134 //===----------------------------------------------------------------------===// 4135 4136 template<typename Derived> 4137 QualType TreeTransform<Derived>::TransformType(QualType T) { 4138 if (getDerived().AlreadyTransformed(T)) 4139 return T; 4140 4141 // Temporary workaround. All of these transformations should 4142 // eventually turn into transformations on TypeLocs. 4143 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4144 getDerived().getBaseLocation()); 4145 4146 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4147 4148 if (!NewDI) 4149 return QualType(); 4150 4151 return NewDI->getType(); 4152 } 4153 4154 template<typename Derived> 4155 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4156 // Refine the base location to the type's location. 4157 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4158 getDerived().getBaseEntity()); 4159 if (getDerived().AlreadyTransformed(DI->getType())) 4160 return DI; 4161 4162 TypeLocBuilder TLB; 4163 4164 TypeLoc TL = DI->getTypeLoc(); 4165 TLB.reserve(TL.getFullDataSize()); 4166 4167 QualType Result = getDerived().TransformType(TLB, TL); 4168 if (Result.isNull()) 4169 return nullptr; 4170 4171 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4172 } 4173 4174 template<typename Derived> 4175 QualType 4176 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4177 switch (T.getTypeLocClass()) { 4178 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4179 #define TYPELOC(CLASS, PARENT) \ 4180 case TypeLoc::CLASS: \ 4181 return getDerived().Transform##CLASS##Type(TLB, \ 4182 T.castAs<CLASS##TypeLoc>()); 4183 #include "clang/AST/TypeLocNodes.def" 4184 } 4185 4186 llvm_unreachable("unhandled type loc!"); 4187 } 4188 4189 template<typename Derived> 4190 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4191 if (!isa<DependentNameType>(T)) 4192 return TransformType(T); 4193 4194 if (getDerived().AlreadyTransformed(T)) 4195 return T; 4196 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4197 getDerived().getBaseLocation()); 4198 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4199 return NewDI ? NewDI->getType() : QualType(); 4200 } 4201 4202 template<typename Derived> 4203 TypeSourceInfo * 4204 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4205 if (!isa<DependentNameType>(DI->getType())) 4206 return TransformType(DI); 4207 4208 // Refine the base location to the type's location. 4209 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4210 getDerived().getBaseEntity()); 4211 if (getDerived().AlreadyTransformed(DI->getType())) 4212 return DI; 4213 4214 TypeLocBuilder TLB; 4215 4216 TypeLoc TL = DI->getTypeLoc(); 4217 TLB.reserve(TL.getFullDataSize()); 4218 4219 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4220 if (QTL) 4221 TL = QTL.getUnqualifiedLoc(); 4222 4223 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4224 4225 QualType Result = getDerived().TransformDependentNameType( 4226 TLB, DNTL, /*DeducedTSTContext*/true); 4227 if (Result.isNull()) 4228 return nullptr; 4229 4230 if (QTL) { 4231 Result = getDerived().RebuildQualifiedType( 4232 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4233 TLB.TypeWasModifiedSafely(Result); 4234 } 4235 4236 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4237 } 4238 4239 template<typename Derived> 4240 QualType 4241 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4242 QualifiedTypeLoc T) { 4243 Qualifiers Quals = T.getType().getLocalQualifiers(); 4244 4245 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4246 if (Result.isNull()) 4247 return QualType(); 4248 4249 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4250 4251 // RebuildQualifiedType might have updated the type, but not in a way 4252 // that invalidates the TypeLoc. (There's no location information for 4253 // qualifiers.) 4254 TLB.TypeWasModifiedSafely(Result); 4255 4256 return Result; 4257 } 4258 4259 template<typename Derived> 4260 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4261 SourceLocation Loc, 4262 Qualifiers Quals) { 4263 // C++ [dcl.fct]p7: 4264 // [When] adding cv-qualifications on top of the function type [...] the 4265 // cv-qualifiers are ignored. 4266 if (T->isFunctionType()) 4267 return T; 4268 4269 // C++ [dcl.ref]p1: 4270 // when the cv-qualifiers are introduced through the use of a typedef-name 4271 // or decltype-specifier [...] the cv-qualifiers are ignored. 4272 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4273 // applied to a reference type. 4274 if (T->isReferenceType()) { 4275 // The only qualifier that applies to a reference type is restrict. 4276 if (!Quals.hasRestrict()) 4277 return T; 4278 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4279 } 4280 4281 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4282 // resulting type. 4283 if (Quals.hasObjCLifetime()) { 4284 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4285 Quals.removeObjCLifetime(); 4286 else if (T.getObjCLifetime()) { 4287 // Objective-C ARC: 4288 // A lifetime qualifier applied to a substituted template parameter 4289 // overrides the lifetime qualifier from the template argument. 4290 const AutoType *AutoTy; 4291 if (const SubstTemplateTypeParmType *SubstTypeParam 4292 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4293 QualType Replacement = SubstTypeParam->getReplacementType(); 4294 Qualifiers Qs = Replacement.getQualifiers(); 4295 Qs.removeObjCLifetime(); 4296 Replacement = SemaRef.Context.getQualifiedType( 4297 Replacement.getUnqualifiedType(), Qs); 4298 T = SemaRef.Context.getSubstTemplateTypeParmType( 4299 SubstTypeParam->getReplacedParameter(), Replacement); 4300 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4301 // 'auto' types behave the same way as template parameters. 4302 QualType Deduced = AutoTy->getDeducedType(); 4303 Qualifiers Qs = Deduced.getQualifiers(); 4304 Qs.removeObjCLifetime(); 4305 Deduced = 4306 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4307 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4308 AutoTy->isDependentType()); 4309 } else { 4310 // Otherwise, complain about the addition of a qualifier to an 4311 // already-qualified type. 4312 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4313 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4314 Quals.removeObjCLifetime(); 4315 } 4316 } 4317 } 4318 4319 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4320 } 4321 4322 template<typename Derived> 4323 TypeLoc 4324 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4325 QualType ObjectType, 4326 NamedDecl *UnqualLookup, 4327 CXXScopeSpec &SS) { 4328 if (getDerived().AlreadyTransformed(TL.getType())) 4329 return TL; 4330 4331 TypeSourceInfo *TSI = 4332 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4333 if (TSI) 4334 return TSI->getTypeLoc(); 4335 return TypeLoc(); 4336 } 4337 4338 template<typename Derived> 4339 TypeSourceInfo * 4340 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4341 QualType ObjectType, 4342 NamedDecl *UnqualLookup, 4343 CXXScopeSpec &SS) { 4344 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4345 return TSInfo; 4346 4347 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4348 UnqualLookup, SS); 4349 } 4350 4351 template <typename Derived> 4352 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4353 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4354 CXXScopeSpec &SS) { 4355 QualType T = TL.getType(); 4356 assert(!getDerived().AlreadyTransformed(T)); 4357 4358 TypeLocBuilder TLB; 4359 QualType Result; 4360 4361 if (isa<TemplateSpecializationType>(T)) { 4362 TemplateSpecializationTypeLoc SpecTL = 4363 TL.castAs<TemplateSpecializationTypeLoc>(); 4364 4365 TemplateName Template = getDerived().TransformTemplateName( 4366 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4367 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4368 if (Template.isNull()) 4369 return nullptr; 4370 4371 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4372 Template); 4373 } else if (isa<DependentTemplateSpecializationType>(T)) { 4374 DependentTemplateSpecializationTypeLoc SpecTL = 4375 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4376 4377 TemplateName Template 4378 = getDerived().RebuildTemplateName(SS, 4379 SpecTL.getTemplateKeywordLoc(), 4380 *SpecTL.getTypePtr()->getIdentifier(), 4381 SpecTL.getTemplateNameLoc(), 4382 ObjectType, UnqualLookup, 4383 /*AllowInjectedClassName*/true); 4384 if (Template.isNull()) 4385 return nullptr; 4386 4387 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4388 SpecTL, 4389 Template, 4390 SS); 4391 } else { 4392 // Nothing special needs to be done for these. 4393 Result = getDerived().TransformType(TLB, TL); 4394 } 4395 4396 if (Result.isNull()) 4397 return nullptr; 4398 4399 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4400 } 4401 4402 template <class TyLoc> static inline 4403 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4404 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4405 NewT.setNameLoc(T.getNameLoc()); 4406 return T.getType(); 4407 } 4408 4409 template<typename Derived> 4410 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4411 BuiltinTypeLoc T) { 4412 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4413 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4414 if (T.needsExtraLocalData()) 4415 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4416 return T.getType(); 4417 } 4418 4419 template<typename Derived> 4420 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4421 ComplexTypeLoc T) { 4422 // FIXME: recurse? 4423 return TransformTypeSpecType(TLB, T); 4424 } 4425 4426 template <typename Derived> 4427 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4428 AdjustedTypeLoc TL) { 4429 // Adjustments applied during transformation are handled elsewhere. 4430 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4431 } 4432 4433 template<typename Derived> 4434 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4435 DecayedTypeLoc TL) { 4436 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4437 if (OriginalType.isNull()) 4438 return QualType(); 4439 4440 QualType Result = TL.getType(); 4441 if (getDerived().AlwaysRebuild() || 4442 OriginalType != TL.getOriginalLoc().getType()) 4443 Result = SemaRef.Context.getDecayedType(OriginalType); 4444 TLB.push<DecayedTypeLoc>(Result); 4445 // Nothing to set for DecayedTypeLoc. 4446 return Result; 4447 } 4448 4449 template<typename Derived> 4450 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4451 PointerTypeLoc TL) { 4452 QualType PointeeType 4453 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4454 if (PointeeType.isNull()) 4455 return QualType(); 4456 4457 QualType Result = TL.getType(); 4458 if (PointeeType->getAs<ObjCObjectType>()) { 4459 // A dependent pointer type 'T *' has is being transformed such 4460 // that an Objective-C class type is being replaced for 'T'. The 4461 // resulting pointer type is an ObjCObjectPointerType, not a 4462 // PointerType. 4463 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4464 4465 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4466 NewT.setStarLoc(TL.getStarLoc()); 4467 return Result; 4468 } 4469 4470 if (getDerived().AlwaysRebuild() || 4471 PointeeType != TL.getPointeeLoc().getType()) { 4472 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4473 if (Result.isNull()) 4474 return QualType(); 4475 } 4476 4477 // Objective-C ARC can add lifetime qualifiers to the type that we're 4478 // pointing to. 4479 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4480 4481 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4482 NewT.setSigilLoc(TL.getSigilLoc()); 4483 return Result; 4484 } 4485 4486 template<typename Derived> 4487 QualType 4488 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4489 BlockPointerTypeLoc TL) { 4490 QualType PointeeType 4491 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4492 if (PointeeType.isNull()) 4493 return QualType(); 4494 4495 QualType Result = TL.getType(); 4496 if (getDerived().AlwaysRebuild() || 4497 PointeeType != TL.getPointeeLoc().getType()) { 4498 Result = getDerived().RebuildBlockPointerType(PointeeType, 4499 TL.getSigilLoc()); 4500 if (Result.isNull()) 4501 return QualType(); 4502 } 4503 4504 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4505 NewT.setSigilLoc(TL.getSigilLoc()); 4506 return Result; 4507 } 4508 4509 /// Transforms a reference type. Note that somewhat paradoxically we 4510 /// don't care whether the type itself is an l-value type or an r-value 4511 /// type; we only care if the type was *written* as an l-value type 4512 /// or an r-value type. 4513 template<typename Derived> 4514 QualType 4515 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4516 ReferenceTypeLoc TL) { 4517 const ReferenceType *T = TL.getTypePtr(); 4518 4519 // Note that this works with the pointee-as-written. 4520 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4521 if (PointeeType.isNull()) 4522 return QualType(); 4523 4524 QualType Result = TL.getType(); 4525 if (getDerived().AlwaysRebuild() || 4526 PointeeType != T->getPointeeTypeAsWritten()) { 4527 Result = getDerived().RebuildReferenceType(PointeeType, 4528 T->isSpelledAsLValue(), 4529 TL.getSigilLoc()); 4530 if (Result.isNull()) 4531 return QualType(); 4532 } 4533 4534 // Objective-C ARC can add lifetime qualifiers to the type that we're 4535 // referring to. 4536 TLB.TypeWasModifiedSafely( 4537 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4538 4539 // r-value references can be rebuilt as l-value references. 4540 ReferenceTypeLoc NewTL; 4541 if (isa<LValueReferenceType>(Result)) 4542 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4543 else 4544 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4545 NewTL.setSigilLoc(TL.getSigilLoc()); 4546 4547 return Result; 4548 } 4549 4550 template<typename Derived> 4551 QualType 4552 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4553 LValueReferenceTypeLoc TL) { 4554 return TransformReferenceType(TLB, TL); 4555 } 4556 4557 template<typename Derived> 4558 QualType 4559 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4560 RValueReferenceTypeLoc TL) { 4561 return TransformReferenceType(TLB, TL); 4562 } 4563 4564 template<typename Derived> 4565 QualType 4566 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4567 MemberPointerTypeLoc TL) { 4568 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4569 if (PointeeType.isNull()) 4570 return QualType(); 4571 4572 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4573 TypeSourceInfo *NewClsTInfo = nullptr; 4574 if (OldClsTInfo) { 4575 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4576 if (!NewClsTInfo) 4577 return QualType(); 4578 } 4579 4580 const MemberPointerType *T = TL.getTypePtr(); 4581 QualType OldClsType = QualType(T->getClass(), 0); 4582 QualType NewClsType; 4583 if (NewClsTInfo) 4584 NewClsType = NewClsTInfo->getType(); 4585 else { 4586 NewClsType = getDerived().TransformType(OldClsType); 4587 if (NewClsType.isNull()) 4588 return QualType(); 4589 } 4590 4591 QualType Result = TL.getType(); 4592 if (getDerived().AlwaysRebuild() || 4593 PointeeType != T->getPointeeType() || 4594 NewClsType != OldClsType) { 4595 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4596 TL.getStarLoc()); 4597 if (Result.isNull()) 4598 return QualType(); 4599 } 4600 4601 // If we had to adjust the pointee type when building a member pointer, make 4602 // sure to push TypeLoc info for it. 4603 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4604 if (MPT && PointeeType != MPT->getPointeeType()) { 4605 assert(isa<AdjustedType>(MPT->getPointeeType())); 4606 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4607 } 4608 4609 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4610 NewTL.setSigilLoc(TL.getSigilLoc()); 4611 NewTL.setClassTInfo(NewClsTInfo); 4612 4613 return Result; 4614 } 4615 4616 template<typename Derived> 4617 QualType 4618 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4619 ConstantArrayTypeLoc TL) { 4620 const ConstantArrayType *T = TL.getTypePtr(); 4621 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4622 if (ElementType.isNull()) 4623 return QualType(); 4624 4625 QualType Result = TL.getType(); 4626 if (getDerived().AlwaysRebuild() || 4627 ElementType != T->getElementType()) { 4628 Result = getDerived().RebuildConstantArrayType(ElementType, 4629 T->getSizeModifier(), 4630 T->getSize(), 4631 T->getIndexTypeCVRQualifiers(), 4632 TL.getBracketsRange()); 4633 if (Result.isNull()) 4634 return QualType(); 4635 } 4636 4637 // We might have either a ConstantArrayType or a VariableArrayType now: 4638 // a ConstantArrayType is allowed to have an element type which is a 4639 // VariableArrayType if the type is dependent. Fortunately, all array 4640 // types have the same location layout. 4641 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4642 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4643 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4644 4645 Expr *Size = TL.getSizeExpr(); 4646 if (Size) { 4647 EnterExpressionEvaluationContext Unevaluated( 4648 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4649 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4650 Size = SemaRef.ActOnConstantExpression(Size).get(); 4651 } 4652 NewTL.setSizeExpr(Size); 4653 4654 return Result; 4655 } 4656 4657 template<typename Derived> 4658 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4659 TypeLocBuilder &TLB, 4660 IncompleteArrayTypeLoc TL) { 4661 const IncompleteArrayType *T = TL.getTypePtr(); 4662 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4663 if (ElementType.isNull()) 4664 return QualType(); 4665 4666 QualType Result = TL.getType(); 4667 if (getDerived().AlwaysRebuild() || 4668 ElementType != T->getElementType()) { 4669 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4670 T->getSizeModifier(), 4671 T->getIndexTypeCVRQualifiers(), 4672 TL.getBracketsRange()); 4673 if (Result.isNull()) 4674 return QualType(); 4675 } 4676 4677 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4678 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4679 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4680 NewTL.setSizeExpr(nullptr); 4681 4682 return Result; 4683 } 4684 4685 template<typename Derived> 4686 QualType 4687 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4688 VariableArrayTypeLoc TL) { 4689 const VariableArrayType *T = TL.getTypePtr(); 4690 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4691 if (ElementType.isNull()) 4692 return QualType(); 4693 4694 ExprResult SizeResult; 4695 { 4696 EnterExpressionEvaluationContext Context( 4697 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4698 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4699 } 4700 if (SizeResult.isInvalid()) 4701 return QualType(); 4702 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4703 if (SizeResult.isInvalid()) 4704 return QualType(); 4705 4706 Expr *Size = SizeResult.get(); 4707 4708 QualType Result = TL.getType(); 4709 if (getDerived().AlwaysRebuild() || 4710 ElementType != T->getElementType() || 4711 Size != T->getSizeExpr()) { 4712 Result = getDerived().RebuildVariableArrayType(ElementType, 4713 T->getSizeModifier(), 4714 Size, 4715 T->getIndexTypeCVRQualifiers(), 4716 TL.getBracketsRange()); 4717 if (Result.isNull()) 4718 return QualType(); 4719 } 4720 4721 // We might have constant size array now, but fortunately it has the same 4722 // location layout. 4723 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4724 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4725 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4726 NewTL.setSizeExpr(Size); 4727 4728 return Result; 4729 } 4730 4731 template<typename Derived> 4732 QualType 4733 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4734 DependentSizedArrayTypeLoc TL) { 4735 const DependentSizedArrayType *T = TL.getTypePtr(); 4736 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4737 if (ElementType.isNull()) 4738 return QualType(); 4739 4740 // Array bounds are constant expressions. 4741 EnterExpressionEvaluationContext Unevaluated( 4742 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4743 4744 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4745 Expr *origSize = TL.getSizeExpr(); 4746 if (!origSize) origSize = T->getSizeExpr(); 4747 4748 ExprResult sizeResult 4749 = getDerived().TransformExpr(origSize); 4750 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4751 if (sizeResult.isInvalid()) 4752 return QualType(); 4753 4754 Expr *size = sizeResult.get(); 4755 4756 QualType Result = TL.getType(); 4757 if (getDerived().AlwaysRebuild() || 4758 ElementType != T->getElementType() || 4759 size != origSize) { 4760 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4761 T->getSizeModifier(), 4762 size, 4763 T->getIndexTypeCVRQualifiers(), 4764 TL.getBracketsRange()); 4765 if (Result.isNull()) 4766 return QualType(); 4767 } 4768 4769 // We might have any sort of array type now, but fortunately they 4770 // all have the same location layout. 4771 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4772 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4773 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4774 NewTL.setSizeExpr(size); 4775 4776 return Result; 4777 } 4778 4779 template <typename Derived> 4780 QualType TreeTransform<Derived>::TransformDependentVectorType( 4781 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4782 const DependentVectorType *T = TL.getTypePtr(); 4783 QualType ElementType = getDerived().TransformType(T->getElementType()); 4784 if (ElementType.isNull()) 4785 return QualType(); 4786 4787 EnterExpressionEvaluationContext Unevaluated( 4788 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4789 4790 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4791 Size = SemaRef.ActOnConstantExpression(Size); 4792 if (Size.isInvalid()) 4793 return QualType(); 4794 4795 QualType Result = TL.getType(); 4796 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4797 Size.get() != T->getSizeExpr()) { 4798 Result = getDerived().RebuildDependentVectorType( 4799 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4800 if (Result.isNull()) 4801 return QualType(); 4802 } 4803 4804 // Result might be dependent or not. 4805 if (isa<DependentVectorType>(Result)) { 4806 DependentVectorTypeLoc NewTL = 4807 TLB.push<DependentVectorTypeLoc>(Result); 4808 NewTL.setNameLoc(TL.getNameLoc()); 4809 } else { 4810 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4811 NewTL.setNameLoc(TL.getNameLoc()); 4812 } 4813 4814 return Result; 4815 } 4816 4817 template<typename Derived> 4818 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4819 TypeLocBuilder &TLB, 4820 DependentSizedExtVectorTypeLoc TL) { 4821 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4822 4823 // FIXME: ext vector locs should be nested 4824 QualType ElementType = getDerived().TransformType(T->getElementType()); 4825 if (ElementType.isNull()) 4826 return QualType(); 4827 4828 // Vector sizes are constant expressions. 4829 EnterExpressionEvaluationContext Unevaluated( 4830 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4831 4832 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4833 Size = SemaRef.ActOnConstantExpression(Size); 4834 if (Size.isInvalid()) 4835 return QualType(); 4836 4837 QualType Result = TL.getType(); 4838 if (getDerived().AlwaysRebuild() || 4839 ElementType != T->getElementType() || 4840 Size.get() != T->getSizeExpr()) { 4841 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4842 Size.get(), 4843 T->getAttributeLoc()); 4844 if (Result.isNull()) 4845 return QualType(); 4846 } 4847 4848 // Result might be dependent or not. 4849 if (isa<DependentSizedExtVectorType>(Result)) { 4850 DependentSizedExtVectorTypeLoc NewTL 4851 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4852 NewTL.setNameLoc(TL.getNameLoc()); 4853 } else { 4854 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4855 NewTL.setNameLoc(TL.getNameLoc()); 4856 } 4857 4858 return Result; 4859 } 4860 4861 template <typename Derived> 4862 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4863 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4864 const DependentAddressSpaceType *T = TL.getTypePtr(); 4865 4866 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4867 4868 if (pointeeType.isNull()) 4869 return QualType(); 4870 4871 // Address spaces are constant expressions. 4872 EnterExpressionEvaluationContext Unevaluated( 4873 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4874 4875 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4876 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4877 if (AddrSpace.isInvalid()) 4878 return QualType(); 4879 4880 QualType Result = TL.getType(); 4881 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4882 AddrSpace.get() != T->getAddrSpaceExpr()) { 4883 Result = getDerived().RebuildDependentAddressSpaceType( 4884 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4885 if (Result.isNull()) 4886 return QualType(); 4887 } 4888 4889 // Result might be dependent or not. 4890 if (isa<DependentAddressSpaceType>(Result)) { 4891 DependentAddressSpaceTypeLoc NewTL = 4892 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4893 4894 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4895 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4896 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4897 4898 } else { 4899 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4900 Result, getDerived().getBaseLocation()); 4901 TransformType(TLB, DI->getTypeLoc()); 4902 } 4903 4904 return Result; 4905 } 4906 4907 template <typename Derived> 4908 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4909 VectorTypeLoc TL) { 4910 const VectorType *T = TL.getTypePtr(); 4911 QualType ElementType = getDerived().TransformType(T->getElementType()); 4912 if (ElementType.isNull()) 4913 return QualType(); 4914 4915 QualType Result = TL.getType(); 4916 if (getDerived().AlwaysRebuild() || 4917 ElementType != T->getElementType()) { 4918 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4919 T->getVectorKind()); 4920 if (Result.isNull()) 4921 return QualType(); 4922 } 4923 4924 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4925 NewTL.setNameLoc(TL.getNameLoc()); 4926 4927 return Result; 4928 } 4929 4930 template<typename Derived> 4931 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4932 ExtVectorTypeLoc TL) { 4933 const VectorType *T = TL.getTypePtr(); 4934 QualType ElementType = getDerived().TransformType(T->getElementType()); 4935 if (ElementType.isNull()) 4936 return QualType(); 4937 4938 QualType Result = TL.getType(); 4939 if (getDerived().AlwaysRebuild() || 4940 ElementType != T->getElementType()) { 4941 Result = getDerived().RebuildExtVectorType(ElementType, 4942 T->getNumElements(), 4943 /*FIXME*/ SourceLocation()); 4944 if (Result.isNull()) 4945 return QualType(); 4946 } 4947 4948 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4949 NewTL.setNameLoc(TL.getNameLoc()); 4950 4951 return Result; 4952 } 4953 4954 template <typename Derived> 4955 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4956 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4957 bool ExpectParameterPack) { 4958 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4959 TypeSourceInfo *NewDI = nullptr; 4960 4961 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4962 // If we're substituting into a pack expansion type and we know the 4963 // length we want to expand to, just substitute for the pattern. 4964 TypeLoc OldTL = OldDI->getTypeLoc(); 4965 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4966 4967 TypeLocBuilder TLB; 4968 TypeLoc NewTL = OldDI->getTypeLoc(); 4969 TLB.reserve(NewTL.getFullDataSize()); 4970 4971 QualType Result = getDerived().TransformType(TLB, 4972 OldExpansionTL.getPatternLoc()); 4973 if (Result.isNull()) 4974 return nullptr; 4975 4976 Result = RebuildPackExpansionType(Result, 4977 OldExpansionTL.getPatternLoc().getSourceRange(), 4978 OldExpansionTL.getEllipsisLoc(), 4979 NumExpansions); 4980 if (Result.isNull()) 4981 return nullptr; 4982 4983 PackExpansionTypeLoc NewExpansionTL 4984 = TLB.push<PackExpansionTypeLoc>(Result); 4985 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4986 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4987 } else 4988 NewDI = getDerived().TransformType(OldDI); 4989 if (!NewDI) 4990 return nullptr; 4991 4992 if (NewDI == OldDI && indexAdjustment == 0) 4993 return OldParm; 4994 4995 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4996 OldParm->getDeclContext(), 4997 OldParm->getInnerLocStart(), 4998 OldParm->getLocation(), 4999 OldParm->getIdentifier(), 5000 NewDI->getType(), 5001 NewDI, 5002 OldParm->getStorageClass(), 5003 /* DefArg */ nullptr); 5004 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5005 OldParm->getFunctionScopeIndex() + indexAdjustment); 5006 return newParm; 5007 } 5008 5009 template <typename Derived> 5010 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5011 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5012 const QualType *ParamTypes, 5013 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5014 SmallVectorImpl<QualType> &OutParamTypes, 5015 SmallVectorImpl<ParmVarDecl *> *PVars, 5016 Sema::ExtParameterInfoBuilder &PInfos) { 5017 int indexAdjustment = 0; 5018 5019 unsigned NumParams = Params.size(); 5020 for (unsigned i = 0; i != NumParams; ++i) { 5021 if (ParmVarDecl *OldParm = Params[i]) { 5022 assert(OldParm->getFunctionScopeIndex() == i); 5023 5024 Optional<unsigned> NumExpansions; 5025 ParmVarDecl *NewParm = nullptr; 5026 if (OldParm->isParameterPack()) { 5027 // We have a function parameter pack that may need to be expanded. 5028 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5029 5030 // Find the parameter packs that could be expanded. 5031 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5032 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5033 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5034 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5035 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5036 5037 // Determine whether we should expand the parameter packs. 5038 bool ShouldExpand = false; 5039 bool RetainExpansion = false; 5040 Optional<unsigned> OrigNumExpansions = 5041 ExpansionTL.getTypePtr()->getNumExpansions(); 5042 NumExpansions = OrigNumExpansions; 5043 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5044 Pattern.getSourceRange(), 5045 Unexpanded, 5046 ShouldExpand, 5047 RetainExpansion, 5048 NumExpansions)) { 5049 return true; 5050 } 5051 5052 if (ShouldExpand) { 5053 // Expand the function parameter pack into multiple, separate 5054 // parameters. 5055 getDerived().ExpandingFunctionParameterPack(OldParm); 5056 for (unsigned I = 0; I != *NumExpansions; ++I) { 5057 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5058 ParmVarDecl *NewParm 5059 = getDerived().TransformFunctionTypeParam(OldParm, 5060 indexAdjustment++, 5061 OrigNumExpansions, 5062 /*ExpectParameterPack=*/false); 5063 if (!NewParm) 5064 return true; 5065 5066 if (ParamInfos) 5067 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5068 OutParamTypes.push_back(NewParm->getType()); 5069 if (PVars) 5070 PVars->push_back(NewParm); 5071 } 5072 5073 // If we're supposed to retain a pack expansion, do so by temporarily 5074 // forgetting the partially-substituted parameter pack. 5075 if (RetainExpansion) { 5076 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5077 ParmVarDecl *NewParm 5078 = getDerived().TransformFunctionTypeParam(OldParm, 5079 indexAdjustment++, 5080 OrigNumExpansions, 5081 /*ExpectParameterPack=*/false); 5082 if (!NewParm) 5083 return true; 5084 5085 if (ParamInfos) 5086 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5087 OutParamTypes.push_back(NewParm->getType()); 5088 if (PVars) 5089 PVars->push_back(NewParm); 5090 } 5091 5092 // The next parameter should have the same adjustment as the 5093 // last thing we pushed, but we post-incremented indexAdjustment 5094 // on every push. Also, if we push nothing, the adjustment should 5095 // go down by one. 5096 indexAdjustment--; 5097 5098 // We're done with the pack expansion. 5099 continue; 5100 } 5101 5102 // We'll substitute the parameter now without expanding the pack 5103 // expansion. 5104 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5105 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5106 indexAdjustment, 5107 NumExpansions, 5108 /*ExpectParameterPack=*/true); 5109 } else { 5110 NewParm = getDerived().TransformFunctionTypeParam( 5111 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5112 } 5113 5114 if (!NewParm) 5115 return true; 5116 5117 if (ParamInfos) 5118 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5119 OutParamTypes.push_back(NewParm->getType()); 5120 if (PVars) 5121 PVars->push_back(NewParm); 5122 continue; 5123 } 5124 5125 // Deal with the possibility that we don't have a parameter 5126 // declaration for this parameter. 5127 QualType OldType = ParamTypes[i]; 5128 bool IsPackExpansion = false; 5129 Optional<unsigned> NumExpansions; 5130 QualType NewType; 5131 if (const PackExpansionType *Expansion 5132 = dyn_cast<PackExpansionType>(OldType)) { 5133 // We have a function parameter pack that may need to be expanded. 5134 QualType Pattern = Expansion->getPattern(); 5135 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5136 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5137 5138 // Determine whether we should expand the parameter packs. 5139 bool ShouldExpand = false; 5140 bool RetainExpansion = false; 5141 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5142 Unexpanded, 5143 ShouldExpand, 5144 RetainExpansion, 5145 NumExpansions)) { 5146 return true; 5147 } 5148 5149 if (ShouldExpand) { 5150 // Expand the function parameter pack into multiple, separate 5151 // parameters. 5152 for (unsigned I = 0; I != *NumExpansions; ++I) { 5153 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5154 QualType NewType = getDerived().TransformType(Pattern); 5155 if (NewType.isNull()) 5156 return true; 5157 5158 if (NewType->containsUnexpandedParameterPack()) { 5159 NewType = 5160 getSema().getASTContext().getPackExpansionType(NewType, None); 5161 5162 if (NewType.isNull()) 5163 return true; 5164 } 5165 5166 if (ParamInfos) 5167 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5168 OutParamTypes.push_back(NewType); 5169 if (PVars) 5170 PVars->push_back(nullptr); 5171 } 5172 5173 // We're done with the pack expansion. 5174 continue; 5175 } 5176 5177 // If we're supposed to retain a pack expansion, do so by temporarily 5178 // forgetting the partially-substituted parameter pack. 5179 if (RetainExpansion) { 5180 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5181 QualType NewType = getDerived().TransformType(Pattern); 5182 if (NewType.isNull()) 5183 return true; 5184 5185 if (ParamInfos) 5186 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5187 OutParamTypes.push_back(NewType); 5188 if (PVars) 5189 PVars->push_back(nullptr); 5190 } 5191 5192 // We'll substitute the parameter now without expanding the pack 5193 // expansion. 5194 OldType = Expansion->getPattern(); 5195 IsPackExpansion = true; 5196 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5197 NewType = getDerived().TransformType(OldType); 5198 } else { 5199 NewType = getDerived().TransformType(OldType); 5200 } 5201 5202 if (NewType.isNull()) 5203 return true; 5204 5205 if (IsPackExpansion) 5206 NewType = getSema().Context.getPackExpansionType(NewType, 5207 NumExpansions); 5208 5209 if (ParamInfos) 5210 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5211 OutParamTypes.push_back(NewType); 5212 if (PVars) 5213 PVars->push_back(nullptr); 5214 } 5215 5216 #ifndef NDEBUG 5217 if (PVars) { 5218 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5219 if (ParmVarDecl *parm = (*PVars)[i]) 5220 assert(parm->getFunctionScopeIndex() == i); 5221 } 5222 #endif 5223 5224 return false; 5225 } 5226 5227 template<typename Derived> 5228 QualType 5229 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5230 FunctionProtoTypeLoc TL) { 5231 SmallVector<QualType, 4> ExceptionStorage; 5232 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5233 return getDerived().TransformFunctionProtoType( 5234 TLB, TL, nullptr, 0, 5235 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5236 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5237 ExceptionStorage, Changed); 5238 }); 5239 } 5240 5241 template<typename Derived> template<typename Fn> 5242 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5243 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5244 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5245 5246 // Transform the parameters and return type. 5247 // 5248 // We are required to instantiate the params and return type in source order. 5249 // When the function has a trailing return type, we instantiate the 5250 // parameters before the return type, since the return type can then refer 5251 // to the parameters themselves (via decltype, sizeof, etc.). 5252 // 5253 SmallVector<QualType, 4> ParamTypes; 5254 SmallVector<ParmVarDecl*, 4> ParamDecls; 5255 Sema::ExtParameterInfoBuilder ExtParamInfos; 5256 const FunctionProtoType *T = TL.getTypePtr(); 5257 5258 QualType ResultType; 5259 5260 if (T->hasTrailingReturn()) { 5261 if (getDerived().TransformFunctionTypeParams( 5262 TL.getBeginLoc(), TL.getParams(), 5263 TL.getTypePtr()->param_type_begin(), 5264 T->getExtParameterInfosOrNull(), 5265 ParamTypes, &ParamDecls, ExtParamInfos)) 5266 return QualType(); 5267 5268 { 5269 // C++11 [expr.prim.general]p3: 5270 // If a declaration declares a member function or member function 5271 // template of a class X, the expression this is a prvalue of type 5272 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5273 // and the end of the function-definition, member-declarator, or 5274 // declarator. 5275 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5276 5277 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5278 if (ResultType.isNull()) 5279 return QualType(); 5280 } 5281 } 5282 else { 5283 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5284 if (ResultType.isNull()) 5285 return QualType(); 5286 5287 if (getDerived().TransformFunctionTypeParams( 5288 TL.getBeginLoc(), TL.getParams(), 5289 TL.getTypePtr()->param_type_begin(), 5290 T->getExtParameterInfosOrNull(), 5291 ParamTypes, &ParamDecls, ExtParamInfos)) 5292 return QualType(); 5293 } 5294 5295 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5296 5297 bool EPIChanged = false; 5298 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5299 return QualType(); 5300 5301 // Handle extended parameter information. 5302 if (auto NewExtParamInfos = 5303 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5304 if (!EPI.ExtParameterInfos || 5305 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5306 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5307 EPIChanged = true; 5308 } 5309 EPI.ExtParameterInfos = NewExtParamInfos; 5310 } else if (EPI.ExtParameterInfos) { 5311 EPIChanged = true; 5312 EPI.ExtParameterInfos = nullptr; 5313 } 5314 5315 QualType Result = TL.getType(); 5316 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5317 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5318 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5319 if (Result.isNull()) 5320 return QualType(); 5321 } 5322 5323 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5324 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5325 NewTL.setLParenLoc(TL.getLParenLoc()); 5326 NewTL.setRParenLoc(TL.getRParenLoc()); 5327 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5328 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5329 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5330 NewTL.setParam(i, ParamDecls[i]); 5331 5332 return Result; 5333 } 5334 5335 template<typename Derived> 5336 bool TreeTransform<Derived>::TransformExceptionSpec( 5337 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5338 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5339 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5340 5341 // Instantiate a dynamic noexcept expression, if any. 5342 if (isComputedNoexcept(ESI.Type)) { 5343 EnterExpressionEvaluationContext Unevaluated( 5344 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5345 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5346 if (NoexceptExpr.isInvalid()) 5347 return true; 5348 5349 ExceptionSpecificationType EST = ESI.Type; 5350 NoexceptExpr = 5351 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5352 if (NoexceptExpr.isInvalid()) 5353 return true; 5354 5355 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5356 Changed = true; 5357 ESI.NoexceptExpr = NoexceptExpr.get(); 5358 ESI.Type = EST; 5359 } 5360 5361 if (ESI.Type != EST_Dynamic) 5362 return false; 5363 5364 // Instantiate a dynamic exception specification's type. 5365 for (QualType T : ESI.Exceptions) { 5366 if (const PackExpansionType *PackExpansion = 5367 T->getAs<PackExpansionType>()) { 5368 Changed = true; 5369 5370 // We have a pack expansion. Instantiate it. 5371 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5372 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5373 Unexpanded); 5374 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5375 5376 // Determine whether the set of unexpanded parameter packs can and 5377 // should 5378 // be expanded. 5379 bool Expand = false; 5380 bool RetainExpansion = false; 5381 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5382 // FIXME: Track the location of the ellipsis (and track source location 5383 // information for the types in the exception specification in general). 5384 if (getDerived().TryExpandParameterPacks( 5385 Loc, SourceRange(), Unexpanded, Expand, 5386 RetainExpansion, NumExpansions)) 5387 return true; 5388 5389 if (!Expand) { 5390 // We can't expand this pack expansion into separate arguments yet; 5391 // just substitute into the pattern and create a new pack expansion 5392 // type. 5393 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5394 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5395 if (U.isNull()) 5396 return true; 5397 5398 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5399 Exceptions.push_back(U); 5400 continue; 5401 } 5402 5403 // Substitute into the pack expansion pattern for each slice of the 5404 // pack. 5405 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5406 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5407 5408 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5409 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5410 return true; 5411 5412 Exceptions.push_back(U); 5413 } 5414 } else { 5415 QualType U = getDerived().TransformType(T); 5416 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5417 return true; 5418 if (T != U) 5419 Changed = true; 5420 5421 Exceptions.push_back(U); 5422 } 5423 } 5424 5425 ESI.Exceptions = Exceptions; 5426 if (ESI.Exceptions.empty()) 5427 ESI.Type = EST_DynamicNone; 5428 return false; 5429 } 5430 5431 template<typename Derived> 5432 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5433 TypeLocBuilder &TLB, 5434 FunctionNoProtoTypeLoc TL) { 5435 const FunctionNoProtoType *T = TL.getTypePtr(); 5436 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5437 if (ResultType.isNull()) 5438 return QualType(); 5439 5440 QualType Result = TL.getType(); 5441 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5442 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5443 5444 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5445 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5446 NewTL.setLParenLoc(TL.getLParenLoc()); 5447 NewTL.setRParenLoc(TL.getRParenLoc()); 5448 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5449 5450 return Result; 5451 } 5452 5453 template<typename Derived> QualType 5454 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5455 UnresolvedUsingTypeLoc TL) { 5456 const UnresolvedUsingType *T = TL.getTypePtr(); 5457 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5458 if (!D) 5459 return QualType(); 5460 5461 QualType Result = TL.getType(); 5462 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5463 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5464 if (Result.isNull()) 5465 return QualType(); 5466 } 5467 5468 // We might get an arbitrary type spec type back. We should at 5469 // least always get a type spec type, though. 5470 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5471 NewTL.setNameLoc(TL.getNameLoc()); 5472 5473 return Result; 5474 } 5475 5476 template<typename Derived> 5477 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5478 TypedefTypeLoc TL) { 5479 const TypedefType *T = TL.getTypePtr(); 5480 TypedefNameDecl *Typedef 5481 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5482 T->getDecl())); 5483 if (!Typedef) 5484 return QualType(); 5485 5486 QualType Result = TL.getType(); 5487 if (getDerived().AlwaysRebuild() || 5488 Typedef != T->getDecl()) { 5489 Result = getDerived().RebuildTypedefType(Typedef); 5490 if (Result.isNull()) 5491 return QualType(); 5492 } 5493 5494 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5495 NewTL.setNameLoc(TL.getNameLoc()); 5496 5497 return Result; 5498 } 5499 5500 template<typename Derived> 5501 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5502 TypeOfExprTypeLoc TL) { 5503 // typeof expressions are not potentially evaluated contexts 5504 EnterExpressionEvaluationContext Unevaluated( 5505 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5506 Sema::ReuseLambdaContextDecl); 5507 5508 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5509 if (E.isInvalid()) 5510 return QualType(); 5511 5512 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5513 if (E.isInvalid()) 5514 return QualType(); 5515 5516 QualType Result = TL.getType(); 5517 if (getDerived().AlwaysRebuild() || 5518 E.get() != TL.getUnderlyingExpr()) { 5519 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5520 if (Result.isNull()) 5521 return QualType(); 5522 } 5523 else E.get(); 5524 5525 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5526 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5527 NewTL.setLParenLoc(TL.getLParenLoc()); 5528 NewTL.setRParenLoc(TL.getRParenLoc()); 5529 5530 return Result; 5531 } 5532 5533 template<typename Derived> 5534 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5535 TypeOfTypeLoc TL) { 5536 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5537 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5538 if (!New_Under_TI) 5539 return QualType(); 5540 5541 QualType Result = TL.getType(); 5542 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5543 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5544 if (Result.isNull()) 5545 return QualType(); 5546 } 5547 5548 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5549 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5550 NewTL.setLParenLoc(TL.getLParenLoc()); 5551 NewTL.setRParenLoc(TL.getRParenLoc()); 5552 NewTL.setUnderlyingTInfo(New_Under_TI); 5553 5554 return Result; 5555 } 5556 5557 template<typename Derived> 5558 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5559 DecltypeTypeLoc TL) { 5560 const DecltypeType *T = TL.getTypePtr(); 5561 5562 // decltype expressions are not potentially evaluated contexts 5563 EnterExpressionEvaluationContext Unevaluated( 5564 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5565 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5566 5567 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5568 if (E.isInvalid()) 5569 return QualType(); 5570 5571 E = getSema().ActOnDecltypeExpression(E.get()); 5572 if (E.isInvalid()) 5573 return QualType(); 5574 5575 QualType Result = TL.getType(); 5576 if (getDerived().AlwaysRebuild() || 5577 E.get() != T->getUnderlyingExpr()) { 5578 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5579 if (Result.isNull()) 5580 return QualType(); 5581 } 5582 else E.get(); 5583 5584 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5585 NewTL.setNameLoc(TL.getNameLoc()); 5586 5587 return Result; 5588 } 5589 5590 template<typename Derived> 5591 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5592 TypeLocBuilder &TLB, 5593 UnaryTransformTypeLoc TL) { 5594 QualType Result = TL.getType(); 5595 if (Result->isDependentType()) { 5596 const UnaryTransformType *T = TL.getTypePtr(); 5597 QualType NewBase = 5598 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5599 Result = getDerived().RebuildUnaryTransformType(NewBase, 5600 T->getUTTKind(), 5601 TL.getKWLoc()); 5602 if (Result.isNull()) 5603 return QualType(); 5604 } 5605 5606 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5607 NewTL.setKWLoc(TL.getKWLoc()); 5608 NewTL.setParensRange(TL.getParensRange()); 5609 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5610 return Result; 5611 } 5612 5613 template<typename Derived> 5614 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5615 AutoTypeLoc TL) { 5616 const AutoType *T = TL.getTypePtr(); 5617 QualType OldDeduced = T->getDeducedType(); 5618 QualType NewDeduced; 5619 if (!OldDeduced.isNull()) { 5620 NewDeduced = getDerived().TransformType(OldDeduced); 5621 if (NewDeduced.isNull()) 5622 return QualType(); 5623 } 5624 5625 QualType Result = TL.getType(); 5626 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5627 T->isDependentType()) { 5628 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5629 if (Result.isNull()) 5630 return QualType(); 5631 } 5632 5633 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5634 NewTL.setNameLoc(TL.getNameLoc()); 5635 5636 return Result; 5637 } 5638 5639 template<typename Derived> 5640 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5641 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5642 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5643 5644 CXXScopeSpec SS; 5645 TemplateName TemplateName = getDerived().TransformTemplateName( 5646 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5647 if (TemplateName.isNull()) 5648 return QualType(); 5649 5650 QualType OldDeduced = T->getDeducedType(); 5651 QualType NewDeduced; 5652 if (!OldDeduced.isNull()) { 5653 NewDeduced = getDerived().TransformType(OldDeduced); 5654 if (NewDeduced.isNull()) 5655 return QualType(); 5656 } 5657 5658 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5659 TemplateName, NewDeduced); 5660 if (Result.isNull()) 5661 return QualType(); 5662 5663 DeducedTemplateSpecializationTypeLoc NewTL = 5664 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5665 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5666 5667 return Result; 5668 } 5669 5670 template<typename Derived> 5671 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5672 RecordTypeLoc TL) { 5673 const RecordType *T = TL.getTypePtr(); 5674 RecordDecl *Record 5675 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5676 T->getDecl())); 5677 if (!Record) 5678 return QualType(); 5679 5680 QualType Result = TL.getType(); 5681 if (getDerived().AlwaysRebuild() || 5682 Record != T->getDecl()) { 5683 Result = getDerived().RebuildRecordType(Record); 5684 if (Result.isNull()) 5685 return QualType(); 5686 } 5687 5688 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5689 NewTL.setNameLoc(TL.getNameLoc()); 5690 5691 return Result; 5692 } 5693 5694 template<typename Derived> 5695 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5696 EnumTypeLoc TL) { 5697 const EnumType *T = TL.getTypePtr(); 5698 EnumDecl *Enum 5699 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5700 T->getDecl())); 5701 if (!Enum) 5702 return QualType(); 5703 5704 QualType Result = TL.getType(); 5705 if (getDerived().AlwaysRebuild() || 5706 Enum != T->getDecl()) { 5707 Result = getDerived().RebuildEnumType(Enum); 5708 if (Result.isNull()) 5709 return QualType(); 5710 } 5711 5712 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5713 NewTL.setNameLoc(TL.getNameLoc()); 5714 5715 return Result; 5716 } 5717 5718 template<typename Derived> 5719 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5720 TypeLocBuilder &TLB, 5721 InjectedClassNameTypeLoc TL) { 5722 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5723 TL.getTypePtr()->getDecl()); 5724 if (!D) return QualType(); 5725 5726 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5727 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5728 return T; 5729 } 5730 5731 template<typename Derived> 5732 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5733 TypeLocBuilder &TLB, 5734 TemplateTypeParmTypeLoc TL) { 5735 return TransformTypeSpecType(TLB, TL); 5736 } 5737 5738 template<typename Derived> 5739 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5740 TypeLocBuilder &TLB, 5741 SubstTemplateTypeParmTypeLoc TL) { 5742 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5743 5744 // Substitute into the replacement type, which itself might involve something 5745 // that needs to be transformed. This only tends to occur with default 5746 // template arguments of template template parameters. 5747 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5748 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5749 if (Replacement.isNull()) 5750 return QualType(); 5751 5752 // Always canonicalize the replacement type. 5753 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5754 QualType Result 5755 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5756 Replacement); 5757 5758 // Propagate type-source information. 5759 SubstTemplateTypeParmTypeLoc NewTL 5760 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5761 NewTL.setNameLoc(TL.getNameLoc()); 5762 return Result; 5763 5764 } 5765 5766 template<typename Derived> 5767 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5768 TypeLocBuilder &TLB, 5769 SubstTemplateTypeParmPackTypeLoc TL) { 5770 return TransformTypeSpecType(TLB, TL); 5771 } 5772 5773 template<typename Derived> 5774 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5775 TypeLocBuilder &TLB, 5776 TemplateSpecializationTypeLoc TL) { 5777 const TemplateSpecializationType *T = TL.getTypePtr(); 5778 5779 // The nested-name-specifier never matters in a TemplateSpecializationType, 5780 // because we can't have a dependent nested-name-specifier anyway. 5781 CXXScopeSpec SS; 5782 TemplateName Template 5783 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5784 TL.getTemplateNameLoc()); 5785 if (Template.isNull()) 5786 return QualType(); 5787 5788 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5789 } 5790 5791 template<typename Derived> 5792 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5793 AtomicTypeLoc TL) { 5794 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5795 if (ValueType.isNull()) 5796 return QualType(); 5797 5798 QualType Result = TL.getType(); 5799 if (getDerived().AlwaysRebuild() || 5800 ValueType != TL.getValueLoc().getType()) { 5801 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5802 if (Result.isNull()) 5803 return QualType(); 5804 } 5805 5806 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5807 NewTL.setKWLoc(TL.getKWLoc()); 5808 NewTL.setLParenLoc(TL.getLParenLoc()); 5809 NewTL.setRParenLoc(TL.getRParenLoc()); 5810 5811 return Result; 5812 } 5813 5814 template <typename Derived> 5815 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5816 PipeTypeLoc TL) { 5817 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5818 if (ValueType.isNull()) 5819 return QualType(); 5820 5821 QualType Result = TL.getType(); 5822 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5823 const PipeType *PT = Result->getAs<PipeType>(); 5824 bool isReadPipe = PT->isReadOnly(); 5825 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5826 if (Result.isNull()) 5827 return QualType(); 5828 } 5829 5830 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5831 NewTL.setKWLoc(TL.getKWLoc()); 5832 5833 return Result; 5834 } 5835 5836 /// Simple iterator that traverses the template arguments in a 5837 /// container that provides a \c getArgLoc() member function. 5838 /// 5839 /// This iterator is intended to be used with the iterator form of 5840 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5841 template<typename ArgLocContainer> 5842 class TemplateArgumentLocContainerIterator { 5843 ArgLocContainer *Container; 5844 unsigned Index; 5845 5846 public: 5847 typedef TemplateArgumentLoc value_type; 5848 typedef TemplateArgumentLoc reference; 5849 typedef int difference_type; 5850 typedef std::input_iterator_tag iterator_category; 5851 5852 class pointer { 5853 TemplateArgumentLoc Arg; 5854 5855 public: 5856 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5857 5858 const TemplateArgumentLoc *operator->() const { 5859 return &Arg; 5860 } 5861 }; 5862 5863 5864 TemplateArgumentLocContainerIterator() {} 5865 5866 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5867 unsigned Index) 5868 : Container(&Container), Index(Index) { } 5869 5870 TemplateArgumentLocContainerIterator &operator++() { 5871 ++Index; 5872 return *this; 5873 } 5874 5875 TemplateArgumentLocContainerIterator operator++(int) { 5876 TemplateArgumentLocContainerIterator Old(*this); 5877 ++(*this); 5878 return Old; 5879 } 5880 5881 TemplateArgumentLoc operator*() const { 5882 return Container->getArgLoc(Index); 5883 } 5884 5885 pointer operator->() const { 5886 return pointer(Container->getArgLoc(Index)); 5887 } 5888 5889 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5890 const TemplateArgumentLocContainerIterator &Y) { 5891 return X.Container == Y.Container && X.Index == Y.Index; 5892 } 5893 5894 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5895 const TemplateArgumentLocContainerIterator &Y) { 5896 return !(X == Y); 5897 } 5898 }; 5899 5900 5901 template <typename Derived> 5902 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5903 TypeLocBuilder &TLB, 5904 TemplateSpecializationTypeLoc TL, 5905 TemplateName Template) { 5906 TemplateArgumentListInfo NewTemplateArgs; 5907 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5908 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5909 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5910 ArgIterator; 5911 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5912 ArgIterator(TL, TL.getNumArgs()), 5913 NewTemplateArgs)) 5914 return QualType(); 5915 5916 // FIXME: maybe don't rebuild if all the template arguments are the same. 5917 5918 QualType Result = 5919 getDerived().RebuildTemplateSpecializationType(Template, 5920 TL.getTemplateNameLoc(), 5921 NewTemplateArgs); 5922 5923 if (!Result.isNull()) { 5924 // Specializations of template template parameters are represented as 5925 // TemplateSpecializationTypes, and substitution of type alias templates 5926 // within a dependent context can transform them into 5927 // DependentTemplateSpecializationTypes. 5928 if (isa<DependentTemplateSpecializationType>(Result)) { 5929 DependentTemplateSpecializationTypeLoc NewTL 5930 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5931 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5932 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5933 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5934 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5935 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5936 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5937 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5938 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5939 return Result; 5940 } 5941 5942 TemplateSpecializationTypeLoc NewTL 5943 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5944 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5945 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5946 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5947 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5948 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5949 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5950 } 5951 5952 return Result; 5953 } 5954 5955 template <typename Derived> 5956 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5957 TypeLocBuilder &TLB, 5958 DependentTemplateSpecializationTypeLoc TL, 5959 TemplateName Template, 5960 CXXScopeSpec &SS) { 5961 TemplateArgumentListInfo NewTemplateArgs; 5962 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5963 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5964 typedef TemplateArgumentLocContainerIterator< 5965 DependentTemplateSpecializationTypeLoc> ArgIterator; 5966 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5967 ArgIterator(TL, TL.getNumArgs()), 5968 NewTemplateArgs)) 5969 return QualType(); 5970 5971 // FIXME: maybe don't rebuild if all the template arguments are the same. 5972 5973 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5974 QualType Result 5975 = getSema().Context.getDependentTemplateSpecializationType( 5976 TL.getTypePtr()->getKeyword(), 5977 DTN->getQualifier(), 5978 DTN->getIdentifier(), 5979 NewTemplateArgs); 5980 5981 DependentTemplateSpecializationTypeLoc NewTL 5982 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5983 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5984 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5985 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5986 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5987 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5988 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5989 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5990 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5991 return Result; 5992 } 5993 5994 QualType Result 5995 = getDerived().RebuildTemplateSpecializationType(Template, 5996 TL.getTemplateNameLoc(), 5997 NewTemplateArgs); 5998 5999 if (!Result.isNull()) { 6000 /// FIXME: Wrap this in an elaborated-type-specifier? 6001 TemplateSpecializationTypeLoc NewTL 6002 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6003 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6004 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6005 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6006 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6007 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6008 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6009 } 6010 6011 return Result; 6012 } 6013 6014 template<typename Derived> 6015 QualType 6016 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6017 ElaboratedTypeLoc TL) { 6018 const ElaboratedType *T = TL.getTypePtr(); 6019 6020 NestedNameSpecifierLoc QualifierLoc; 6021 // NOTE: the qualifier in an ElaboratedType is optional. 6022 if (TL.getQualifierLoc()) { 6023 QualifierLoc 6024 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6025 if (!QualifierLoc) 6026 return QualType(); 6027 } 6028 6029 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6030 if (NamedT.isNull()) 6031 return QualType(); 6032 6033 // C++0x [dcl.type.elab]p2: 6034 // If the identifier resolves to a typedef-name or the simple-template-id 6035 // resolves to an alias template specialization, the 6036 // elaborated-type-specifier is ill-formed. 6037 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6038 if (const TemplateSpecializationType *TST = 6039 NamedT->getAs<TemplateSpecializationType>()) { 6040 TemplateName Template = TST->getTemplateName(); 6041 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6042 Template.getAsTemplateDecl())) { 6043 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6044 diag::err_tag_reference_non_tag) 6045 << TAT << Sema::NTK_TypeAliasTemplate 6046 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6047 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6048 } 6049 } 6050 } 6051 6052 QualType Result = TL.getType(); 6053 if (getDerived().AlwaysRebuild() || 6054 QualifierLoc != TL.getQualifierLoc() || 6055 NamedT != T->getNamedType()) { 6056 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6057 T->getKeyword(), 6058 QualifierLoc, NamedT); 6059 if (Result.isNull()) 6060 return QualType(); 6061 } 6062 6063 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6064 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6065 NewTL.setQualifierLoc(QualifierLoc); 6066 return Result; 6067 } 6068 6069 template<typename Derived> 6070 QualType TreeTransform<Derived>::TransformAttributedType( 6071 TypeLocBuilder &TLB, 6072 AttributedTypeLoc TL) { 6073 const AttributedType *oldType = TL.getTypePtr(); 6074 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6075 if (modifiedType.isNull()) 6076 return QualType(); 6077 6078 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6079 const Attr *oldAttr = TL.getAttr(); 6080 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6081 if (oldAttr && !newAttr) 6082 return QualType(); 6083 6084 QualType result = TL.getType(); 6085 6086 // FIXME: dependent operand expressions? 6087 if (getDerived().AlwaysRebuild() || 6088 modifiedType != oldType->getModifiedType()) { 6089 // TODO: this is really lame; we should really be rebuilding the 6090 // equivalent type from first principles. 6091 QualType equivalentType 6092 = getDerived().TransformType(oldType->getEquivalentType()); 6093 if (equivalentType.isNull()) 6094 return QualType(); 6095 6096 // Check whether we can add nullability; it is only represented as 6097 // type sugar, and therefore cannot be diagnosed in any other way. 6098 if (auto nullability = oldType->getImmediateNullability()) { 6099 if (!modifiedType->canHaveNullability()) { 6100 SemaRef.Diag(TL.getAttr()->getLocation(), 6101 diag::err_nullability_nonpointer) 6102 << DiagNullabilityKind(*nullability, false) << modifiedType; 6103 return QualType(); 6104 } 6105 } 6106 6107 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6108 modifiedType, 6109 equivalentType); 6110 } 6111 6112 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6113 newTL.setAttr(newAttr); 6114 return result; 6115 } 6116 6117 template<typename Derived> 6118 QualType 6119 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6120 ParenTypeLoc TL) { 6121 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6122 if (Inner.isNull()) 6123 return QualType(); 6124 6125 QualType Result = TL.getType(); 6126 if (getDerived().AlwaysRebuild() || 6127 Inner != TL.getInnerLoc().getType()) { 6128 Result = getDerived().RebuildParenType(Inner); 6129 if (Result.isNull()) 6130 return QualType(); 6131 } 6132 6133 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6134 NewTL.setLParenLoc(TL.getLParenLoc()); 6135 NewTL.setRParenLoc(TL.getRParenLoc()); 6136 return Result; 6137 } 6138 6139 template<typename Derived> 6140 QualType TreeTransform<Derived>::TransformDependentNameType( 6141 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6142 return TransformDependentNameType(TLB, TL, false); 6143 } 6144 6145 template<typename Derived> 6146 QualType TreeTransform<Derived>::TransformDependentNameType( 6147 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6148 const DependentNameType *T = TL.getTypePtr(); 6149 6150 NestedNameSpecifierLoc QualifierLoc 6151 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6152 if (!QualifierLoc) 6153 return QualType(); 6154 6155 QualType Result 6156 = getDerived().RebuildDependentNameType(T->getKeyword(), 6157 TL.getElaboratedKeywordLoc(), 6158 QualifierLoc, 6159 T->getIdentifier(), 6160 TL.getNameLoc(), 6161 DeducedTSTContext); 6162 if (Result.isNull()) 6163 return QualType(); 6164 6165 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6166 QualType NamedT = ElabT->getNamedType(); 6167 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6168 6169 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6170 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6171 NewTL.setQualifierLoc(QualifierLoc); 6172 } else { 6173 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6174 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6175 NewTL.setQualifierLoc(QualifierLoc); 6176 NewTL.setNameLoc(TL.getNameLoc()); 6177 } 6178 return Result; 6179 } 6180 6181 template<typename Derived> 6182 QualType TreeTransform<Derived>:: 6183 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6184 DependentTemplateSpecializationTypeLoc TL) { 6185 NestedNameSpecifierLoc QualifierLoc; 6186 if (TL.getQualifierLoc()) { 6187 QualifierLoc 6188 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6189 if (!QualifierLoc) 6190 return QualType(); 6191 } 6192 6193 return getDerived() 6194 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6195 } 6196 6197 template<typename Derived> 6198 QualType TreeTransform<Derived>:: 6199 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6200 DependentTemplateSpecializationTypeLoc TL, 6201 NestedNameSpecifierLoc QualifierLoc) { 6202 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6203 6204 TemplateArgumentListInfo NewTemplateArgs; 6205 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6206 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6207 6208 typedef TemplateArgumentLocContainerIterator< 6209 DependentTemplateSpecializationTypeLoc> ArgIterator; 6210 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6211 ArgIterator(TL, TL.getNumArgs()), 6212 NewTemplateArgs)) 6213 return QualType(); 6214 6215 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6216 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6217 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6218 /*AllowInjectedClassName*/ false); 6219 if (Result.isNull()) 6220 return QualType(); 6221 6222 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6223 QualType NamedT = ElabT->getNamedType(); 6224 6225 // Copy information relevant to the template specialization. 6226 TemplateSpecializationTypeLoc NamedTL 6227 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6228 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6229 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6230 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6231 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6232 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6233 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6234 6235 // Copy information relevant to the elaborated type. 6236 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6237 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6238 NewTL.setQualifierLoc(QualifierLoc); 6239 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6240 DependentTemplateSpecializationTypeLoc SpecTL 6241 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6242 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6243 SpecTL.setQualifierLoc(QualifierLoc); 6244 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6245 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6246 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6247 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6248 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6249 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6250 } else { 6251 TemplateSpecializationTypeLoc SpecTL 6252 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6253 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6254 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6255 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6256 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6257 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6258 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6259 } 6260 return Result; 6261 } 6262 6263 template<typename Derived> 6264 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6265 PackExpansionTypeLoc TL) { 6266 QualType Pattern 6267 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6268 if (Pattern.isNull()) 6269 return QualType(); 6270 6271 QualType Result = TL.getType(); 6272 if (getDerived().AlwaysRebuild() || 6273 Pattern != TL.getPatternLoc().getType()) { 6274 Result = getDerived().RebuildPackExpansionType(Pattern, 6275 TL.getPatternLoc().getSourceRange(), 6276 TL.getEllipsisLoc(), 6277 TL.getTypePtr()->getNumExpansions()); 6278 if (Result.isNull()) 6279 return QualType(); 6280 } 6281 6282 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6283 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6284 return Result; 6285 } 6286 6287 template<typename Derived> 6288 QualType 6289 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6290 ObjCInterfaceTypeLoc TL) { 6291 // ObjCInterfaceType is never dependent. 6292 TLB.pushFullCopy(TL); 6293 return TL.getType(); 6294 } 6295 6296 template<typename Derived> 6297 QualType 6298 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6299 ObjCTypeParamTypeLoc TL) { 6300 const ObjCTypeParamType *T = TL.getTypePtr(); 6301 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6302 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6303 if (!OTP) 6304 return QualType(); 6305 6306 QualType Result = TL.getType(); 6307 if (getDerived().AlwaysRebuild() || 6308 OTP != T->getDecl()) { 6309 Result = getDerived().RebuildObjCTypeParamType(OTP, 6310 TL.getProtocolLAngleLoc(), 6311 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6312 TL.getNumProtocols()), 6313 TL.getProtocolLocs(), 6314 TL.getProtocolRAngleLoc()); 6315 if (Result.isNull()) 6316 return QualType(); 6317 } 6318 6319 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6320 if (TL.getNumProtocols()) { 6321 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6322 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6323 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6324 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6325 } 6326 return Result; 6327 } 6328 6329 template<typename Derived> 6330 QualType 6331 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6332 ObjCObjectTypeLoc TL) { 6333 // Transform base type. 6334 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6335 if (BaseType.isNull()) 6336 return QualType(); 6337 6338 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6339 6340 // Transform type arguments. 6341 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6342 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6343 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6344 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6345 QualType TypeArg = TypeArgInfo->getType(); 6346 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6347 AnyChanged = true; 6348 6349 // We have a pack expansion. Instantiate it. 6350 const auto *PackExpansion = PackExpansionLoc.getType() 6351 ->castAs<PackExpansionType>(); 6352 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6353 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6354 Unexpanded); 6355 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6356 6357 // Determine whether the set of unexpanded parameter packs can 6358 // and should be expanded. 6359 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6360 bool Expand = false; 6361 bool RetainExpansion = false; 6362 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6363 if (getDerived().TryExpandParameterPacks( 6364 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6365 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6366 return QualType(); 6367 6368 if (!Expand) { 6369 // We can't expand this pack expansion into separate arguments yet; 6370 // just substitute into the pattern and create a new pack expansion 6371 // type. 6372 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6373 6374 TypeLocBuilder TypeArgBuilder; 6375 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6376 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6377 PatternLoc); 6378 if (NewPatternType.isNull()) 6379 return QualType(); 6380 6381 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6382 NewPatternType, NumExpansions); 6383 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6384 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6385 NewTypeArgInfos.push_back( 6386 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6387 continue; 6388 } 6389 6390 // Substitute into the pack expansion pattern for each slice of the 6391 // pack. 6392 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6393 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6394 6395 TypeLocBuilder TypeArgBuilder; 6396 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6397 6398 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6399 PatternLoc); 6400 if (NewTypeArg.isNull()) 6401 return QualType(); 6402 6403 NewTypeArgInfos.push_back( 6404 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6405 } 6406 6407 continue; 6408 } 6409 6410 TypeLocBuilder TypeArgBuilder; 6411 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6412 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6413 if (NewTypeArg.isNull()) 6414 return QualType(); 6415 6416 // If nothing changed, just keep the old TypeSourceInfo. 6417 if (NewTypeArg == TypeArg) { 6418 NewTypeArgInfos.push_back(TypeArgInfo); 6419 continue; 6420 } 6421 6422 NewTypeArgInfos.push_back( 6423 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6424 AnyChanged = true; 6425 } 6426 6427 QualType Result = TL.getType(); 6428 if (getDerived().AlwaysRebuild() || AnyChanged) { 6429 // Rebuild the type. 6430 Result = getDerived().RebuildObjCObjectType( 6431 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6432 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6433 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6434 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6435 6436 if (Result.isNull()) 6437 return QualType(); 6438 } 6439 6440 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6441 NewT.setHasBaseTypeAsWritten(true); 6442 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6443 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6444 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6445 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6446 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6447 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6448 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6449 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6450 return Result; 6451 } 6452 6453 template<typename Derived> 6454 QualType 6455 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6456 ObjCObjectPointerTypeLoc TL) { 6457 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6458 if (PointeeType.isNull()) 6459 return QualType(); 6460 6461 QualType Result = TL.getType(); 6462 if (getDerived().AlwaysRebuild() || 6463 PointeeType != TL.getPointeeLoc().getType()) { 6464 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6465 TL.getStarLoc()); 6466 if (Result.isNull()) 6467 return QualType(); 6468 } 6469 6470 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6471 NewT.setStarLoc(TL.getStarLoc()); 6472 return Result; 6473 } 6474 6475 //===----------------------------------------------------------------------===// 6476 // Statement transformation 6477 //===----------------------------------------------------------------------===// 6478 template<typename Derived> 6479 StmtResult 6480 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6481 return S; 6482 } 6483 6484 template<typename Derived> 6485 StmtResult 6486 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6487 return getDerived().TransformCompoundStmt(S, false); 6488 } 6489 6490 template<typename Derived> 6491 StmtResult 6492 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6493 bool IsStmtExpr) { 6494 Sema::CompoundScopeRAII CompoundScope(getSema()); 6495 6496 bool SubStmtInvalid = false; 6497 bool SubStmtChanged = false; 6498 SmallVector<Stmt*, 8> Statements; 6499 for (auto *B : S->body()) { 6500 StmtResult Result = getDerived().TransformStmt(B); 6501 if (Result.isInvalid()) { 6502 // Immediately fail if this was a DeclStmt, since it's very 6503 // likely that this will cause problems for future statements. 6504 if (isa<DeclStmt>(B)) 6505 return StmtError(); 6506 6507 // Otherwise, just keep processing substatements and fail later. 6508 SubStmtInvalid = true; 6509 continue; 6510 } 6511 6512 SubStmtChanged = SubStmtChanged || Result.get() != B; 6513 Statements.push_back(Result.getAs<Stmt>()); 6514 } 6515 6516 if (SubStmtInvalid) 6517 return StmtError(); 6518 6519 if (!getDerived().AlwaysRebuild() && 6520 !SubStmtChanged) 6521 return S; 6522 6523 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6524 Statements, 6525 S->getRBracLoc(), 6526 IsStmtExpr); 6527 } 6528 6529 template<typename Derived> 6530 StmtResult 6531 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6532 ExprResult LHS, RHS; 6533 { 6534 EnterExpressionEvaluationContext Unevaluated( 6535 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6536 6537 // Transform the left-hand case value. 6538 LHS = getDerived().TransformExpr(S->getLHS()); 6539 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6540 if (LHS.isInvalid()) 6541 return StmtError(); 6542 6543 // Transform the right-hand case value (for the GNU case-range extension). 6544 RHS = getDerived().TransformExpr(S->getRHS()); 6545 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6546 if (RHS.isInvalid()) 6547 return StmtError(); 6548 } 6549 6550 // Build the case statement. 6551 // Case statements are always rebuilt so that they will attached to their 6552 // transformed switch statement. 6553 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6554 LHS.get(), 6555 S->getEllipsisLoc(), 6556 RHS.get(), 6557 S->getColonLoc()); 6558 if (Case.isInvalid()) 6559 return StmtError(); 6560 6561 // Transform the statement following the case 6562 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6563 if (SubStmt.isInvalid()) 6564 return StmtError(); 6565 6566 // Attach the body to the case statement 6567 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6568 } 6569 6570 template<typename Derived> 6571 StmtResult 6572 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6573 // Transform the statement following the default case 6574 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6575 if (SubStmt.isInvalid()) 6576 return StmtError(); 6577 6578 // Default statements are always rebuilt 6579 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6580 SubStmt.get()); 6581 } 6582 6583 template<typename Derived> 6584 StmtResult 6585 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6586 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6587 if (SubStmt.isInvalid()) 6588 return StmtError(); 6589 6590 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6591 S->getDecl()); 6592 if (!LD) 6593 return StmtError(); 6594 6595 6596 // FIXME: Pass the real colon location in. 6597 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6598 cast<LabelDecl>(LD), SourceLocation(), 6599 SubStmt.get()); 6600 } 6601 6602 template <typename Derived> 6603 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6604 if (!R) 6605 return R; 6606 6607 switch (R->getKind()) { 6608 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6609 #define ATTR(X) 6610 #define PRAGMA_SPELLING_ATTR(X) \ 6611 case attr::X: \ 6612 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6613 #include "clang/Basic/AttrList.inc" 6614 default: 6615 return R; 6616 } 6617 } 6618 6619 template <typename Derived> 6620 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6621 bool AttrsChanged = false; 6622 SmallVector<const Attr *, 1> Attrs; 6623 6624 // Visit attributes and keep track if any are transformed. 6625 for (const auto *I : S->getAttrs()) { 6626 const Attr *R = getDerived().TransformAttr(I); 6627 AttrsChanged |= (I != R); 6628 Attrs.push_back(R); 6629 } 6630 6631 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6632 if (SubStmt.isInvalid()) 6633 return StmtError(); 6634 6635 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6636 return S; 6637 6638 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6639 SubStmt.get()); 6640 } 6641 6642 template<typename Derived> 6643 StmtResult 6644 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6645 // Transform the initialization statement 6646 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6647 if (Init.isInvalid()) 6648 return StmtError(); 6649 6650 // Transform the condition 6651 Sema::ConditionResult Cond = getDerived().TransformCondition( 6652 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6653 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6654 : Sema::ConditionKind::Boolean); 6655 if (Cond.isInvalid()) 6656 return StmtError(); 6657 6658 // If this is a constexpr if, determine which arm we should instantiate. 6659 llvm::Optional<bool> ConstexprConditionValue; 6660 if (S->isConstexpr()) 6661 ConstexprConditionValue = Cond.getKnownValue(); 6662 6663 // Transform the "then" branch. 6664 StmtResult Then; 6665 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6666 Then = getDerived().TransformStmt(S->getThen()); 6667 if (Then.isInvalid()) 6668 return StmtError(); 6669 } else { 6670 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6671 } 6672 6673 // Transform the "else" branch. 6674 StmtResult Else; 6675 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6676 Else = getDerived().TransformStmt(S->getElse()); 6677 if (Else.isInvalid()) 6678 return StmtError(); 6679 } 6680 6681 if (!getDerived().AlwaysRebuild() && 6682 Init.get() == S->getInit() && 6683 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6684 Then.get() == S->getThen() && 6685 Else.get() == S->getElse()) 6686 return S; 6687 6688 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6689 Init.get(), Then.get(), S->getElseLoc(), 6690 Else.get()); 6691 } 6692 6693 template<typename Derived> 6694 StmtResult 6695 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6696 // Transform the initialization statement 6697 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6698 if (Init.isInvalid()) 6699 return StmtError(); 6700 6701 // Transform the condition. 6702 Sema::ConditionResult Cond = getDerived().TransformCondition( 6703 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6704 Sema::ConditionKind::Switch); 6705 if (Cond.isInvalid()) 6706 return StmtError(); 6707 6708 // Rebuild the switch statement. 6709 StmtResult Switch 6710 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6711 if (Switch.isInvalid()) 6712 return StmtError(); 6713 6714 // Transform the body of the switch statement. 6715 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6716 if (Body.isInvalid()) 6717 return StmtError(); 6718 6719 // Complete the switch statement. 6720 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6721 Body.get()); 6722 } 6723 6724 template<typename Derived> 6725 StmtResult 6726 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6727 // Transform the condition 6728 Sema::ConditionResult Cond = getDerived().TransformCondition( 6729 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6730 Sema::ConditionKind::Boolean); 6731 if (Cond.isInvalid()) 6732 return StmtError(); 6733 6734 // Transform the body 6735 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6736 if (Body.isInvalid()) 6737 return StmtError(); 6738 6739 if (!getDerived().AlwaysRebuild() && 6740 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6741 Body.get() == S->getBody()) 6742 return Owned(S); 6743 6744 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6745 } 6746 6747 template<typename Derived> 6748 StmtResult 6749 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6750 // Transform the body 6751 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6752 if (Body.isInvalid()) 6753 return StmtError(); 6754 6755 // Transform the condition 6756 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6757 if (Cond.isInvalid()) 6758 return StmtError(); 6759 6760 if (!getDerived().AlwaysRebuild() && 6761 Cond.get() == S->getCond() && 6762 Body.get() == S->getBody()) 6763 return S; 6764 6765 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6766 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6767 S->getRParenLoc()); 6768 } 6769 6770 template<typename Derived> 6771 StmtResult 6772 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6773 // Transform the initialization statement 6774 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6775 if (Init.isInvalid()) 6776 return StmtError(); 6777 6778 // In OpenMP loop region loop control variable must be captured and be 6779 // private. Perform analysis of first part (if any). 6780 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6781 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6782 6783 // Transform the condition 6784 Sema::ConditionResult Cond = getDerived().TransformCondition( 6785 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6786 Sema::ConditionKind::Boolean); 6787 if (Cond.isInvalid()) 6788 return StmtError(); 6789 6790 // Transform the increment 6791 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6792 if (Inc.isInvalid()) 6793 return StmtError(); 6794 6795 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6796 if (S->getInc() && !FullInc.get()) 6797 return StmtError(); 6798 6799 // Transform the body 6800 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6801 if (Body.isInvalid()) 6802 return StmtError(); 6803 6804 if (!getDerived().AlwaysRebuild() && 6805 Init.get() == S->getInit() && 6806 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6807 Inc.get() == S->getInc() && 6808 Body.get() == S->getBody()) 6809 return S; 6810 6811 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6812 Init.get(), Cond, FullInc, 6813 S->getRParenLoc(), Body.get()); 6814 } 6815 6816 template<typename Derived> 6817 StmtResult 6818 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6819 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6820 S->getLabel()); 6821 if (!LD) 6822 return StmtError(); 6823 6824 // Goto statements must always be rebuilt, to resolve the label. 6825 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6826 cast<LabelDecl>(LD)); 6827 } 6828 6829 template<typename Derived> 6830 StmtResult 6831 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6832 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6833 if (Target.isInvalid()) 6834 return StmtError(); 6835 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6836 6837 if (!getDerived().AlwaysRebuild() && 6838 Target.get() == S->getTarget()) 6839 return S; 6840 6841 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6842 Target.get()); 6843 } 6844 6845 template<typename Derived> 6846 StmtResult 6847 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6848 return S; 6849 } 6850 6851 template<typename Derived> 6852 StmtResult 6853 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6854 return S; 6855 } 6856 6857 template<typename Derived> 6858 StmtResult 6859 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6860 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6861 /*NotCopyInit*/false); 6862 if (Result.isInvalid()) 6863 return StmtError(); 6864 6865 // FIXME: We always rebuild the return statement because there is no way 6866 // to tell whether the return type of the function has changed. 6867 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6868 } 6869 6870 template<typename Derived> 6871 StmtResult 6872 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6873 bool DeclChanged = false; 6874 SmallVector<Decl *, 4> Decls; 6875 for (auto *D : S->decls()) { 6876 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6877 if (!Transformed) 6878 return StmtError(); 6879 6880 if (Transformed != D) 6881 DeclChanged = true; 6882 6883 Decls.push_back(Transformed); 6884 } 6885 6886 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6887 return S; 6888 6889 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6890 } 6891 6892 template<typename Derived> 6893 StmtResult 6894 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6895 6896 SmallVector<Expr*, 8> Constraints; 6897 SmallVector<Expr*, 8> Exprs; 6898 SmallVector<IdentifierInfo *, 4> Names; 6899 6900 ExprResult AsmString; 6901 SmallVector<Expr*, 8> Clobbers; 6902 6903 bool ExprsChanged = false; 6904 6905 // Go through the outputs. 6906 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6907 Names.push_back(S->getOutputIdentifier(I)); 6908 6909 // No need to transform the constraint literal. 6910 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6911 6912 // Transform the output expr. 6913 Expr *OutputExpr = S->getOutputExpr(I); 6914 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6915 if (Result.isInvalid()) 6916 return StmtError(); 6917 6918 ExprsChanged |= Result.get() != OutputExpr; 6919 6920 Exprs.push_back(Result.get()); 6921 } 6922 6923 // Go through the inputs. 6924 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6925 Names.push_back(S->getInputIdentifier(I)); 6926 6927 // No need to transform the constraint literal. 6928 Constraints.push_back(S->getInputConstraintLiteral(I)); 6929 6930 // Transform the input expr. 6931 Expr *InputExpr = S->getInputExpr(I); 6932 ExprResult Result = getDerived().TransformExpr(InputExpr); 6933 if (Result.isInvalid()) 6934 return StmtError(); 6935 6936 ExprsChanged |= Result.get() != InputExpr; 6937 6938 Exprs.push_back(Result.get()); 6939 } 6940 6941 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6942 return S; 6943 6944 // Go through the clobbers. 6945 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6946 Clobbers.push_back(S->getClobberStringLiteral(I)); 6947 6948 // No need to transform the asm string literal. 6949 AsmString = S->getAsmString(); 6950 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6951 S->isVolatile(), S->getNumOutputs(), 6952 S->getNumInputs(), Names.data(), 6953 Constraints, Exprs, AsmString.get(), 6954 Clobbers, S->getRParenLoc()); 6955 } 6956 6957 template<typename Derived> 6958 StmtResult 6959 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6960 ArrayRef<Token> AsmToks = 6961 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6962 6963 bool HadError = false, HadChange = false; 6964 6965 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6966 SmallVector<Expr*, 8> TransformedExprs; 6967 TransformedExprs.reserve(SrcExprs.size()); 6968 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6969 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6970 if (!Result.isUsable()) { 6971 HadError = true; 6972 } else { 6973 HadChange |= (Result.get() != SrcExprs[i]); 6974 TransformedExprs.push_back(Result.get()); 6975 } 6976 } 6977 6978 if (HadError) return StmtError(); 6979 if (!HadChange && !getDerived().AlwaysRebuild()) 6980 return Owned(S); 6981 6982 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6983 AsmToks, S->getAsmString(), 6984 S->getNumOutputs(), S->getNumInputs(), 6985 S->getAllConstraints(), S->getClobbers(), 6986 TransformedExprs, S->getEndLoc()); 6987 } 6988 6989 // C++ Coroutines TS 6990 6991 template<typename Derived> 6992 StmtResult 6993 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6994 auto *ScopeInfo = SemaRef.getCurFunction(); 6995 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 6996 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 6997 ScopeInfo->NeedsCoroutineSuspends && 6998 ScopeInfo->CoroutineSuspends.first == nullptr && 6999 ScopeInfo->CoroutineSuspends.second == nullptr && 7000 "expected clean scope info"); 7001 7002 // Set that we have (possibly-invalid) suspend points before we do anything 7003 // that may fail. 7004 ScopeInfo->setNeedsCoroutineSuspends(false); 7005 7006 // The new CoroutinePromise object needs to be built and put into the current 7007 // FunctionScopeInfo before any transformations or rebuilding occurs. 7008 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7009 return StmtError(); 7010 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7011 if (!Promise) 7012 return StmtError(); 7013 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 7014 ScopeInfo->CoroutinePromise = Promise; 7015 7016 // Transform the implicit coroutine statements we built during the initial 7017 // parse. 7018 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7019 if (InitSuspend.isInvalid()) 7020 return StmtError(); 7021 StmtResult FinalSuspend = 7022 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7023 if (FinalSuspend.isInvalid()) 7024 return StmtError(); 7025 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7026 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7027 7028 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7029 if (BodyRes.isInvalid()) 7030 return StmtError(); 7031 7032 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7033 if (Builder.isInvalid()) 7034 return StmtError(); 7035 7036 Expr *ReturnObject = S->getReturnValueInit(); 7037 assert(ReturnObject && "the return object is expected to be valid"); 7038 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7039 /*NoCopyInit*/ false); 7040 if (Res.isInvalid()) 7041 return StmtError(); 7042 Builder.ReturnValue = Res.get(); 7043 7044 if (S->hasDependentPromiseType()) { 7045 assert(!Promise->getType()->isDependentType() && 7046 "the promise type must no longer be dependent"); 7047 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7048 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7049 "these nodes should not have been built yet"); 7050 if (!Builder.buildDependentStatements()) 7051 return StmtError(); 7052 } else { 7053 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7054 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7055 if (Res.isInvalid()) 7056 return StmtError(); 7057 Builder.OnFallthrough = Res.get(); 7058 } 7059 7060 if (auto *OnException = S->getExceptionHandler()) { 7061 StmtResult Res = getDerived().TransformStmt(OnException); 7062 if (Res.isInvalid()) 7063 return StmtError(); 7064 Builder.OnException = Res.get(); 7065 } 7066 7067 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7068 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7069 if (Res.isInvalid()) 7070 return StmtError(); 7071 Builder.ReturnStmtOnAllocFailure = Res.get(); 7072 } 7073 7074 // Transform any additional statements we may have already built 7075 assert(S->getAllocate() && S->getDeallocate() && 7076 "allocation and deallocation calls must already be built"); 7077 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7078 if (AllocRes.isInvalid()) 7079 return StmtError(); 7080 Builder.Allocate = AllocRes.get(); 7081 7082 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7083 if (DeallocRes.isInvalid()) 7084 return StmtError(); 7085 Builder.Deallocate = DeallocRes.get(); 7086 7087 assert(S->getResultDecl() && "ResultDecl must already be built"); 7088 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7089 if (ResultDecl.isInvalid()) 7090 return StmtError(); 7091 Builder.ResultDecl = ResultDecl.get(); 7092 7093 if (auto *ReturnStmt = S->getReturnStmt()) { 7094 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7095 if (Res.isInvalid()) 7096 return StmtError(); 7097 Builder.ReturnStmt = Res.get(); 7098 } 7099 } 7100 7101 return getDerived().RebuildCoroutineBodyStmt(Builder); 7102 } 7103 7104 template<typename Derived> 7105 StmtResult 7106 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7107 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7108 /*NotCopyInit*/false); 7109 if (Result.isInvalid()) 7110 return StmtError(); 7111 7112 // Always rebuild; we don't know if this needs to be injected into a new 7113 // context or if the promise type has changed. 7114 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7115 S->isImplicit()); 7116 } 7117 7118 template<typename Derived> 7119 ExprResult 7120 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7121 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7122 /*NotCopyInit*/false); 7123 if (Result.isInvalid()) 7124 return ExprError(); 7125 7126 // Always rebuild; we don't know if this needs to be injected into a new 7127 // context or if the promise type has changed. 7128 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7129 E->isImplicit()); 7130 } 7131 7132 template <typename Derived> 7133 ExprResult 7134 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7135 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7136 /*NotCopyInit*/ false); 7137 if (OperandResult.isInvalid()) 7138 return ExprError(); 7139 7140 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7141 E->getOperatorCoawaitLookup()); 7142 7143 if (LookupResult.isInvalid()) 7144 return ExprError(); 7145 7146 // Always rebuild; we don't know if this needs to be injected into a new 7147 // context or if the promise type has changed. 7148 return getDerived().RebuildDependentCoawaitExpr( 7149 E->getKeywordLoc(), OperandResult.get(), 7150 cast<UnresolvedLookupExpr>(LookupResult.get())); 7151 } 7152 7153 template<typename Derived> 7154 ExprResult 7155 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7156 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7157 /*NotCopyInit*/false); 7158 if (Result.isInvalid()) 7159 return ExprError(); 7160 7161 // Always rebuild; we don't know if this needs to be injected into a new 7162 // context or if the promise type has changed. 7163 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7164 } 7165 7166 // Objective-C Statements. 7167 7168 template<typename Derived> 7169 StmtResult 7170 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7171 // Transform the body of the @try. 7172 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7173 if (TryBody.isInvalid()) 7174 return StmtError(); 7175 7176 // Transform the @catch statements (if present). 7177 bool AnyCatchChanged = false; 7178 SmallVector<Stmt*, 8> CatchStmts; 7179 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7180 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7181 if (Catch.isInvalid()) 7182 return StmtError(); 7183 if (Catch.get() != S->getCatchStmt(I)) 7184 AnyCatchChanged = true; 7185 CatchStmts.push_back(Catch.get()); 7186 } 7187 7188 // Transform the @finally statement (if present). 7189 StmtResult Finally; 7190 if (S->getFinallyStmt()) { 7191 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7192 if (Finally.isInvalid()) 7193 return StmtError(); 7194 } 7195 7196 // If nothing changed, just retain this statement. 7197 if (!getDerived().AlwaysRebuild() && 7198 TryBody.get() == S->getTryBody() && 7199 !AnyCatchChanged && 7200 Finally.get() == S->getFinallyStmt()) 7201 return S; 7202 7203 // Build a new statement. 7204 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7205 CatchStmts, Finally.get()); 7206 } 7207 7208 template<typename Derived> 7209 StmtResult 7210 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7211 // Transform the @catch parameter, if there is one. 7212 VarDecl *Var = nullptr; 7213 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7214 TypeSourceInfo *TSInfo = nullptr; 7215 if (FromVar->getTypeSourceInfo()) { 7216 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7217 if (!TSInfo) 7218 return StmtError(); 7219 } 7220 7221 QualType T; 7222 if (TSInfo) 7223 T = TSInfo->getType(); 7224 else { 7225 T = getDerived().TransformType(FromVar->getType()); 7226 if (T.isNull()) 7227 return StmtError(); 7228 } 7229 7230 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7231 if (!Var) 7232 return StmtError(); 7233 } 7234 7235 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7236 if (Body.isInvalid()) 7237 return StmtError(); 7238 7239 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7240 S->getRParenLoc(), 7241 Var, Body.get()); 7242 } 7243 7244 template<typename Derived> 7245 StmtResult 7246 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7247 // Transform the body. 7248 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7249 if (Body.isInvalid()) 7250 return StmtError(); 7251 7252 // If nothing changed, just retain this statement. 7253 if (!getDerived().AlwaysRebuild() && 7254 Body.get() == S->getFinallyBody()) 7255 return S; 7256 7257 // Build a new statement. 7258 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7259 Body.get()); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7265 ExprResult Operand; 7266 if (S->getThrowExpr()) { 7267 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7268 if (Operand.isInvalid()) 7269 return StmtError(); 7270 } 7271 7272 if (!getDerived().AlwaysRebuild() && 7273 Operand.get() == S->getThrowExpr()) 7274 return S; 7275 7276 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7277 } 7278 7279 template<typename Derived> 7280 StmtResult 7281 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7282 ObjCAtSynchronizedStmt *S) { 7283 // Transform the object we are locking. 7284 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7285 if (Object.isInvalid()) 7286 return StmtError(); 7287 Object = 7288 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7289 Object.get()); 7290 if (Object.isInvalid()) 7291 return StmtError(); 7292 7293 // Transform the body. 7294 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7295 if (Body.isInvalid()) 7296 return StmtError(); 7297 7298 // If nothing change, just retain the current statement. 7299 if (!getDerived().AlwaysRebuild() && 7300 Object.get() == S->getSynchExpr() && 7301 Body.get() == S->getSynchBody()) 7302 return S; 7303 7304 // Build a new statement. 7305 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7306 Object.get(), Body.get()); 7307 } 7308 7309 template<typename Derived> 7310 StmtResult 7311 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7312 ObjCAutoreleasePoolStmt *S) { 7313 // Transform the body. 7314 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7315 if (Body.isInvalid()) 7316 return StmtError(); 7317 7318 // If nothing changed, just retain this statement. 7319 if (!getDerived().AlwaysRebuild() && 7320 Body.get() == S->getSubStmt()) 7321 return S; 7322 7323 // Build a new statement. 7324 return getDerived().RebuildObjCAutoreleasePoolStmt( 7325 S->getAtLoc(), Body.get()); 7326 } 7327 7328 template<typename Derived> 7329 StmtResult 7330 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7331 ObjCForCollectionStmt *S) { 7332 // Transform the element statement. 7333 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7334 if (Element.isInvalid()) 7335 return StmtError(); 7336 7337 // Transform the collection expression. 7338 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7339 if (Collection.isInvalid()) 7340 return StmtError(); 7341 7342 // Transform the body. 7343 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7344 if (Body.isInvalid()) 7345 return StmtError(); 7346 7347 // If nothing changed, just retain this statement. 7348 if (!getDerived().AlwaysRebuild() && 7349 Element.get() == S->getElement() && 7350 Collection.get() == S->getCollection() && 7351 Body.get() == S->getBody()) 7352 return S; 7353 7354 // Build a new statement. 7355 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7356 Element.get(), 7357 Collection.get(), 7358 S->getRParenLoc(), 7359 Body.get()); 7360 } 7361 7362 template <typename Derived> 7363 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7364 // Transform the exception declaration, if any. 7365 VarDecl *Var = nullptr; 7366 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7367 TypeSourceInfo *T = 7368 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7369 if (!T) 7370 return StmtError(); 7371 7372 Var = getDerived().RebuildExceptionDecl( 7373 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7374 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7375 if (!Var || Var->isInvalidDecl()) 7376 return StmtError(); 7377 } 7378 7379 // Transform the actual exception handler. 7380 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7381 if (Handler.isInvalid()) 7382 return StmtError(); 7383 7384 if (!getDerived().AlwaysRebuild() && !Var && 7385 Handler.get() == S->getHandlerBlock()) 7386 return S; 7387 7388 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7389 } 7390 7391 template <typename Derived> 7392 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7393 // Transform the try block itself. 7394 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7395 if (TryBlock.isInvalid()) 7396 return StmtError(); 7397 7398 // Transform the handlers. 7399 bool HandlerChanged = false; 7400 SmallVector<Stmt *, 8> Handlers; 7401 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7402 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7403 if (Handler.isInvalid()) 7404 return StmtError(); 7405 7406 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7407 Handlers.push_back(Handler.getAs<Stmt>()); 7408 } 7409 7410 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7411 !HandlerChanged) 7412 return S; 7413 7414 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7415 Handlers); 7416 } 7417 7418 template<typename Derived> 7419 StmtResult 7420 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7421 StmtResult Init = 7422 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7423 if (Init.isInvalid()) 7424 return StmtError(); 7425 7426 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7427 if (Range.isInvalid()) 7428 return StmtError(); 7429 7430 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7431 if (Begin.isInvalid()) 7432 return StmtError(); 7433 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7434 if (End.isInvalid()) 7435 return StmtError(); 7436 7437 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7438 if (Cond.isInvalid()) 7439 return StmtError(); 7440 if (Cond.get()) 7441 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7442 if (Cond.isInvalid()) 7443 return StmtError(); 7444 if (Cond.get()) 7445 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7446 7447 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7448 if (Inc.isInvalid()) 7449 return StmtError(); 7450 if (Inc.get()) 7451 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7452 7453 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7454 if (LoopVar.isInvalid()) 7455 return StmtError(); 7456 7457 StmtResult NewStmt = S; 7458 if (getDerived().AlwaysRebuild() || 7459 Init.get() != S->getInit() || 7460 Range.get() != S->getRangeStmt() || 7461 Begin.get() != S->getBeginStmt() || 7462 End.get() != S->getEndStmt() || 7463 Cond.get() != S->getCond() || 7464 Inc.get() != S->getInc() || 7465 LoopVar.get() != S->getLoopVarStmt()) { 7466 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7467 S->getCoawaitLoc(), Init.get(), 7468 S->getColonLoc(), Range.get(), 7469 Begin.get(), End.get(), 7470 Cond.get(), 7471 Inc.get(), LoopVar.get(), 7472 S->getRParenLoc()); 7473 if (NewStmt.isInvalid()) 7474 return StmtError(); 7475 } 7476 7477 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7478 if (Body.isInvalid()) 7479 return StmtError(); 7480 7481 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7482 // it now so we have a new statement to attach the body to. 7483 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7484 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7485 S->getCoawaitLoc(), Init.get(), 7486 S->getColonLoc(), Range.get(), 7487 Begin.get(), End.get(), 7488 Cond.get(), 7489 Inc.get(), LoopVar.get(), 7490 S->getRParenLoc()); 7491 if (NewStmt.isInvalid()) 7492 return StmtError(); 7493 } 7494 7495 if (NewStmt.get() == S) 7496 return S; 7497 7498 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7499 } 7500 7501 template<typename Derived> 7502 StmtResult 7503 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7504 MSDependentExistsStmt *S) { 7505 // Transform the nested-name-specifier, if any. 7506 NestedNameSpecifierLoc QualifierLoc; 7507 if (S->getQualifierLoc()) { 7508 QualifierLoc 7509 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7510 if (!QualifierLoc) 7511 return StmtError(); 7512 } 7513 7514 // Transform the declaration name. 7515 DeclarationNameInfo NameInfo = S->getNameInfo(); 7516 if (NameInfo.getName()) { 7517 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7518 if (!NameInfo.getName()) 7519 return StmtError(); 7520 } 7521 7522 // Check whether anything changed. 7523 if (!getDerived().AlwaysRebuild() && 7524 QualifierLoc == S->getQualifierLoc() && 7525 NameInfo.getName() == S->getNameInfo().getName()) 7526 return S; 7527 7528 // Determine whether this name exists, if we can. 7529 CXXScopeSpec SS; 7530 SS.Adopt(QualifierLoc); 7531 bool Dependent = false; 7532 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7533 case Sema::IER_Exists: 7534 if (S->isIfExists()) 7535 break; 7536 7537 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7538 7539 case Sema::IER_DoesNotExist: 7540 if (S->isIfNotExists()) 7541 break; 7542 7543 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7544 7545 case Sema::IER_Dependent: 7546 Dependent = true; 7547 break; 7548 7549 case Sema::IER_Error: 7550 return StmtError(); 7551 } 7552 7553 // We need to continue with the instantiation, so do so now. 7554 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7555 if (SubStmt.isInvalid()) 7556 return StmtError(); 7557 7558 // If we have resolved the name, just transform to the substatement. 7559 if (!Dependent) 7560 return SubStmt; 7561 7562 // The name is still dependent, so build a dependent expression again. 7563 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7564 S->isIfExists(), 7565 QualifierLoc, 7566 NameInfo, 7567 SubStmt.get()); 7568 } 7569 7570 template<typename Derived> 7571 ExprResult 7572 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7573 NestedNameSpecifierLoc QualifierLoc; 7574 if (E->getQualifierLoc()) { 7575 QualifierLoc 7576 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7577 if (!QualifierLoc) 7578 return ExprError(); 7579 } 7580 7581 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7582 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7583 if (!PD) 7584 return ExprError(); 7585 7586 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7587 if (Base.isInvalid()) 7588 return ExprError(); 7589 7590 return new (SemaRef.getASTContext()) 7591 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7592 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7593 QualifierLoc, E->getMemberLoc()); 7594 } 7595 7596 template <typename Derived> 7597 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7598 MSPropertySubscriptExpr *E) { 7599 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7600 if (BaseRes.isInvalid()) 7601 return ExprError(); 7602 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7603 if (IdxRes.isInvalid()) 7604 return ExprError(); 7605 7606 if (!getDerived().AlwaysRebuild() && 7607 BaseRes.get() == E->getBase() && 7608 IdxRes.get() == E->getIdx()) 7609 return E; 7610 7611 return getDerived().RebuildArraySubscriptExpr( 7612 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7613 } 7614 7615 template <typename Derived> 7616 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7617 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7618 if (TryBlock.isInvalid()) 7619 return StmtError(); 7620 7621 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7622 if (Handler.isInvalid()) 7623 return StmtError(); 7624 7625 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7626 Handler.get() == S->getHandler()) 7627 return S; 7628 7629 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7630 TryBlock.get(), Handler.get()); 7631 } 7632 7633 template <typename Derived> 7634 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7635 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7636 if (Block.isInvalid()) 7637 return StmtError(); 7638 7639 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7640 } 7641 7642 template <typename Derived> 7643 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7644 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7645 if (FilterExpr.isInvalid()) 7646 return StmtError(); 7647 7648 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7649 if (Block.isInvalid()) 7650 return StmtError(); 7651 7652 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7653 Block.get()); 7654 } 7655 7656 template <typename Derived> 7657 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7658 if (isa<SEHFinallyStmt>(Handler)) 7659 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7660 else 7661 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7662 } 7663 7664 template<typename Derived> 7665 StmtResult 7666 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7667 return S; 7668 } 7669 7670 //===----------------------------------------------------------------------===// 7671 // OpenMP directive transformation 7672 //===----------------------------------------------------------------------===// 7673 template <typename Derived> 7674 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7675 OMPExecutableDirective *D) { 7676 7677 // Transform the clauses 7678 llvm::SmallVector<OMPClause *, 16> TClauses; 7679 ArrayRef<OMPClause *> Clauses = D->clauses(); 7680 TClauses.reserve(Clauses.size()); 7681 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7682 I != E; ++I) { 7683 if (*I) { 7684 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7685 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7686 getDerived().getSema().EndOpenMPClause(); 7687 if (Clause) 7688 TClauses.push_back(Clause); 7689 } else { 7690 TClauses.push_back(nullptr); 7691 } 7692 } 7693 StmtResult AssociatedStmt; 7694 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7695 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7696 /*CurScope=*/nullptr); 7697 StmtResult Body; 7698 { 7699 Sema::CompoundScopeRAII CompoundScope(getSema()); 7700 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7701 Body = getDerived().TransformStmt(CS); 7702 } 7703 AssociatedStmt = 7704 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7705 if (AssociatedStmt.isInvalid()) { 7706 return StmtError(); 7707 } 7708 } 7709 if (TClauses.size() != Clauses.size()) { 7710 return StmtError(); 7711 } 7712 7713 // Transform directive name for 'omp critical' directive. 7714 DeclarationNameInfo DirName; 7715 if (D->getDirectiveKind() == OMPD_critical) { 7716 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7717 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7718 } 7719 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7720 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7721 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7722 } else if (D->getDirectiveKind() == OMPD_cancel) { 7723 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7724 } 7725 7726 return getDerived().RebuildOMPExecutableDirective( 7727 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7728 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7729 } 7730 7731 template <typename Derived> 7732 StmtResult 7733 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7734 DeclarationNameInfo DirName; 7735 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7736 D->getBeginLoc()); 7737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7739 return Res; 7740 } 7741 7742 template <typename Derived> 7743 StmtResult 7744 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7745 DeclarationNameInfo DirName; 7746 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7747 D->getBeginLoc()); 7748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7750 return Res; 7751 } 7752 7753 template <typename Derived> 7754 StmtResult 7755 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7756 DeclarationNameInfo DirName; 7757 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7758 D->getBeginLoc()); 7759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7761 return Res; 7762 } 7763 7764 template <typename Derived> 7765 StmtResult 7766 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7767 DeclarationNameInfo DirName; 7768 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7769 D->getBeginLoc()); 7770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7772 return Res; 7773 } 7774 7775 template <typename Derived> 7776 StmtResult 7777 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7778 DeclarationNameInfo DirName; 7779 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7780 D->getBeginLoc()); 7781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7783 return Res; 7784 } 7785 7786 template <typename Derived> 7787 StmtResult 7788 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7789 DeclarationNameInfo DirName; 7790 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7791 D->getBeginLoc()); 7792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7794 return Res; 7795 } 7796 7797 template <typename Derived> 7798 StmtResult 7799 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7800 DeclarationNameInfo DirName; 7801 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7802 D->getBeginLoc()); 7803 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7804 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7805 return Res; 7806 } 7807 7808 template <typename Derived> 7809 StmtResult 7810 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7811 DeclarationNameInfo DirName; 7812 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7813 D->getBeginLoc()); 7814 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7815 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7816 return Res; 7817 } 7818 7819 template <typename Derived> 7820 StmtResult 7821 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7822 getDerived().getSema().StartOpenMPDSABlock( 7823 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7826 return Res; 7827 } 7828 7829 template <typename Derived> 7830 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7831 OMPParallelForDirective *D) { 7832 DeclarationNameInfo DirName; 7833 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7834 nullptr, D->getBeginLoc()); 7835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7837 return Res; 7838 } 7839 7840 template <typename Derived> 7841 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7842 OMPParallelForSimdDirective *D) { 7843 DeclarationNameInfo DirName; 7844 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7845 nullptr, D->getBeginLoc()); 7846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7848 return Res; 7849 } 7850 7851 template <typename Derived> 7852 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7853 OMPParallelSectionsDirective *D) { 7854 DeclarationNameInfo DirName; 7855 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7856 nullptr, D->getBeginLoc()); 7857 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7858 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7859 return Res; 7860 } 7861 7862 template <typename Derived> 7863 StmtResult 7864 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7865 DeclarationNameInfo DirName; 7866 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7867 D->getBeginLoc()); 7868 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7869 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7870 return Res; 7871 } 7872 7873 template <typename Derived> 7874 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7875 OMPTaskyieldDirective *D) { 7876 DeclarationNameInfo DirName; 7877 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7878 D->getBeginLoc()); 7879 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7880 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7881 return Res; 7882 } 7883 7884 template <typename Derived> 7885 StmtResult 7886 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7887 DeclarationNameInfo DirName; 7888 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7889 D->getBeginLoc()); 7890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7892 return Res; 7893 } 7894 7895 template <typename Derived> 7896 StmtResult 7897 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7898 DeclarationNameInfo DirName; 7899 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7900 D->getBeginLoc()); 7901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7903 return Res; 7904 } 7905 7906 template <typename Derived> 7907 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7908 OMPTaskgroupDirective *D) { 7909 DeclarationNameInfo DirName; 7910 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7911 D->getBeginLoc()); 7912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7914 return Res; 7915 } 7916 7917 template <typename Derived> 7918 StmtResult 7919 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7920 DeclarationNameInfo DirName; 7921 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7922 D->getBeginLoc()); 7923 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7925 return Res; 7926 } 7927 7928 template <typename Derived> 7929 StmtResult 7930 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7931 DeclarationNameInfo DirName; 7932 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7933 D->getBeginLoc()); 7934 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7935 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7936 return Res; 7937 } 7938 7939 template <typename Derived> 7940 StmtResult 7941 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7942 DeclarationNameInfo DirName; 7943 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7944 D->getBeginLoc()); 7945 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7946 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7947 return Res; 7948 } 7949 7950 template <typename Derived> 7951 StmtResult 7952 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7953 DeclarationNameInfo DirName; 7954 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7955 D->getBeginLoc()); 7956 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7957 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7958 return Res; 7959 } 7960 7961 template <typename Derived> 7962 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7963 OMPTargetDataDirective *D) { 7964 DeclarationNameInfo DirName; 7965 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7966 D->getBeginLoc()); 7967 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7968 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7969 return Res; 7970 } 7971 7972 template <typename Derived> 7973 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7974 OMPTargetEnterDataDirective *D) { 7975 DeclarationNameInfo DirName; 7976 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7977 nullptr, D->getBeginLoc()); 7978 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7979 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7980 return Res; 7981 } 7982 7983 template <typename Derived> 7984 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7985 OMPTargetExitDataDirective *D) { 7986 DeclarationNameInfo DirName; 7987 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7988 nullptr, D->getBeginLoc()); 7989 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7990 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7991 return Res; 7992 } 7993 7994 template <typename Derived> 7995 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7996 OMPTargetParallelDirective *D) { 7997 DeclarationNameInfo DirName; 7998 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7999 nullptr, D->getBeginLoc()); 8000 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8001 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8002 return Res; 8003 } 8004 8005 template <typename Derived> 8006 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8007 OMPTargetParallelForDirective *D) { 8008 DeclarationNameInfo DirName; 8009 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8010 nullptr, D->getBeginLoc()); 8011 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8012 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8013 return Res; 8014 } 8015 8016 template <typename Derived> 8017 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8018 OMPTargetUpdateDirective *D) { 8019 DeclarationNameInfo DirName; 8020 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8021 nullptr, D->getBeginLoc()); 8022 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8023 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8024 return Res; 8025 } 8026 8027 template <typename Derived> 8028 StmtResult 8029 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8030 DeclarationNameInfo DirName; 8031 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8032 D->getBeginLoc()); 8033 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8034 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8035 return Res; 8036 } 8037 8038 template <typename Derived> 8039 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8040 OMPCancellationPointDirective *D) { 8041 DeclarationNameInfo DirName; 8042 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8043 nullptr, D->getBeginLoc()); 8044 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8045 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8046 return Res; 8047 } 8048 8049 template <typename Derived> 8050 StmtResult 8051 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8052 DeclarationNameInfo DirName; 8053 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8054 D->getBeginLoc()); 8055 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8056 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8057 return Res; 8058 } 8059 8060 template <typename Derived> 8061 StmtResult 8062 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8063 DeclarationNameInfo DirName; 8064 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8065 D->getBeginLoc()); 8066 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8068 return Res; 8069 } 8070 8071 template <typename Derived> 8072 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8073 OMPTaskLoopSimdDirective *D) { 8074 DeclarationNameInfo DirName; 8075 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8076 nullptr, D->getBeginLoc()); 8077 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8078 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8079 return Res; 8080 } 8081 8082 template <typename Derived> 8083 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8084 OMPDistributeDirective *D) { 8085 DeclarationNameInfo DirName; 8086 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8087 D->getBeginLoc()); 8088 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8089 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8090 return Res; 8091 } 8092 8093 template <typename Derived> 8094 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8095 OMPDistributeParallelForDirective *D) { 8096 DeclarationNameInfo DirName; 8097 getDerived().getSema().StartOpenMPDSABlock( 8098 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8099 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8101 return Res; 8102 } 8103 8104 template <typename Derived> 8105 StmtResult 8106 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8107 OMPDistributeParallelForSimdDirective *D) { 8108 DeclarationNameInfo DirName; 8109 getDerived().getSema().StartOpenMPDSABlock( 8110 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8111 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8112 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8113 return Res; 8114 } 8115 8116 template <typename Derived> 8117 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8118 OMPDistributeSimdDirective *D) { 8119 DeclarationNameInfo DirName; 8120 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8121 nullptr, D->getBeginLoc()); 8122 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8123 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8124 return Res; 8125 } 8126 8127 template <typename Derived> 8128 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8129 OMPTargetParallelForSimdDirective *D) { 8130 DeclarationNameInfo DirName; 8131 getDerived().getSema().StartOpenMPDSABlock( 8132 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8133 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8134 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8135 return Res; 8136 } 8137 8138 template <typename Derived> 8139 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8140 OMPTargetSimdDirective *D) { 8141 DeclarationNameInfo DirName; 8142 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8143 D->getBeginLoc()); 8144 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8145 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8146 return Res; 8147 } 8148 8149 template <typename Derived> 8150 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8151 OMPTeamsDistributeDirective *D) { 8152 DeclarationNameInfo DirName; 8153 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8154 nullptr, D->getBeginLoc()); 8155 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8156 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8157 return Res; 8158 } 8159 8160 template <typename Derived> 8161 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8162 OMPTeamsDistributeSimdDirective *D) { 8163 DeclarationNameInfo DirName; 8164 getDerived().getSema().StartOpenMPDSABlock( 8165 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8166 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8167 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8168 return Res; 8169 } 8170 8171 template <typename Derived> 8172 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8173 OMPTeamsDistributeParallelForSimdDirective *D) { 8174 DeclarationNameInfo DirName; 8175 getDerived().getSema().StartOpenMPDSABlock( 8176 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8177 D->getBeginLoc()); 8178 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8179 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8180 return Res; 8181 } 8182 8183 template <typename Derived> 8184 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8185 OMPTeamsDistributeParallelForDirective *D) { 8186 DeclarationNameInfo DirName; 8187 getDerived().getSema().StartOpenMPDSABlock( 8188 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8189 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8190 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8191 return Res; 8192 } 8193 8194 template <typename Derived> 8195 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8196 OMPTargetTeamsDirective *D) { 8197 DeclarationNameInfo DirName; 8198 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8199 nullptr, D->getBeginLoc()); 8200 auto Res = getDerived().TransformOMPExecutableDirective(D); 8201 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8202 return Res; 8203 } 8204 8205 template <typename Derived> 8206 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8207 OMPTargetTeamsDistributeDirective *D) { 8208 DeclarationNameInfo DirName; 8209 getDerived().getSema().StartOpenMPDSABlock( 8210 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8211 auto Res = getDerived().TransformOMPExecutableDirective(D); 8212 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8213 return Res; 8214 } 8215 8216 template <typename Derived> 8217 StmtResult 8218 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8219 OMPTargetTeamsDistributeParallelForDirective *D) { 8220 DeclarationNameInfo DirName; 8221 getDerived().getSema().StartOpenMPDSABlock( 8222 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8223 D->getBeginLoc()); 8224 auto Res = getDerived().TransformOMPExecutableDirective(D); 8225 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8226 return Res; 8227 } 8228 8229 template <typename Derived> 8230 StmtResult TreeTransform<Derived>:: 8231 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8232 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8233 DeclarationNameInfo DirName; 8234 getDerived().getSema().StartOpenMPDSABlock( 8235 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8236 D->getBeginLoc()); 8237 auto Res = getDerived().TransformOMPExecutableDirective(D); 8238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8239 return Res; 8240 } 8241 8242 template <typename Derived> 8243 StmtResult 8244 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8245 OMPTargetTeamsDistributeSimdDirective *D) { 8246 DeclarationNameInfo DirName; 8247 getDerived().getSema().StartOpenMPDSABlock( 8248 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8249 auto Res = getDerived().TransformOMPExecutableDirective(D); 8250 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8251 return Res; 8252 } 8253 8254 8255 //===----------------------------------------------------------------------===// 8256 // OpenMP clause transformation 8257 //===----------------------------------------------------------------------===// 8258 template <typename Derived> 8259 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8260 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8261 if (Cond.isInvalid()) 8262 return nullptr; 8263 return getDerived().RebuildOMPIfClause( 8264 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8265 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8266 } 8267 8268 template <typename Derived> 8269 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8270 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8271 if (Cond.isInvalid()) 8272 return nullptr; 8273 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8274 C->getLParenLoc(), C->getEndLoc()); 8275 } 8276 8277 template <typename Derived> 8278 OMPClause * 8279 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8280 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8281 if (NumThreads.isInvalid()) 8282 return nullptr; 8283 return getDerived().RebuildOMPNumThreadsClause( 8284 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8285 } 8286 8287 template <typename Derived> 8288 OMPClause * 8289 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8290 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8291 if (E.isInvalid()) 8292 return nullptr; 8293 return getDerived().RebuildOMPSafelenClause( 8294 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8295 } 8296 8297 template <typename Derived> 8298 OMPClause * 8299 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8300 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8301 if (E.isInvalid()) 8302 return nullptr; 8303 return getDerived().RebuildOMPSimdlenClause( 8304 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8305 } 8306 8307 template <typename Derived> 8308 OMPClause * 8309 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8310 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8311 if (E.isInvalid()) 8312 return nullptr; 8313 return getDerived().RebuildOMPCollapseClause( 8314 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8315 } 8316 8317 template <typename Derived> 8318 OMPClause * 8319 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8320 return getDerived().RebuildOMPDefaultClause( 8321 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8322 C->getLParenLoc(), C->getEndLoc()); 8323 } 8324 8325 template <typename Derived> 8326 OMPClause * 8327 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8328 return getDerived().RebuildOMPProcBindClause( 8329 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8330 C->getLParenLoc(), C->getEndLoc()); 8331 } 8332 8333 template <typename Derived> 8334 OMPClause * 8335 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8336 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8337 if (E.isInvalid()) 8338 return nullptr; 8339 return getDerived().RebuildOMPScheduleClause( 8340 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8341 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8342 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8343 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8344 } 8345 8346 template <typename Derived> 8347 OMPClause * 8348 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8349 ExprResult E; 8350 if (auto *Num = C->getNumForLoops()) { 8351 E = getDerived().TransformExpr(Num); 8352 if (E.isInvalid()) 8353 return nullptr; 8354 } 8355 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8356 C->getLParenLoc(), E.get()); 8357 } 8358 8359 template <typename Derived> 8360 OMPClause * 8361 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8362 // No need to rebuild this clause, no template-dependent parameters. 8363 return C; 8364 } 8365 8366 template <typename Derived> 8367 OMPClause * 8368 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8369 // No need to rebuild this clause, no template-dependent parameters. 8370 return C; 8371 } 8372 8373 template <typename Derived> 8374 OMPClause * 8375 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8376 // No need to rebuild this clause, no template-dependent parameters. 8377 return C; 8378 } 8379 8380 template <typename Derived> 8381 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8382 // No need to rebuild this clause, no template-dependent parameters. 8383 return C; 8384 } 8385 8386 template <typename Derived> 8387 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8388 // No need to rebuild this clause, no template-dependent parameters. 8389 return C; 8390 } 8391 8392 template <typename Derived> 8393 OMPClause * 8394 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8395 // No need to rebuild this clause, no template-dependent parameters. 8396 return C; 8397 } 8398 8399 template <typename Derived> 8400 OMPClause * 8401 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8402 // No need to rebuild this clause, no template-dependent parameters. 8403 return C; 8404 } 8405 8406 template <typename Derived> 8407 OMPClause * 8408 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8409 // No need to rebuild this clause, no template-dependent parameters. 8410 return C; 8411 } 8412 8413 template <typename Derived> 8414 OMPClause * 8415 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8416 // No need to rebuild this clause, no template-dependent parameters. 8417 return C; 8418 } 8419 8420 template <typename Derived> 8421 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8422 // No need to rebuild this clause, no template-dependent parameters. 8423 return C; 8424 } 8425 8426 template <typename Derived> 8427 OMPClause * 8428 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8429 // No need to rebuild this clause, no template-dependent parameters. 8430 return C; 8431 } 8432 8433 template <typename Derived> 8434 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8435 OMPUnifiedAddressClause *C) { 8436 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8437 } 8438 8439 template <typename Derived> 8440 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8441 OMPUnifiedSharedMemoryClause *C) { 8442 llvm_unreachable( 8443 "unified_shared_memory clause cannot appear in dependent context"); 8444 } 8445 8446 template <typename Derived> 8447 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8448 OMPReverseOffloadClause *C) { 8449 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8450 } 8451 8452 template <typename Derived> 8453 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8454 OMPDynamicAllocatorsClause *C) { 8455 llvm_unreachable( 8456 "dynamic_allocators clause cannot appear in dependent context"); 8457 } 8458 8459 template <typename Derived> 8460 OMPClause * 8461 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8462 llvm::SmallVector<Expr *, 16> Vars; 8463 Vars.reserve(C->varlist_size()); 8464 for (auto *VE : C->varlists()) { 8465 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8466 if (EVar.isInvalid()) 8467 return nullptr; 8468 Vars.push_back(EVar.get()); 8469 } 8470 return getDerived().RebuildOMPPrivateClause( 8471 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8472 } 8473 8474 template <typename Derived> 8475 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8476 OMPFirstprivateClause *C) { 8477 llvm::SmallVector<Expr *, 16> Vars; 8478 Vars.reserve(C->varlist_size()); 8479 for (auto *VE : C->varlists()) { 8480 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8481 if (EVar.isInvalid()) 8482 return nullptr; 8483 Vars.push_back(EVar.get()); 8484 } 8485 return getDerived().RebuildOMPFirstprivateClause( 8486 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8487 } 8488 8489 template <typename Derived> 8490 OMPClause * 8491 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8492 llvm::SmallVector<Expr *, 16> Vars; 8493 Vars.reserve(C->varlist_size()); 8494 for (auto *VE : C->varlists()) { 8495 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8496 if (EVar.isInvalid()) 8497 return nullptr; 8498 Vars.push_back(EVar.get()); 8499 } 8500 return getDerived().RebuildOMPLastprivateClause( 8501 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8502 } 8503 8504 template <typename Derived> 8505 OMPClause * 8506 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8507 llvm::SmallVector<Expr *, 16> Vars; 8508 Vars.reserve(C->varlist_size()); 8509 for (auto *VE : C->varlists()) { 8510 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8511 if (EVar.isInvalid()) 8512 return nullptr; 8513 Vars.push_back(EVar.get()); 8514 } 8515 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8516 C->getLParenLoc(), C->getEndLoc()); 8517 } 8518 8519 template <typename Derived> 8520 OMPClause * 8521 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8522 llvm::SmallVector<Expr *, 16> Vars; 8523 Vars.reserve(C->varlist_size()); 8524 for (auto *VE : C->varlists()) { 8525 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8526 if (EVar.isInvalid()) 8527 return nullptr; 8528 Vars.push_back(EVar.get()); 8529 } 8530 CXXScopeSpec ReductionIdScopeSpec; 8531 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8532 8533 DeclarationNameInfo NameInfo = C->getNameInfo(); 8534 if (NameInfo.getName()) { 8535 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8536 if (!NameInfo.getName()) 8537 return nullptr; 8538 } 8539 // Build a list of all UDR decls with the same names ranged by the Scopes. 8540 // The Scope boundary is a duplication of the previous decl. 8541 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8542 for (auto *E : C->reduction_ops()) { 8543 // Transform all the decls. 8544 if (E) { 8545 auto *ULE = cast<UnresolvedLookupExpr>(E); 8546 UnresolvedSet<8> Decls; 8547 for (auto *D : ULE->decls()) { 8548 NamedDecl *InstD = 8549 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8550 Decls.addDecl(InstD, InstD->getAccess()); 8551 } 8552 UnresolvedReductions.push_back( 8553 UnresolvedLookupExpr::Create( 8554 SemaRef.Context, /*NamingClass=*/nullptr, 8555 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8556 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8557 Decls.begin(), Decls.end())); 8558 } else 8559 UnresolvedReductions.push_back(nullptr); 8560 } 8561 return getDerived().RebuildOMPReductionClause( 8562 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8563 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8564 } 8565 8566 template <typename Derived> 8567 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8568 OMPTaskReductionClause *C) { 8569 llvm::SmallVector<Expr *, 16> Vars; 8570 Vars.reserve(C->varlist_size()); 8571 for (auto *VE : C->varlists()) { 8572 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8573 if (EVar.isInvalid()) 8574 return nullptr; 8575 Vars.push_back(EVar.get()); 8576 } 8577 CXXScopeSpec ReductionIdScopeSpec; 8578 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8579 8580 DeclarationNameInfo NameInfo = C->getNameInfo(); 8581 if (NameInfo.getName()) { 8582 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8583 if (!NameInfo.getName()) 8584 return nullptr; 8585 } 8586 // Build a list of all UDR decls with the same names ranged by the Scopes. 8587 // The Scope boundary is a duplication of the previous decl. 8588 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8589 for (auto *E : C->reduction_ops()) { 8590 // Transform all the decls. 8591 if (E) { 8592 auto *ULE = cast<UnresolvedLookupExpr>(E); 8593 UnresolvedSet<8> Decls; 8594 for (auto *D : ULE->decls()) { 8595 NamedDecl *InstD = 8596 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8597 Decls.addDecl(InstD, InstD->getAccess()); 8598 } 8599 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8600 SemaRef.Context, /*NamingClass=*/nullptr, 8601 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8602 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8603 } else 8604 UnresolvedReductions.push_back(nullptr); 8605 } 8606 return getDerived().RebuildOMPTaskReductionClause( 8607 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8608 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8609 } 8610 8611 template <typename Derived> 8612 OMPClause * 8613 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8614 llvm::SmallVector<Expr *, 16> Vars; 8615 Vars.reserve(C->varlist_size()); 8616 for (auto *VE : C->varlists()) { 8617 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8618 if (EVar.isInvalid()) 8619 return nullptr; 8620 Vars.push_back(EVar.get()); 8621 } 8622 CXXScopeSpec ReductionIdScopeSpec; 8623 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8624 8625 DeclarationNameInfo NameInfo = C->getNameInfo(); 8626 if (NameInfo.getName()) { 8627 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8628 if (!NameInfo.getName()) 8629 return nullptr; 8630 } 8631 // Build a list of all UDR decls with the same names ranged by the Scopes. 8632 // The Scope boundary is a duplication of the previous decl. 8633 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8634 for (auto *E : C->reduction_ops()) { 8635 // Transform all the decls. 8636 if (E) { 8637 auto *ULE = cast<UnresolvedLookupExpr>(E); 8638 UnresolvedSet<8> Decls; 8639 for (auto *D : ULE->decls()) { 8640 NamedDecl *InstD = 8641 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8642 Decls.addDecl(InstD, InstD->getAccess()); 8643 } 8644 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8645 SemaRef.Context, /*NamingClass=*/nullptr, 8646 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8647 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8648 } else 8649 UnresolvedReductions.push_back(nullptr); 8650 } 8651 return getDerived().RebuildOMPInReductionClause( 8652 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8653 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8654 } 8655 8656 template <typename Derived> 8657 OMPClause * 8658 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8659 llvm::SmallVector<Expr *, 16> Vars; 8660 Vars.reserve(C->varlist_size()); 8661 for (auto *VE : C->varlists()) { 8662 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8663 if (EVar.isInvalid()) 8664 return nullptr; 8665 Vars.push_back(EVar.get()); 8666 } 8667 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8668 if (Step.isInvalid()) 8669 return nullptr; 8670 return getDerived().RebuildOMPLinearClause( 8671 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8672 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8673 } 8674 8675 template <typename Derived> 8676 OMPClause * 8677 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8678 llvm::SmallVector<Expr *, 16> Vars; 8679 Vars.reserve(C->varlist_size()); 8680 for (auto *VE : C->varlists()) { 8681 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8682 if (EVar.isInvalid()) 8683 return nullptr; 8684 Vars.push_back(EVar.get()); 8685 } 8686 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8687 if (Alignment.isInvalid()) 8688 return nullptr; 8689 return getDerived().RebuildOMPAlignedClause( 8690 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8691 C->getColonLoc(), C->getEndLoc()); 8692 } 8693 8694 template <typename Derived> 8695 OMPClause * 8696 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8697 llvm::SmallVector<Expr *, 16> Vars; 8698 Vars.reserve(C->varlist_size()); 8699 for (auto *VE : C->varlists()) { 8700 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8701 if (EVar.isInvalid()) 8702 return nullptr; 8703 Vars.push_back(EVar.get()); 8704 } 8705 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8706 C->getLParenLoc(), C->getEndLoc()); 8707 } 8708 8709 template <typename Derived> 8710 OMPClause * 8711 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8712 llvm::SmallVector<Expr *, 16> Vars; 8713 Vars.reserve(C->varlist_size()); 8714 for (auto *VE : C->varlists()) { 8715 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8716 if (EVar.isInvalid()) 8717 return nullptr; 8718 Vars.push_back(EVar.get()); 8719 } 8720 return getDerived().RebuildOMPCopyprivateClause( 8721 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8722 } 8723 8724 template <typename Derived> 8725 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8726 llvm::SmallVector<Expr *, 16> Vars; 8727 Vars.reserve(C->varlist_size()); 8728 for (auto *VE : C->varlists()) { 8729 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8730 if (EVar.isInvalid()) 8731 return nullptr; 8732 Vars.push_back(EVar.get()); 8733 } 8734 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8735 C->getLParenLoc(), C->getEndLoc()); 8736 } 8737 8738 template <typename Derived> 8739 OMPClause * 8740 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8741 llvm::SmallVector<Expr *, 16> Vars; 8742 Vars.reserve(C->varlist_size()); 8743 for (auto *VE : C->varlists()) { 8744 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8745 if (EVar.isInvalid()) 8746 return nullptr; 8747 Vars.push_back(EVar.get()); 8748 } 8749 return getDerived().RebuildOMPDependClause( 8750 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8751 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8752 } 8753 8754 template <typename Derived> 8755 OMPClause * 8756 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8757 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8758 if (E.isInvalid()) 8759 return nullptr; 8760 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8761 C->getLParenLoc(), C->getEndLoc()); 8762 } 8763 8764 template <typename Derived> 8765 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8766 llvm::SmallVector<Expr *, 16> Vars; 8767 Vars.reserve(C->varlist_size()); 8768 for (auto *VE : C->varlists()) { 8769 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8770 if (EVar.isInvalid()) 8771 return nullptr; 8772 Vars.push_back(EVar.get()); 8773 } 8774 return getDerived().RebuildOMPMapClause( 8775 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8776 C->getMapLoc(), C->getColonLoc(), Vars, C->getBeginLoc(), 8777 C->getLParenLoc(), C->getEndLoc()); 8778 } 8779 8780 template <typename Derived> 8781 OMPClause * 8782 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8783 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8784 if (E.isInvalid()) 8785 return nullptr; 8786 return getDerived().RebuildOMPNumTeamsClause( 8787 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8788 } 8789 8790 template <typename Derived> 8791 OMPClause * 8792 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8793 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8794 if (E.isInvalid()) 8795 return nullptr; 8796 return getDerived().RebuildOMPThreadLimitClause( 8797 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8798 } 8799 8800 template <typename Derived> 8801 OMPClause * 8802 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8803 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8804 if (E.isInvalid()) 8805 return nullptr; 8806 return getDerived().RebuildOMPPriorityClause( 8807 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8808 } 8809 8810 template <typename Derived> 8811 OMPClause * 8812 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8813 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8814 if (E.isInvalid()) 8815 return nullptr; 8816 return getDerived().RebuildOMPGrainsizeClause( 8817 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8818 } 8819 8820 template <typename Derived> 8821 OMPClause * 8822 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8823 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8824 if (E.isInvalid()) 8825 return nullptr; 8826 return getDerived().RebuildOMPNumTasksClause( 8827 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8828 } 8829 8830 template <typename Derived> 8831 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8832 ExprResult E = getDerived().TransformExpr(C->getHint()); 8833 if (E.isInvalid()) 8834 return nullptr; 8835 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 8836 C->getLParenLoc(), C->getEndLoc()); 8837 } 8838 8839 template <typename Derived> 8840 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8841 OMPDistScheduleClause *C) { 8842 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8843 if (E.isInvalid()) 8844 return nullptr; 8845 return getDerived().RebuildOMPDistScheduleClause( 8846 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8847 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8848 } 8849 8850 template <typename Derived> 8851 OMPClause * 8852 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8853 return C; 8854 } 8855 8856 template <typename Derived> 8857 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8858 llvm::SmallVector<Expr *, 16> Vars; 8859 Vars.reserve(C->varlist_size()); 8860 for (auto *VE : C->varlists()) { 8861 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8862 if (EVar.isInvalid()) 8863 return 0; 8864 Vars.push_back(EVar.get()); 8865 } 8866 return getDerived().RebuildOMPToClause(Vars, C->getBeginLoc(), 8867 C->getLParenLoc(), C->getEndLoc()); 8868 } 8869 8870 template <typename Derived> 8871 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8872 llvm::SmallVector<Expr *, 16> Vars; 8873 Vars.reserve(C->varlist_size()); 8874 for (auto *VE : C->varlists()) { 8875 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8876 if (EVar.isInvalid()) 8877 return 0; 8878 Vars.push_back(EVar.get()); 8879 } 8880 return getDerived().RebuildOMPFromClause(Vars, C->getBeginLoc(), 8881 C->getLParenLoc(), C->getEndLoc()); 8882 } 8883 8884 template <typename Derived> 8885 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8886 OMPUseDevicePtrClause *C) { 8887 llvm::SmallVector<Expr *, 16> Vars; 8888 Vars.reserve(C->varlist_size()); 8889 for (auto *VE : C->varlists()) { 8890 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8891 if (EVar.isInvalid()) 8892 return nullptr; 8893 Vars.push_back(EVar.get()); 8894 } 8895 return getDerived().RebuildOMPUseDevicePtrClause( 8896 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8897 } 8898 8899 template <typename Derived> 8900 OMPClause * 8901 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8902 llvm::SmallVector<Expr *, 16> Vars; 8903 Vars.reserve(C->varlist_size()); 8904 for (auto *VE : C->varlists()) { 8905 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8906 if (EVar.isInvalid()) 8907 return nullptr; 8908 Vars.push_back(EVar.get()); 8909 } 8910 return getDerived().RebuildOMPIsDevicePtrClause( 8911 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8912 } 8913 8914 //===----------------------------------------------------------------------===// 8915 // Expression transformation 8916 //===----------------------------------------------------------------------===// 8917 template<typename Derived> 8918 ExprResult 8919 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8920 if (!E->isTypeDependent()) 8921 return E; 8922 8923 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8924 E->getIdentKind()); 8925 } 8926 8927 template<typename Derived> 8928 ExprResult 8929 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8930 NestedNameSpecifierLoc QualifierLoc; 8931 if (E->getQualifierLoc()) { 8932 QualifierLoc 8933 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8934 if (!QualifierLoc) 8935 return ExprError(); 8936 } 8937 8938 ValueDecl *ND 8939 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8940 E->getDecl())); 8941 if (!ND) 8942 return ExprError(); 8943 8944 DeclarationNameInfo NameInfo = E->getNameInfo(); 8945 if (NameInfo.getName()) { 8946 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8947 if (!NameInfo.getName()) 8948 return ExprError(); 8949 } 8950 8951 if (!getDerived().AlwaysRebuild() && 8952 QualifierLoc == E->getQualifierLoc() && 8953 ND == E->getDecl() && 8954 NameInfo.getName() == E->getDecl()->getDeclName() && 8955 !E->hasExplicitTemplateArgs()) { 8956 8957 // Mark it referenced in the new context regardless. 8958 // FIXME: this is a bit instantiation-specific. 8959 SemaRef.MarkDeclRefReferenced(E); 8960 8961 return E; 8962 } 8963 8964 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8965 if (E->hasExplicitTemplateArgs()) { 8966 TemplateArgs = &TransArgs; 8967 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8968 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8969 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8970 E->getNumTemplateArgs(), 8971 TransArgs)) 8972 return ExprError(); 8973 } 8974 8975 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8976 TemplateArgs); 8977 } 8978 8979 template<typename Derived> 8980 ExprResult 8981 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8982 return E; 8983 } 8984 8985 template <typename Derived> 8986 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 8987 FixedPointLiteral *E) { 8988 return E; 8989 } 8990 8991 template<typename Derived> 8992 ExprResult 8993 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8994 return E; 8995 } 8996 8997 template<typename Derived> 8998 ExprResult 8999 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9000 return E; 9001 } 9002 9003 template<typename Derived> 9004 ExprResult 9005 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9006 return E; 9007 } 9008 9009 template<typename Derived> 9010 ExprResult 9011 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9012 return E; 9013 } 9014 9015 template<typename Derived> 9016 ExprResult 9017 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9018 if (FunctionDecl *FD = E->getDirectCallee()) 9019 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9020 return SemaRef.MaybeBindToTemporary(E); 9021 } 9022 9023 template<typename Derived> 9024 ExprResult 9025 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9026 ExprResult ControllingExpr = 9027 getDerived().TransformExpr(E->getControllingExpr()); 9028 if (ControllingExpr.isInvalid()) 9029 return ExprError(); 9030 9031 SmallVector<Expr *, 4> AssocExprs; 9032 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9033 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 9034 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 9035 if (TS) { 9036 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 9037 if (!AssocType) 9038 return ExprError(); 9039 AssocTypes.push_back(AssocType); 9040 } else { 9041 AssocTypes.push_back(nullptr); 9042 } 9043 9044 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 9045 if (AssocExpr.isInvalid()) 9046 return ExprError(); 9047 AssocExprs.push_back(AssocExpr.get()); 9048 } 9049 9050 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9051 E->getDefaultLoc(), 9052 E->getRParenLoc(), 9053 ControllingExpr.get(), 9054 AssocTypes, 9055 AssocExprs); 9056 } 9057 9058 template<typename Derived> 9059 ExprResult 9060 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9061 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9062 if (SubExpr.isInvalid()) 9063 return ExprError(); 9064 9065 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9066 return E; 9067 9068 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9069 E->getRParen()); 9070 } 9071 9072 /// The operand of a unary address-of operator has special rules: it's 9073 /// allowed to refer to a non-static member of a class even if there's no 'this' 9074 /// object available. 9075 template<typename Derived> 9076 ExprResult 9077 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9078 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9079 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9080 else 9081 return getDerived().TransformExpr(E); 9082 } 9083 9084 template<typename Derived> 9085 ExprResult 9086 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9087 ExprResult SubExpr; 9088 if (E->getOpcode() == UO_AddrOf) 9089 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9090 else 9091 SubExpr = TransformExpr(E->getSubExpr()); 9092 if (SubExpr.isInvalid()) 9093 return ExprError(); 9094 9095 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9096 return E; 9097 9098 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9099 E->getOpcode(), 9100 SubExpr.get()); 9101 } 9102 9103 template<typename Derived> 9104 ExprResult 9105 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9106 // Transform the type. 9107 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9108 if (!Type) 9109 return ExprError(); 9110 9111 // Transform all of the components into components similar to what the 9112 // parser uses. 9113 // FIXME: It would be slightly more efficient in the non-dependent case to 9114 // just map FieldDecls, rather than requiring the rebuilder to look for 9115 // the fields again. However, __builtin_offsetof is rare enough in 9116 // template code that we don't care. 9117 bool ExprChanged = false; 9118 typedef Sema::OffsetOfComponent Component; 9119 SmallVector<Component, 4> Components; 9120 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9121 const OffsetOfNode &ON = E->getComponent(I); 9122 Component Comp; 9123 Comp.isBrackets = true; 9124 Comp.LocStart = ON.getSourceRange().getBegin(); 9125 Comp.LocEnd = ON.getSourceRange().getEnd(); 9126 switch (ON.getKind()) { 9127 case OffsetOfNode::Array: { 9128 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9129 ExprResult Index = getDerived().TransformExpr(FromIndex); 9130 if (Index.isInvalid()) 9131 return ExprError(); 9132 9133 ExprChanged = ExprChanged || Index.get() != FromIndex; 9134 Comp.isBrackets = true; 9135 Comp.U.E = Index.get(); 9136 break; 9137 } 9138 9139 case OffsetOfNode::Field: 9140 case OffsetOfNode::Identifier: 9141 Comp.isBrackets = false; 9142 Comp.U.IdentInfo = ON.getFieldName(); 9143 if (!Comp.U.IdentInfo) 9144 continue; 9145 9146 break; 9147 9148 case OffsetOfNode::Base: 9149 // Will be recomputed during the rebuild. 9150 continue; 9151 } 9152 9153 Components.push_back(Comp); 9154 } 9155 9156 // If nothing changed, retain the existing expression. 9157 if (!getDerived().AlwaysRebuild() && 9158 Type == E->getTypeSourceInfo() && 9159 !ExprChanged) 9160 return E; 9161 9162 // Build a new offsetof expression. 9163 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9164 Components, E->getRParenLoc()); 9165 } 9166 9167 template<typename Derived> 9168 ExprResult 9169 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9170 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9171 "opaque value expression requires transformation"); 9172 return E; 9173 } 9174 9175 template<typename Derived> 9176 ExprResult 9177 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9178 return E; 9179 } 9180 9181 template<typename Derived> 9182 ExprResult 9183 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9184 // Rebuild the syntactic form. The original syntactic form has 9185 // opaque-value expressions in it, so strip those away and rebuild 9186 // the result. This is a really awful way of doing this, but the 9187 // better solution (rebuilding the semantic expressions and 9188 // rebinding OVEs as necessary) doesn't work; we'd need 9189 // TreeTransform to not strip away implicit conversions. 9190 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9191 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9192 if (result.isInvalid()) return ExprError(); 9193 9194 // If that gives us a pseudo-object result back, the pseudo-object 9195 // expression must have been an lvalue-to-rvalue conversion which we 9196 // should reapply. 9197 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9198 result = SemaRef.checkPseudoObjectRValue(result.get()); 9199 9200 return result; 9201 } 9202 9203 template<typename Derived> 9204 ExprResult 9205 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9206 UnaryExprOrTypeTraitExpr *E) { 9207 if (E->isArgumentType()) { 9208 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9209 9210 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9211 if (!NewT) 9212 return ExprError(); 9213 9214 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9215 return E; 9216 9217 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9218 E->getKind(), 9219 E->getSourceRange()); 9220 } 9221 9222 // C++0x [expr.sizeof]p1: 9223 // The operand is either an expression, which is an unevaluated operand 9224 // [...] 9225 EnterExpressionEvaluationContext Unevaluated( 9226 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9227 Sema::ReuseLambdaContextDecl); 9228 9229 // Try to recover if we have something like sizeof(T::X) where X is a type. 9230 // Notably, there must be *exactly* one set of parens if X is a type. 9231 TypeSourceInfo *RecoveryTSI = nullptr; 9232 ExprResult SubExpr; 9233 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9234 if (auto *DRE = 9235 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9236 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9237 PE, DRE, false, &RecoveryTSI); 9238 else 9239 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9240 9241 if (RecoveryTSI) { 9242 return getDerived().RebuildUnaryExprOrTypeTrait( 9243 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9244 } else if (SubExpr.isInvalid()) 9245 return ExprError(); 9246 9247 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9248 return E; 9249 9250 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9251 E->getOperatorLoc(), 9252 E->getKind(), 9253 E->getSourceRange()); 9254 } 9255 9256 template<typename Derived> 9257 ExprResult 9258 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9259 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9260 if (LHS.isInvalid()) 9261 return ExprError(); 9262 9263 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9264 if (RHS.isInvalid()) 9265 return ExprError(); 9266 9267 9268 if (!getDerived().AlwaysRebuild() && 9269 LHS.get() == E->getLHS() && 9270 RHS.get() == E->getRHS()) 9271 return E; 9272 9273 return getDerived().RebuildArraySubscriptExpr( 9274 LHS.get(), 9275 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9276 } 9277 9278 template <typename Derived> 9279 ExprResult 9280 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9281 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9282 if (Base.isInvalid()) 9283 return ExprError(); 9284 9285 ExprResult LowerBound; 9286 if (E->getLowerBound()) { 9287 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9288 if (LowerBound.isInvalid()) 9289 return ExprError(); 9290 } 9291 9292 ExprResult Length; 9293 if (E->getLength()) { 9294 Length = getDerived().TransformExpr(E->getLength()); 9295 if (Length.isInvalid()) 9296 return ExprError(); 9297 } 9298 9299 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9300 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9301 return E; 9302 9303 return getDerived().RebuildOMPArraySectionExpr( 9304 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9305 Length.get(), E->getRBracketLoc()); 9306 } 9307 9308 template<typename Derived> 9309 ExprResult 9310 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9311 // Transform the callee. 9312 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9313 if (Callee.isInvalid()) 9314 return ExprError(); 9315 9316 // Transform arguments. 9317 bool ArgChanged = false; 9318 SmallVector<Expr*, 8> Args; 9319 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9320 &ArgChanged)) 9321 return ExprError(); 9322 9323 if (!getDerived().AlwaysRebuild() && 9324 Callee.get() == E->getCallee() && 9325 !ArgChanged) 9326 return SemaRef.MaybeBindToTemporary(E); 9327 9328 // FIXME: Wrong source location information for the '('. 9329 SourceLocation FakeLParenLoc 9330 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9331 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9332 Args, 9333 E->getRParenLoc()); 9334 } 9335 9336 template<typename Derived> 9337 ExprResult 9338 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9339 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9340 if (Base.isInvalid()) 9341 return ExprError(); 9342 9343 NestedNameSpecifierLoc QualifierLoc; 9344 if (E->hasQualifier()) { 9345 QualifierLoc 9346 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9347 9348 if (!QualifierLoc) 9349 return ExprError(); 9350 } 9351 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9352 9353 ValueDecl *Member 9354 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9355 E->getMemberDecl())); 9356 if (!Member) 9357 return ExprError(); 9358 9359 NamedDecl *FoundDecl = E->getFoundDecl(); 9360 if (FoundDecl == E->getMemberDecl()) { 9361 FoundDecl = Member; 9362 } else { 9363 FoundDecl = cast_or_null<NamedDecl>( 9364 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9365 if (!FoundDecl) 9366 return ExprError(); 9367 } 9368 9369 if (!getDerived().AlwaysRebuild() && 9370 Base.get() == E->getBase() && 9371 QualifierLoc == E->getQualifierLoc() && 9372 Member == E->getMemberDecl() && 9373 FoundDecl == E->getFoundDecl() && 9374 !E->hasExplicitTemplateArgs()) { 9375 9376 // Mark it referenced in the new context regardless. 9377 // FIXME: this is a bit instantiation-specific. 9378 SemaRef.MarkMemberReferenced(E); 9379 9380 return E; 9381 } 9382 9383 TemplateArgumentListInfo TransArgs; 9384 if (E->hasExplicitTemplateArgs()) { 9385 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9386 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9387 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9388 E->getNumTemplateArgs(), 9389 TransArgs)) 9390 return ExprError(); 9391 } 9392 9393 // FIXME: Bogus source location for the operator 9394 SourceLocation FakeOperatorLoc = 9395 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9396 9397 // FIXME: to do this check properly, we will need to preserve the 9398 // first-qualifier-in-scope here, just in case we had a dependent 9399 // base (and therefore couldn't do the check) and a 9400 // nested-name-qualifier (and therefore could do the lookup). 9401 NamedDecl *FirstQualifierInScope = nullptr; 9402 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9403 if (MemberNameInfo.getName()) { 9404 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9405 if (!MemberNameInfo.getName()) 9406 return ExprError(); 9407 } 9408 9409 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9410 E->isArrow(), 9411 QualifierLoc, 9412 TemplateKWLoc, 9413 MemberNameInfo, 9414 Member, 9415 FoundDecl, 9416 (E->hasExplicitTemplateArgs() 9417 ? &TransArgs : nullptr), 9418 FirstQualifierInScope); 9419 } 9420 9421 template<typename Derived> 9422 ExprResult 9423 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9424 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9425 if (LHS.isInvalid()) 9426 return ExprError(); 9427 9428 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9429 if (RHS.isInvalid()) 9430 return ExprError(); 9431 9432 if (!getDerived().AlwaysRebuild() && 9433 LHS.get() == E->getLHS() && 9434 RHS.get() == E->getRHS()) 9435 return E; 9436 9437 Sema::FPContractStateRAII FPContractState(getSema()); 9438 getSema().FPFeatures = E->getFPFeatures(); 9439 9440 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9441 LHS.get(), RHS.get()); 9442 } 9443 9444 template<typename Derived> 9445 ExprResult 9446 TreeTransform<Derived>::TransformCompoundAssignOperator( 9447 CompoundAssignOperator *E) { 9448 return getDerived().TransformBinaryOperator(E); 9449 } 9450 9451 template<typename Derived> 9452 ExprResult TreeTransform<Derived>:: 9453 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9454 // Just rebuild the common and RHS expressions and see whether we 9455 // get any changes. 9456 9457 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9458 if (commonExpr.isInvalid()) 9459 return ExprError(); 9460 9461 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9462 if (rhs.isInvalid()) 9463 return ExprError(); 9464 9465 if (!getDerived().AlwaysRebuild() && 9466 commonExpr.get() == e->getCommon() && 9467 rhs.get() == e->getFalseExpr()) 9468 return e; 9469 9470 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9471 e->getQuestionLoc(), 9472 nullptr, 9473 e->getColonLoc(), 9474 rhs.get()); 9475 } 9476 9477 template<typename Derived> 9478 ExprResult 9479 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9480 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9481 if (Cond.isInvalid()) 9482 return ExprError(); 9483 9484 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9485 if (LHS.isInvalid()) 9486 return ExprError(); 9487 9488 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9489 if (RHS.isInvalid()) 9490 return ExprError(); 9491 9492 if (!getDerived().AlwaysRebuild() && 9493 Cond.get() == E->getCond() && 9494 LHS.get() == E->getLHS() && 9495 RHS.get() == E->getRHS()) 9496 return E; 9497 9498 return getDerived().RebuildConditionalOperator(Cond.get(), 9499 E->getQuestionLoc(), 9500 LHS.get(), 9501 E->getColonLoc(), 9502 RHS.get()); 9503 } 9504 9505 template<typename Derived> 9506 ExprResult 9507 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9508 // Implicit casts are eliminated during transformation, since they 9509 // will be recomputed by semantic analysis after transformation. 9510 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9511 } 9512 9513 template<typename Derived> 9514 ExprResult 9515 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9516 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9517 if (!Type) 9518 return ExprError(); 9519 9520 ExprResult SubExpr 9521 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9522 if (SubExpr.isInvalid()) 9523 return ExprError(); 9524 9525 if (!getDerived().AlwaysRebuild() && 9526 Type == E->getTypeInfoAsWritten() && 9527 SubExpr.get() == E->getSubExpr()) 9528 return E; 9529 9530 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9531 Type, 9532 E->getRParenLoc(), 9533 SubExpr.get()); 9534 } 9535 9536 template<typename Derived> 9537 ExprResult 9538 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9539 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9540 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9541 if (!NewT) 9542 return ExprError(); 9543 9544 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9545 if (Init.isInvalid()) 9546 return ExprError(); 9547 9548 if (!getDerived().AlwaysRebuild() && 9549 OldT == NewT && 9550 Init.get() == E->getInitializer()) 9551 return SemaRef.MaybeBindToTemporary(E); 9552 9553 // Note: the expression type doesn't necessarily match the 9554 // type-as-written, but that's okay, because it should always be 9555 // derivable from the initializer. 9556 9557 return getDerived().RebuildCompoundLiteralExpr( 9558 E->getLParenLoc(), NewT, 9559 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9560 } 9561 9562 template<typename Derived> 9563 ExprResult 9564 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9565 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9566 if (Base.isInvalid()) 9567 return ExprError(); 9568 9569 if (!getDerived().AlwaysRebuild() && 9570 Base.get() == E->getBase()) 9571 return E; 9572 9573 // FIXME: Bad source location 9574 SourceLocation FakeOperatorLoc = 9575 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9576 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9577 E->getAccessorLoc(), 9578 E->getAccessor()); 9579 } 9580 9581 template<typename Derived> 9582 ExprResult 9583 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9584 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9585 E = Syntactic; 9586 9587 bool InitChanged = false; 9588 9589 EnterExpressionEvaluationContext Context( 9590 getSema(), EnterExpressionEvaluationContext::InitList); 9591 9592 SmallVector<Expr*, 4> Inits; 9593 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9594 Inits, &InitChanged)) 9595 return ExprError(); 9596 9597 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9598 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9599 // in some cases. We can't reuse it in general, because the syntactic and 9600 // semantic forms are linked, and we can't know that semantic form will 9601 // match even if the syntactic form does. 9602 } 9603 9604 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9605 E->getRBraceLoc()); 9606 } 9607 9608 template<typename Derived> 9609 ExprResult 9610 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9611 Designation Desig; 9612 9613 // transform the initializer value 9614 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9615 if (Init.isInvalid()) 9616 return ExprError(); 9617 9618 // transform the designators. 9619 SmallVector<Expr*, 4> ArrayExprs; 9620 bool ExprChanged = false; 9621 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9622 if (D.isFieldDesignator()) { 9623 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9624 D.getDotLoc(), 9625 D.getFieldLoc())); 9626 if (D.getField()) { 9627 FieldDecl *Field = cast_or_null<FieldDecl>( 9628 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9629 if (Field != D.getField()) 9630 // Rebuild the expression when the transformed FieldDecl is 9631 // different to the already assigned FieldDecl. 9632 ExprChanged = true; 9633 } else { 9634 // Ensure that the designator expression is rebuilt when there isn't 9635 // a resolved FieldDecl in the designator as we don't want to assign 9636 // a FieldDecl to a pattern designator that will be instantiated again. 9637 ExprChanged = true; 9638 } 9639 continue; 9640 } 9641 9642 if (D.isArrayDesignator()) { 9643 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9644 if (Index.isInvalid()) 9645 return ExprError(); 9646 9647 Desig.AddDesignator( 9648 Designator::getArray(Index.get(), D.getLBracketLoc())); 9649 9650 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9651 ArrayExprs.push_back(Index.get()); 9652 continue; 9653 } 9654 9655 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9656 ExprResult Start 9657 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9658 if (Start.isInvalid()) 9659 return ExprError(); 9660 9661 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9662 if (End.isInvalid()) 9663 return ExprError(); 9664 9665 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9666 End.get(), 9667 D.getLBracketLoc(), 9668 D.getEllipsisLoc())); 9669 9670 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9671 End.get() != E->getArrayRangeEnd(D); 9672 9673 ArrayExprs.push_back(Start.get()); 9674 ArrayExprs.push_back(End.get()); 9675 } 9676 9677 if (!getDerived().AlwaysRebuild() && 9678 Init.get() == E->getInit() && 9679 !ExprChanged) 9680 return E; 9681 9682 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9683 E->getEqualOrColonLoc(), 9684 E->usesGNUSyntax(), Init.get()); 9685 } 9686 9687 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9688 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9689 template<typename Derived> 9690 ExprResult 9691 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9692 DesignatedInitUpdateExpr *E) { 9693 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9694 "initializer"); 9695 return ExprError(); 9696 } 9697 9698 template<typename Derived> 9699 ExprResult 9700 TreeTransform<Derived>::TransformNoInitExpr( 9701 NoInitExpr *E) { 9702 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9703 return ExprError(); 9704 } 9705 9706 template<typename Derived> 9707 ExprResult 9708 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9709 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9710 return ExprError(); 9711 } 9712 9713 template<typename Derived> 9714 ExprResult 9715 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9716 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9717 return ExprError(); 9718 } 9719 9720 template<typename Derived> 9721 ExprResult 9722 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9723 ImplicitValueInitExpr *E) { 9724 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9725 9726 // FIXME: Will we ever have proper type location here? Will we actually 9727 // need to transform the type? 9728 QualType T = getDerived().TransformType(E->getType()); 9729 if (T.isNull()) 9730 return ExprError(); 9731 9732 if (!getDerived().AlwaysRebuild() && 9733 T == E->getType()) 9734 return E; 9735 9736 return getDerived().RebuildImplicitValueInitExpr(T); 9737 } 9738 9739 template<typename Derived> 9740 ExprResult 9741 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9742 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9743 if (!TInfo) 9744 return ExprError(); 9745 9746 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9747 if (SubExpr.isInvalid()) 9748 return ExprError(); 9749 9750 if (!getDerived().AlwaysRebuild() && 9751 TInfo == E->getWrittenTypeInfo() && 9752 SubExpr.get() == E->getSubExpr()) 9753 return E; 9754 9755 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9756 TInfo, E->getRParenLoc()); 9757 } 9758 9759 template<typename Derived> 9760 ExprResult 9761 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9762 bool ArgumentChanged = false; 9763 SmallVector<Expr*, 4> Inits; 9764 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9765 &ArgumentChanged)) 9766 return ExprError(); 9767 9768 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9769 Inits, 9770 E->getRParenLoc()); 9771 } 9772 9773 /// Transform an address-of-label expression. 9774 /// 9775 /// By default, the transformation of an address-of-label expression always 9776 /// rebuilds the expression, so that the label identifier can be resolved to 9777 /// the corresponding label statement by semantic analysis. 9778 template<typename Derived> 9779 ExprResult 9780 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9781 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9782 E->getLabel()); 9783 if (!LD) 9784 return ExprError(); 9785 9786 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9787 cast<LabelDecl>(LD)); 9788 } 9789 9790 template<typename Derived> 9791 ExprResult 9792 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9793 SemaRef.ActOnStartStmtExpr(); 9794 StmtResult SubStmt 9795 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9796 if (SubStmt.isInvalid()) { 9797 SemaRef.ActOnStmtExprError(); 9798 return ExprError(); 9799 } 9800 9801 if (!getDerived().AlwaysRebuild() && 9802 SubStmt.get() == E->getSubStmt()) { 9803 // Calling this an 'error' is unintuitive, but it does the right thing. 9804 SemaRef.ActOnStmtExprError(); 9805 return SemaRef.MaybeBindToTemporary(E); 9806 } 9807 9808 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9809 SubStmt.get(), 9810 E->getRParenLoc()); 9811 } 9812 9813 template<typename Derived> 9814 ExprResult 9815 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9816 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9817 if (Cond.isInvalid()) 9818 return ExprError(); 9819 9820 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9821 if (LHS.isInvalid()) 9822 return ExprError(); 9823 9824 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9825 if (RHS.isInvalid()) 9826 return ExprError(); 9827 9828 if (!getDerived().AlwaysRebuild() && 9829 Cond.get() == E->getCond() && 9830 LHS.get() == E->getLHS() && 9831 RHS.get() == E->getRHS()) 9832 return E; 9833 9834 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9835 Cond.get(), LHS.get(), RHS.get(), 9836 E->getRParenLoc()); 9837 } 9838 9839 template<typename Derived> 9840 ExprResult 9841 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9842 return E; 9843 } 9844 9845 template<typename Derived> 9846 ExprResult 9847 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9848 switch (E->getOperator()) { 9849 case OO_New: 9850 case OO_Delete: 9851 case OO_Array_New: 9852 case OO_Array_Delete: 9853 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9854 9855 case OO_Call: { 9856 // This is a call to an object's operator(). 9857 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9858 9859 // Transform the object itself. 9860 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9861 if (Object.isInvalid()) 9862 return ExprError(); 9863 9864 // FIXME: Poor location information 9865 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9866 static_cast<Expr *>(Object.get())->getEndLoc()); 9867 9868 // Transform the call arguments. 9869 SmallVector<Expr*, 8> Args; 9870 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9871 Args)) 9872 return ExprError(); 9873 9874 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 9875 E->getEndLoc()); 9876 } 9877 9878 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9879 case OO_##Name: 9880 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9881 #include "clang/Basic/OperatorKinds.def" 9882 case OO_Subscript: 9883 // Handled below. 9884 break; 9885 9886 case OO_Conditional: 9887 llvm_unreachable("conditional operator is not actually overloadable"); 9888 9889 case OO_None: 9890 case NUM_OVERLOADED_OPERATORS: 9891 llvm_unreachable("not an overloaded operator?"); 9892 } 9893 9894 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9895 if (Callee.isInvalid()) 9896 return ExprError(); 9897 9898 ExprResult First; 9899 if (E->getOperator() == OO_Amp) 9900 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9901 else 9902 First = getDerived().TransformExpr(E->getArg(0)); 9903 if (First.isInvalid()) 9904 return ExprError(); 9905 9906 ExprResult Second; 9907 if (E->getNumArgs() == 2) { 9908 Second = getDerived().TransformExpr(E->getArg(1)); 9909 if (Second.isInvalid()) 9910 return ExprError(); 9911 } 9912 9913 if (!getDerived().AlwaysRebuild() && 9914 Callee.get() == E->getCallee() && 9915 First.get() == E->getArg(0) && 9916 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9917 return SemaRef.MaybeBindToTemporary(E); 9918 9919 Sema::FPContractStateRAII FPContractState(getSema()); 9920 getSema().FPFeatures = E->getFPFeatures(); 9921 9922 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9923 E->getOperatorLoc(), 9924 Callee.get(), 9925 First.get(), 9926 Second.get()); 9927 } 9928 9929 template<typename Derived> 9930 ExprResult 9931 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9932 return getDerived().TransformCallExpr(E); 9933 } 9934 9935 template<typename Derived> 9936 ExprResult 9937 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9938 // Transform the callee. 9939 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9940 if (Callee.isInvalid()) 9941 return ExprError(); 9942 9943 // Transform exec config. 9944 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9945 if (EC.isInvalid()) 9946 return ExprError(); 9947 9948 // Transform arguments. 9949 bool ArgChanged = false; 9950 SmallVector<Expr*, 8> Args; 9951 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9952 &ArgChanged)) 9953 return ExprError(); 9954 9955 if (!getDerived().AlwaysRebuild() && 9956 Callee.get() == E->getCallee() && 9957 !ArgChanged) 9958 return SemaRef.MaybeBindToTemporary(E); 9959 9960 // FIXME: Wrong source location information for the '('. 9961 SourceLocation FakeLParenLoc 9962 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9963 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9964 Args, 9965 E->getRParenLoc(), EC.get()); 9966 } 9967 9968 template<typename Derived> 9969 ExprResult 9970 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9971 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9972 if (!Type) 9973 return ExprError(); 9974 9975 ExprResult SubExpr 9976 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9977 if (SubExpr.isInvalid()) 9978 return ExprError(); 9979 9980 if (!getDerived().AlwaysRebuild() && 9981 Type == E->getTypeInfoAsWritten() && 9982 SubExpr.get() == E->getSubExpr()) 9983 return E; 9984 return getDerived().RebuildCXXNamedCastExpr( 9985 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9986 Type, E->getAngleBrackets().getEnd(), 9987 // FIXME. this should be '(' location 9988 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9989 } 9990 9991 template<typename Derived> 9992 ExprResult 9993 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9994 return getDerived().TransformCXXNamedCastExpr(E); 9995 } 9996 9997 template<typename Derived> 9998 ExprResult 9999 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10000 return getDerived().TransformCXXNamedCastExpr(E); 10001 } 10002 10003 template<typename Derived> 10004 ExprResult 10005 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10006 CXXReinterpretCastExpr *E) { 10007 return getDerived().TransformCXXNamedCastExpr(E); 10008 } 10009 10010 template<typename Derived> 10011 ExprResult 10012 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10013 return getDerived().TransformCXXNamedCastExpr(E); 10014 } 10015 10016 template<typename Derived> 10017 ExprResult 10018 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10019 CXXFunctionalCastExpr *E) { 10020 TypeSourceInfo *Type = 10021 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10022 if (!Type) 10023 return ExprError(); 10024 10025 ExprResult SubExpr 10026 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10027 if (SubExpr.isInvalid()) 10028 return ExprError(); 10029 10030 if (!getDerived().AlwaysRebuild() && 10031 Type == E->getTypeInfoAsWritten() && 10032 SubExpr.get() == E->getSubExpr()) 10033 return E; 10034 10035 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10036 E->getLParenLoc(), 10037 SubExpr.get(), 10038 E->getRParenLoc(), 10039 E->isListInitialization()); 10040 } 10041 10042 template<typename Derived> 10043 ExprResult 10044 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10045 if (E->isTypeOperand()) { 10046 TypeSourceInfo *TInfo 10047 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10048 if (!TInfo) 10049 return ExprError(); 10050 10051 if (!getDerived().AlwaysRebuild() && 10052 TInfo == E->getTypeOperandSourceInfo()) 10053 return E; 10054 10055 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10056 TInfo, E->getEndLoc()); 10057 } 10058 10059 // We don't know whether the subexpression is potentially evaluated until 10060 // after we perform semantic analysis. We speculatively assume it is 10061 // unevaluated; it will get fixed later if the subexpression is in fact 10062 // potentially evaluated. 10063 EnterExpressionEvaluationContext Unevaluated( 10064 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10065 Sema::ReuseLambdaContextDecl); 10066 10067 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10068 if (SubExpr.isInvalid()) 10069 return ExprError(); 10070 10071 if (!getDerived().AlwaysRebuild() && 10072 SubExpr.get() == E->getExprOperand()) 10073 return E; 10074 10075 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10076 SubExpr.get(), E->getEndLoc()); 10077 } 10078 10079 template<typename Derived> 10080 ExprResult 10081 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10082 if (E->isTypeOperand()) { 10083 TypeSourceInfo *TInfo 10084 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10085 if (!TInfo) 10086 return ExprError(); 10087 10088 if (!getDerived().AlwaysRebuild() && 10089 TInfo == E->getTypeOperandSourceInfo()) 10090 return E; 10091 10092 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10093 TInfo, E->getEndLoc()); 10094 } 10095 10096 EnterExpressionEvaluationContext Unevaluated( 10097 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10098 10099 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10100 if (SubExpr.isInvalid()) 10101 return ExprError(); 10102 10103 if (!getDerived().AlwaysRebuild() && 10104 SubExpr.get() == E->getExprOperand()) 10105 return E; 10106 10107 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10108 SubExpr.get(), E->getEndLoc()); 10109 } 10110 10111 template<typename Derived> 10112 ExprResult 10113 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10114 return E; 10115 } 10116 10117 template<typename Derived> 10118 ExprResult 10119 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10120 CXXNullPtrLiteralExpr *E) { 10121 return E; 10122 } 10123 10124 template<typename Derived> 10125 ExprResult 10126 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10127 QualType T = getSema().getCurrentThisType(); 10128 10129 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10130 // Make sure that we capture 'this'. 10131 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10132 return E; 10133 } 10134 10135 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10136 } 10137 10138 template<typename Derived> 10139 ExprResult 10140 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10141 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10142 if (SubExpr.isInvalid()) 10143 return ExprError(); 10144 10145 if (!getDerived().AlwaysRebuild() && 10146 SubExpr.get() == E->getSubExpr()) 10147 return E; 10148 10149 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10150 E->isThrownVariableInScope()); 10151 } 10152 10153 template<typename Derived> 10154 ExprResult 10155 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10156 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10157 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10158 if (!Param) 10159 return ExprError(); 10160 10161 if (!getDerived().AlwaysRebuild() && 10162 Param == E->getParam()) 10163 return E; 10164 10165 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10166 } 10167 10168 template<typename Derived> 10169 ExprResult 10170 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10171 FieldDecl *Field = cast_or_null<FieldDecl>( 10172 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10173 if (!Field) 10174 return ExprError(); 10175 10176 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10177 return E; 10178 10179 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10180 } 10181 10182 template<typename Derived> 10183 ExprResult 10184 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10185 CXXScalarValueInitExpr *E) { 10186 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10187 if (!T) 10188 return ExprError(); 10189 10190 if (!getDerived().AlwaysRebuild() && 10191 T == E->getTypeSourceInfo()) 10192 return E; 10193 10194 return getDerived().RebuildCXXScalarValueInitExpr(T, 10195 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10196 E->getRParenLoc()); 10197 } 10198 10199 template<typename Derived> 10200 ExprResult 10201 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10202 // Transform the type that we're allocating 10203 TypeSourceInfo *AllocTypeInfo = 10204 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10205 if (!AllocTypeInfo) 10206 return ExprError(); 10207 10208 // Transform the size of the array we're allocating (if any). 10209 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10210 if (ArraySize.isInvalid()) 10211 return ExprError(); 10212 10213 // Transform the placement arguments (if any). 10214 bool ArgumentChanged = false; 10215 SmallVector<Expr*, 8> PlacementArgs; 10216 if (getDerived().TransformExprs(E->getPlacementArgs(), 10217 E->getNumPlacementArgs(), true, 10218 PlacementArgs, &ArgumentChanged)) 10219 return ExprError(); 10220 10221 // Transform the initializer (if any). 10222 Expr *OldInit = E->getInitializer(); 10223 ExprResult NewInit; 10224 if (OldInit) 10225 NewInit = getDerived().TransformInitializer(OldInit, true); 10226 if (NewInit.isInvalid()) 10227 return ExprError(); 10228 10229 // Transform new operator and delete operator. 10230 FunctionDecl *OperatorNew = nullptr; 10231 if (E->getOperatorNew()) { 10232 OperatorNew = cast_or_null<FunctionDecl>( 10233 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10234 if (!OperatorNew) 10235 return ExprError(); 10236 } 10237 10238 FunctionDecl *OperatorDelete = nullptr; 10239 if (E->getOperatorDelete()) { 10240 OperatorDelete = cast_or_null<FunctionDecl>( 10241 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10242 if (!OperatorDelete) 10243 return ExprError(); 10244 } 10245 10246 if (!getDerived().AlwaysRebuild() && 10247 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10248 ArraySize.get() == E->getArraySize() && 10249 NewInit.get() == OldInit && 10250 OperatorNew == E->getOperatorNew() && 10251 OperatorDelete == E->getOperatorDelete() && 10252 !ArgumentChanged) { 10253 // Mark any declarations we need as referenced. 10254 // FIXME: instantiation-specific. 10255 if (OperatorNew) 10256 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10257 if (OperatorDelete) 10258 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10259 10260 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10261 QualType ElementType 10262 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10263 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10264 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10265 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10266 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10267 } 10268 } 10269 } 10270 10271 return E; 10272 } 10273 10274 QualType AllocType = AllocTypeInfo->getType(); 10275 if (!ArraySize.get()) { 10276 // If no array size was specified, but the new expression was 10277 // instantiated with an array type (e.g., "new T" where T is 10278 // instantiated with "int[4]"), extract the outer bound from the 10279 // array type as our array size. We do this with constant and 10280 // dependently-sized array types. 10281 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10282 if (!ArrayT) { 10283 // Do nothing 10284 } else if (const ConstantArrayType *ConsArrayT 10285 = dyn_cast<ConstantArrayType>(ArrayT)) { 10286 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10287 SemaRef.Context.getSizeType(), 10288 /*FIXME:*/ E->getBeginLoc()); 10289 AllocType = ConsArrayT->getElementType(); 10290 } else if (const DependentSizedArrayType *DepArrayT 10291 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10292 if (DepArrayT->getSizeExpr()) { 10293 ArraySize = DepArrayT->getSizeExpr(); 10294 AllocType = DepArrayT->getElementType(); 10295 } 10296 } 10297 } 10298 10299 return getDerived().RebuildCXXNewExpr( 10300 E->getBeginLoc(), E->isGlobalNew(), 10301 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10302 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10303 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10304 } 10305 10306 template<typename Derived> 10307 ExprResult 10308 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10309 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10310 if (Operand.isInvalid()) 10311 return ExprError(); 10312 10313 // Transform the delete operator, if known. 10314 FunctionDecl *OperatorDelete = nullptr; 10315 if (E->getOperatorDelete()) { 10316 OperatorDelete = cast_or_null<FunctionDecl>( 10317 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10318 if (!OperatorDelete) 10319 return ExprError(); 10320 } 10321 10322 if (!getDerived().AlwaysRebuild() && 10323 Operand.get() == E->getArgument() && 10324 OperatorDelete == E->getOperatorDelete()) { 10325 // Mark any declarations we need as referenced. 10326 // FIXME: instantiation-specific. 10327 if (OperatorDelete) 10328 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10329 10330 if (!E->getArgument()->isTypeDependent()) { 10331 QualType Destroyed = SemaRef.Context.getBaseElementType( 10332 E->getDestroyedType()); 10333 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10334 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10335 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10336 SemaRef.LookupDestructor(Record)); 10337 } 10338 } 10339 10340 return E; 10341 } 10342 10343 return getDerived().RebuildCXXDeleteExpr( 10344 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10345 } 10346 10347 template<typename Derived> 10348 ExprResult 10349 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10350 CXXPseudoDestructorExpr *E) { 10351 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10352 if (Base.isInvalid()) 10353 return ExprError(); 10354 10355 ParsedType ObjectTypePtr; 10356 bool MayBePseudoDestructor = false; 10357 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10358 E->getOperatorLoc(), 10359 E->isArrow()? tok::arrow : tok::period, 10360 ObjectTypePtr, 10361 MayBePseudoDestructor); 10362 if (Base.isInvalid()) 10363 return ExprError(); 10364 10365 QualType ObjectType = ObjectTypePtr.get(); 10366 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10367 if (QualifierLoc) { 10368 QualifierLoc 10369 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10370 if (!QualifierLoc) 10371 return ExprError(); 10372 } 10373 CXXScopeSpec SS; 10374 SS.Adopt(QualifierLoc); 10375 10376 PseudoDestructorTypeStorage Destroyed; 10377 if (E->getDestroyedTypeInfo()) { 10378 TypeSourceInfo *DestroyedTypeInfo 10379 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10380 ObjectType, nullptr, SS); 10381 if (!DestroyedTypeInfo) 10382 return ExprError(); 10383 Destroyed = DestroyedTypeInfo; 10384 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10385 // We aren't likely to be able to resolve the identifier down to a type 10386 // now anyway, so just retain the identifier. 10387 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10388 E->getDestroyedTypeLoc()); 10389 } else { 10390 // Look for a destructor known with the given name. 10391 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10392 *E->getDestroyedTypeIdentifier(), 10393 E->getDestroyedTypeLoc(), 10394 /*Scope=*/nullptr, 10395 SS, ObjectTypePtr, 10396 false); 10397 if (!T) 10398 return ExprError(); 10399 10400 Destroyed 10401 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10402 E->getDestroyedTypeLoc()); 10403 } 10404 10405 TypeSourceInfo *ScopeTypeInfo = nullptr; 10406 if (E->getScopeTypeInfo()) { 10407 CXXScopeSpec EmptySS; 10408 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10409 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10410 if (!ScopeTypeInfo) 10411 return ExprError(); 10412 } 10413 10414 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10415 E->getOperatorLoc(), 10416 E->isArrow(), 10417 SS, 10418 ScopeTypeInfo, 10419 E->getColonColonLoc(), 10420 E->getTildeLoc(), 10421 Destroyed); 10422 } 10423 10424 template <typename Derived> 10425 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10426 bool RequiresADL, 10427 LookupResult &R) { 10428 // Transform all the decls. 10429 bool AllEmptyPacks = true; 10430 for (auto *OldD : Old->decls()) { 10431 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10432 if (!InstD) { 10433 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10434 // This can happen because of dependent hiding. 10435 if (isa<UsingShadowDecl>(OldD)) 10436 continue; 10437 else { 10438 R.clear(); 10439 return true; 10440 } 10441 } 10442 10443 // Expand using pack declarations. 10444 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10445 ArrayRef<NamedDecl*> Decls = SingleDecl; 10446 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10447 Decls = UPD->expansions(); 10448 10449 // Expand using declarations. 10450 for (auto *D : Decls) { 10451 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10452 for (auto *SD : UD->shadows()) 10453 R.addDecl(SD); 10454 } else { 10455 R.addDecl(D); 10456 } 10457 } 10458 10459 AllEmptyPacks &= Decls.empty(); 10460 }; 10461 10462 // C++ [temp.res]/8.4.2: 10463 // The program is ill-formed, no diagnostic required, if [...] lookup for 10464 // a name in the template definition found a using-declaration, but the 10465 // lookup in the corresponding scope in the instantiation odoes not find 10466 // any declarations because the using-declaration was a pack expansion and 10467 // the corresponding pack is empty 10468 if (AllEmptyPacks && !RequiresADL) { 10469 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10470 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10471 return true; 10472 } 10473 10474 // Resolve a kind, but don't do any further analysis. If it's 10475 // ambiguous, the callee needs to deal with it. 10476 R.resolveKind(); 10477 return false; 10478 } 10479 10480 template<typename Derived> 10481 ExprResult 10482 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10483 UnresolvedLookupExpr *Old) { 10484 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10485 Sema::LookupOrdinaryName); 10486 10487 // Transform the declaration set. 10488 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10489 return ExprError(); 10490 10491 // Rebuild the nested-name qualifier, if present. 10492 CXXScopeSpec SS; 10493 if (Old->getQualifierLoc()) { 10494 NestedNameSpecifierLoc QualifierLoc 10495 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10496 if (!QualifierLoc) 10497 return ExprError(); 10498 10499 SS.Adopt(QualifierLoc); 10500 } 10501 10502 if (Old->getNamingClass()) { 10503 CXXRecordDecl *NamingClass 10504 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10505 Old->getNameLoc(), 10506 Old->getNamingClass())); 10507 if (!NamingClass) { 10508 R.clear(); 10509 return ExprError(); 10510 } 10511 10512 R.setNamingClass(NamingClass); 10513 } 10514 10515 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10516 10517 // If we have neither explicit template arguments, nor the template keyword, 10518 // it's a normal declaration name or member reference. 10519 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10520 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10521 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10522 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10523 // give a good diagnostic. 10524 if (D && D->isCXXInstanceMember()) { 10525 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10526 /*TemplateArgs=*/nullptr, 10527 /*Scope=*/nullptr); 10528 } 10529 10530 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10531 } 10532 10533 // If we have template arguments, rebuild them, then rebuild the 10534 // templateid expression. 10535 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10536 if (Old->hasExplicitTemplateArgs() && 10537 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10538 Old->getNumTemplateArgs(), 10539 TransArgs)) { 10540 R.clear(); 10541 return ExprError(); 10542 } 10543 10544 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10545 Old->requiresADL(), &TransArgs); 10546 } 10547 10548 template<typename Derived> 10549 ExprResult 10550 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10551 bool ArgChanged = false; 10552 SmallVector<TypeSourceInfo *, 4> Args; 10553 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10554 TypeSourceInfo *From = E->getArg(I); 10555 TypeLoc FromTL = From->getTypeLoc(); 10556 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10557 TypeLocBuilder TLB; 10558 TLB.reserve(FromTL.getFullDataSize()); 10559 QualType To = getDerived().TransformType(TLB, FromTL); 10560 if (To.isNull()) 10561 return ExprError(); 10562 10563 if (To == From->getType()) 10564 Args.push_back(From); 10565 else { 10566 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10567 ArgChanged = true; 10568 } 10569 continue; 10570 } 10571 10572 ArgChanged = true; 10573 10574 // We have a pack expansion. Instantiate it. 10575 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10576 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10577 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10578 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10579 10580 // Determine whether the set of unexpanded parameter packs can and should 10581 // be expanded. 10582 bool Expand = true; 10583 bool RetainExpansion = false; 10584 Optional<unsigned> OrigNumExpansions = 10585 ExpansionTL.getTypePtr()->getNumExpansions(); 10586 Optional<unsigned> NumExpansions = OrigNumExpansions; 10587 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10588 PatternTL.getSourceRange(), 10589 Unexpanded, 10590 Expand, RetainExpansion, 10591 NumExpansions)) 10592 return ExprError(); 10593 10594 if (!Expand) { 10595 // The transform has determined that we should perform a simple 10596 // transformation on the pack expansion, producing another pack 10597 // expansion. 10598 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10599 10600 TypeLocBuilder TLB; 10601 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10602 10603 QualType To = getDerived().TransformType(TLB, PatternTL); 10604 if (To.isNull()) 10605 return ExprError(); 10606 10607 To = getDerived().RebuildPackExpansionType(To, 10608 PatternTL.getSourceRange(), 10609 ExpansionTL.getEllipsisLoc(), 10610 NumExpansions); 10611 if (To.isNull()) 10612 return ExprError(); 10613 10614 PackExpansionTypeLoc ToExpansionTL 10615 = TLB.push<PackExpansionTypeLoc>(To); 10616 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10617 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10618 continue; 10619 } 10620 10621 // Expand the pack expansion by substituting for each argument in the 10622 // pack(s). 10623 for (unsigned I = 0; I != *NumExpansions; ++I) { 10624 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10625 TypeLocBuilder TLB; 10626 TLB.reserve(PatternTL.getFullDataSize()); 10627 QualType To = getDerived().TransformType(TLB, PatternTL); 10628 if (To.isNull()) 10629 return ExprError(); 10630 10631 if (To->containsUnexpandedParameterPack()) { 10632 To = getDerived().RebuildPackExpansionType(To, 10633 PatternTL.getSourceRange(), 10634 ExpansionTL.getEllipsisLoc(), 10635 NumExpansions); 10636 if (To.isNull()) 10637 return ExprError(); 10638 10639 PackExpansionTypeLoc ToExpansionTL 10640 = TLB.push<PackExpansionTypeLoc>(To); 10641 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10642 } 10643 10644 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10645 } 10646 10647 if (!RetainExpansion) 10648 continue; 10649 10650 // If we're supposed to retain a pack expansion, do so by temporarily 10651 // forgetting the partially-substituted parameter pack. 10652 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10653 10654 TypeLocBuilder TLB; 10655 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10656 10657 QualType To = getDerived().TransformType(TLB, PatternTL); 10658 if (To.isNull()) 10659 return ExprError(); 10660 10661 To = getDerived().RebuildPackExpansionType(To, 10662 PatternTL.getSourceRange(), 10663 ExpansionTL.getEllipsisLoc(), 10664 NumExpansions); 10665 if (To.isNull()) 10666 return ExprError(); 10667 10668 PackExpansionTypeLoc ToExpansionTL 10669 = TLB.push<PackExpansionTypeLoc>(To); 10670 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10671 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10672 } 10673 10674 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10675 return E; 10676 10677 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10678 E->getEndLoc()); 10679 } 10680 10681 template<typename Derived> 10682 ExprResult 10683 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10684 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10685 if (!T) 10686 return ExprError(); 10687 10688 if (!getDerived().AlwaysRebuild() && 10689 T == E->getQueriedTypeSourceInfo()) 10690 return E; 10691 10692 ExprResult SubExpr; 10693 { 10694 EnterExpressionEvaluationContext Unevaluated( 10695 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10696 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10697 if (SubExpr.isInvalid()) 10698 return ExprError(); 10699 10700 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10701 return E; 10702 } 10703 10704 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10705 SubExpr.get(), E->getEndLoc()); 10706 } 10707 10708 template<typename Derived> 10709 ExprResult 10710 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10711 ExprResult SubExpr; 10712 { 10713 EnterExpressionEvaluationContext Unevaluated( 10714 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10715 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10716 if (SubExpr.isInvalid()) 10717 return ExprError(); 10718 10719 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10720 return E; 10721 } 10722 10723 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10724 SubExpr.get(), E->getEndLoc()); 10725 } 10726 10727 template <typename Derived> 10728 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10729 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10730 TypeSourceInfo **RecoveryTSI) { 10731 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10732 DRE, AddrTaken, RecoveryTSI); 10733 10734 // Propagate both errors and recovered types, which return ExprEmpty. 10735 if (!NewDRE.isUsable()) 10736 return NewDRE; 10737 10738 // We got an expr, wrap it up in parens. 10739 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10740 return PE; 10741 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10742 PE->getRParen()); 10743 } 10744 10745 template <typename Derived> 10746 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10747 DependentScopeDeclRefExpr *E) { 10748 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10749 nullptr); 10750 } 10751 10752 template<typename Derived> 10753 ExprResult 10754 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10755 DependentScopeDeclRefExpr *E, 10756 bool IsAddressOfOperand, 10757 TypeSourceInfo **RecoveryTSI) { 10758 assert(E->getQualifierLoc()); 10759 NestedNameSpecifierLoc QualifierLoc 10760 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10761 if (!QualifierLoc) 10762 return ExprError(); 10763 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10764 10765 // TODO: If this is a conversion-function-id, verify that the 10766 // destination type name (if present) resolves the same way after 10767 // instantiation as it did in the local scope. 10768 10769 DeclarationNameInfo NameInfo 10770 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10771 if (!NameInfo.getName()) 10772 return ExprError(); 10773 10774 if (!E->hasExplicitTemplateArgs()) { 10775 if (!getDerived().AlwaysRebuild() && 10776 QualifierLoc == E->getQualifierLoc() && 10777 // Note: it is sufficient to compare the Name component of NameInfo: 10778 // if name has not changed, DNLoc has not changed either. 10779 NameInfo.getName() == E->getDeclName()) 10780 return E; 10781 10782 return getDerived().RebuildDependentScopeDeclRefExpr( 10783 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10784 IsAddressOfOperand, RecoveryTSI); 10785 } 10786 10787 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10788 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10789 E->getNumTemplateArgs(), 10790 TransArgs)) 10791 return ExprError(); 10792 10793 return getDerived().RebuildDependentScopeDeclRefExpr( 10794 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10795 RecoveryTSI); 10796 } 10797 10798 template<typename Derived> 10799 ExprResult 10800 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10801 // CXXConstructExprs other than for list-initialization and 10802 // CXXTemporaryObjectExpr are always implicit, so when we have 10803 // a 1-argument construction we just transform that argument. 10804 if ((E->getNumArgs() == 1 || 10805 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10806 (!getDerived().DropCallArgument(E->getArg(0))) && 10807 !E->isListInitialization()) 10808 return getDerived().TransformExpr(E->getArg(0)); 10809 10810 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10811 10812 QualType T = getDerived().TransformType(E->getType()); 10813 if (T.isNull()) 10814 return ExprError(); 10815 10816 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10817 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10818 if (!Constructor) 10819 return ExprError(); 10820 10821 bool ArgumentChanged = false; 10822 SmallVector<Expr*, 8> Args; 10823 { 10824 EnterExpressionEvaluationContext Context( 10825 getSema(), EnterExpressionEvaluationContext::InitList, 10826 E->isListInitialization()); 10827 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10828 &ArgumentChanged)) 10829 return ExprError(); 10830 } 10831 10832 if (!getDerived().AlwaysRebuild() && 10833 T == E->getType() && 10834 Constructor == E->getConstructor() && 10835 !ArgumentChanged) { 10836 // Mark the constructor as referenced. 10837 // FIXME: Instantiation-specific 10838 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10839 return E; 10840 } 10841 10842 return getDerived().RebuildCXXConstructExpr( 10843 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 10844 E->hadMultipleCandidates(), E->isListInitialization(), 10845 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 10846 E->getConstructionKind(), E->getParenOrBraceRange()); 10847 } 10848 10849 template<typename Derived> 10850 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10851 CXXInheritedCtorInitExpr *E) { 10852 QualType T = getDerived().TransformType(E->getType()); 10853 if (T.isNull()) 10854 return ExprError(); 10855 10856 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10857 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10858 if (!Constructor) 10859 return ExprError(); 10860 10861 if (!getDerived().AlwaysRebuild() && 10862 T == E->getType() && 10863 Constructor == E->getConstructor()) { 10864 // Mark the constructor as referenced. 10865 // FIXME: Instantiation-specific 10866 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10867 return E; 10868 } 10869 10870 return getDerived().RebuildCXXInheritedCtorInitExpr( 10871 T, E->getLocation(), Constructor, 10872 E->constructsVBase(), E->inheritedFromVBase()); 10873 } 10874 10875 /// Transform a C++ temporary-binding expression. 10876 /// 10877 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10878 /// transform the subexpression and return that. 10879 template<typename Derived> 10880 ExprResult 10881 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10882 return getDerived().TransformExpr(E->getSubExpr()); 10883 } 10884 10885 /// Transform a C++ expression that contains cleanups that should 10886 /// be run after the expression is evaluated. 10887 /// 10888 /// Since ExprWithCleanups nodes are implicitly generated, we 10889 /// just transform the subexpression and return that. 10890 template<typename Derived> 10891 ExprResult 10892 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10893 return getDerived().TransformExpr(E->getSubExpr()); 10894 } 10895 10896 template<typename Derived> 10897 ExprResult 10898 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10899 CXXTemporaryObjectExpr *E) { 10900 TypeSourceInfo *T = 10901 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10902 if (!T) 10903 return ExprError(); 10904 10905 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10906 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10907 if (!Constructor) 10908 return ExprError(); 10909 10910 bool ArgumentChanged = false; 10911 SmallVector<Expr*, 8> Args; 10912 Args.reserve(E->getNumArgs()); 10913 { 10914 EnterExpressionEvaluationContext Context( 10915 getSema(), EnterExpressionEvaluationContext::InitList, 10916 E->isListInitialization()); 10917 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10918 &ArgumentChanged)) 10919 return ExprError(); 10920 } 10921 10922 if (!getDerived().AlwaysRebuild() && 10923 T == E->getTypeSourceInfo() && 10924 Constructor == E->getConstructor() && 10925 !ArgumentChanged) { 10926 // FIXME: Instantiation-specific 10927 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10928 return SemaRef.MaybeBindToTemporary(E); 10929 } 10930 10931 // FIXME: We should just pass E->isListInitialization(), but we're not 10932 // prepared to handle list-initialization without a child InitListExpr. 10933 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 10934 return getDerived().RebuildCXXTemporaryObjectExpr( 10935 T, LParenLoc, Args, E->getEndLoc(), 10936 /*ListInitialization=*/LParenLoc.isInvalid()); 10937 } 10938 10939 template<typename Derived> 10940 ExprResult 10941 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10942 // Transform any init-capture expressions before entering the scope of the 10943 // lambda body, because they are not semantically within that scope. 10944 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10945 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10946 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10947 E->explicit_capture_begin()); 10948 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10949 CEnd = E->capture_end(); 10950 C != CEnd; ++C) { 10951 if (!E->isInitCapture(C)) 10952 continue; 10953 EnterExpressionEvaluationContext EEEC( 10954 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10955 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10956 C->getCapturedVar()->getInit(), 10957 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10958 10959 if (NewExprInitResult.isInvalid()) 10960 return ExprError(); 10961 Expr *NewExprInit = NewExprInitResult.get(); 10962 10963 VarDecl *OldVD = C->getCapturedVar(); 10964 QualType NewInitCaptureType = 10965 getSema().buildLambdaInitCaptureInitialization( 10966 C->getLocation(), OldVD->getType()->isReferenceType(), 10967 OldVD->getIdentifier(), 10968 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10969 NewExprInitResult = NewExprInit; 10970 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10971 std::make_pair(NewExprInitResult, NewInitCaptureType); 10972 } 10973 10974 // Transform the template parameters, and add them to the current 10975 // instantiation scope. The null case is handled correctly. 10976 auto TPL = getDerived().TransformTemplateParameterList( 10977 E->getTemplateParameterList()); 10978 10979 // Transform the type of the original lambda's call operator. 10980 // The transformation MUST be done in the CurrentInstantiationScope since 10981 // it introduces a mapping of the original to the newly created 10982 // transformed parameters. 10983 TypeSourceInfo *NewCallOpTSI = nullptr; 10984 { 10985 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10986 FunctionProtoTypeLoc OldCallOpFPTL = 10987 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10988 10989 TypeLocBuilder NewCallOpTLBuilder; 10990 SmallVector<QualType, 4> ExceptionStorage; 10991 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10992 QualType NewCallOpType = TransformFunctionProtoType( 10993 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10994 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10995 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10996 ExceptionStorage, Changed); 10997 }); 10998 if (NewCallOpType.isNull()) 10999 return ExprError(); 11000 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11001 NewCallOpType); 11002 } 11003 11004 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11005 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11006 LSI->GLTemplateParameterList = TPL; 11007 11008 // Create the local class that will describe the lambda. 11009 CXXRecordDecl *Class 11010 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11011 NewCallOpTSI, 11012 /*KnownDependent=*/false, 11013 E->getCaptureDefault()); 11014 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 11015 11016 // Build the call operator. 11017 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11018 Class, E->getIntroducerRange(), NewCallOpTSI, 11019 E->getCallOperator()->getEndLoc(), 11020 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11021 E->getCallOperator()->isConstexpr()); 11022 11023 LSI->CallOperator = NewCallOperator; 11024 11025 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11026 I != NumParams; ++I) { 11027 auto *P = NewCallOperator->getParamDecl(I); 11028 if (P->hasUninstantiatedDefaultArg()) { 11029 EnterExpressionEvaluationContext Eval( 11030 getSema(), 11031 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11032 ExprResult R = getDerived().TransformExpr( 11033 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11034 P->setDefaultArg(R.get()); 11035 } 11036 } 11037 11038 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11039 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 11040 11041 // Introduce the context of the call operator. 11042 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11043 /*NewThisContext*/false); 11044 11045 // Enter the scope of the lambda. 11046 getSema().buildLambdaScope(LSI, NewCallOperator, 11047 E->getIntroducerRange(), 11048 E->getCaptureDefault(), 11049 E->getCaptureDefaultLoc(), 11050 E->hasExplicitParameters(), 11051 E->hasExplicitResultType(), 11052 E->isMutable()); 11053 11054 bool Invalid = false; 11055 11056 // Transform captures. 11057 bool FinishedExplicitCaptures = false; 11058 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11059 CEnd = E->capture_end(); 11060 C != CEnd; ++C) { 11061 // When we hit the first implicit capture, tell Sema that we've finished 11062 // the list of explicit captures. 11063 if (!FinishedExplicitCaptures && C->isImplicit()) { 11064 getSema().finishLambdaExplicitCaptures(LSI); 11065 FinishedExplicitCaptures = true; 11066 } 11067 11068 // Capturing 'this' is trivial. 11069 if (C->capturesThis()) { 11070 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11071 /*BuildAndDiagnose*/ true, nullptr, 11072 C->getCaptureKind() == LCK_StarThis); 11073 continue; 11074 } 11075 // Captured expression will be recaptured during captured variables 11076 // rebuilding. 11077 if (C->capturesVLAType()) 11078 continue; 11079 11080 // Rebuild init-captures, including the implied field declaration. 11081 if (E->isInitCapture(C)) { 11082 InitCaptureInfoTy InitExprTypePair = 11083 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11084 ExprResult Init = InitExprTypePair.first; 11085 QualType InitQualType = InitExprTypePair.second; 11086 if (Init.isInvalid() || InitQualType.isNull()) { 11087 Invalid = true; 11088 continue; 11089 } 11090 VarDecl *OldVD = C->getCapturedVar(); 11091 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11092 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11093 OldVD->getInitStyle(), Init.get()); 11094 if (!NewVD) 11095 Invalid = true; 11096 else { 11097 getDerived().transformedLocalDecl(OldVD, NewVD); 11098 } 11099 getSema().buildInitCaptureField(LSI, NewVD); 11100 continue; 11101 } 11102 11103 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11104 11105 // Determine the capture kind for Sema. 11106 Sema::TryCaptureKind Kind 11107 = C->isImplicit()? Sema::TryCapture_Implicit 11108 : C->getCaptureKind() == LCK_ByCopy 11109 ? Sema::TryCapture_ExplicitByVal 11110 : Sema::TryCapture_ExplicitByRef; 11111 SourceLocation EllipsisLoc; 11112 if (C->isPackExpansion()) { 11113 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11114 bool ShouldExpand = false; 11115 bool RetainExpansion = false; 11116 Optional<unsigned> NumExpansions; 11117 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11118 C->getLocation(), 11119 Unexpanded, 11120 ShouldExpand, RetainExpansion, 11121 NumExpansions)) { 11122 Invalid = true; 11123 continue; 11124 } 11125 11126 if (ShouldExpand) { 11127 // The transform has determined that we should perform an expansion; 11128 // transform and capture each of the arguments. 11129 // expansion of the pattern. Do so. 11130 VarDecl *Pack = C->getCapturedVar(); 11131 for (unsigned I = 0; I != *NumExpansions; ++I) { 11132 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11133 VarDecl *CapturedVar 11134 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11135 Pack)); 11136 if (!CapturedVar) { 11137 Invalid = true; 11138 continue; 11139 } 11140 11141 // Capture the transformed variable. 11142 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11143 } 11144 11145 // FIXME: Retain a pack expansion if RetainExpansion is true. 11146 11147 continue; 11148 } 11149 11150 EllipsisLoc = C->getEllipsisLoc(); 11151 } 11152 11153 // Transform the captured variable. 11154 VarDecl *CapturedVar 11155 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11156 C->getCapturedVar())); 11157 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11158 Invalid = true; 11159 continue; 11160 } 11161 11162 // Capture the transformed variable. 11163 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11164 EllipsisLoc); 11165 } 11166 if (!FinishedExplicitCaptures) 11167 getSema().finishLambdaExplicitCaptures(LSI); 11168 11169 // Enter a new evaluation context to insulate the lambda from any 11170 // cleanups from the enclosing full-expression. 11171 getSema().PushExpressionEvaluationContext( 11172 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11173 11174 // Instantiate the body of the lambda expression. 11175 StmtResult Body = 11176 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11177 11178 // ActOnLambda* will pop the function scope for us. 11179 FuncScopeCleanup.disable(); 11180 11181 if (Body.isInvalid()) { 11182 SavedContext.pop(); 11183 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11184 /*IsInstantiation=*/true); 11185 return ExprError(); 11186 } 11187 11188 // Copy the LSI before ActOnFinishFunctionBody removes it. 11189 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11190 // the call operator. 11191 auto LSICopy = *LSI; 11192 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11193 /*IsInstantiation*/ true); 11194 SavedContext.pop(); 11195 11196 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11197 &LSICopy); 11198 } 11199 11200 template<typename Derived> 11201 ExprResult 11202 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11203 CXXUnresolvedConstructExpr *E) { 11204 TypeSourceInfo *T = 11205 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11206 if (!T) 11207 return ExprError(); 11208 11209 bool ArgumentChanged = false; 11210 SmallVector<Expr*, 8> Args; 11211 Args.reserve(E->arg_size()); 11212 { 11213 EnterExpressionEvaluationContext Context( 11214 getSema(), EnterExpressionEvaluationContext::InitList, 11215 E->isListInitialization()); 11216 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11217 &ArgumentChanged)) 11218 return ExprError(); 11219 } 11220 11221 if (!getDerived().AlwaysRebuild() && 11222 T == E->getTypeSourceInfo() && 11223 !ArgumentChanged) 11224 return E; 11225 11226 // FIXME: we're faking the locations of the commas 11227 return getDerived().RebuildCXXUnresolvedConstructExpr( 11228 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11229 } 11230 11231 template<typename Derived> 11232 ExprResult 11233 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11234 CXXDependentScopeMemberExpr *E) { 11235 // Transform the base of the expression. 11236 ExprResult Base((Expr*) nullptr); 11237 Expr *OldBase; 11238 QualType BaseType; 11239 QualType ObjectType; 11240 if (!E->isImplicitAccess()) { 11241 OldBase = E->getBase(); 11242 Base = getDerived().TransformExpr(OldBase); 11243 if (Base.isInvalid()) 11244 return ExprError(); 11245 11246 // Start the member reference and compute the object's type. 11247 ParsedType ObjectTy; 11248 bool MayBePseudoDestructor = false; 11249 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11250 E->getOperatorLoc(), 11251 E->isArrow()? tok::arrow : tok::period, 11252 ObjectTy, 11253 MayBePseudoDestructor); 11254 if (Base.isInvalid()) 11255 return ExprError(); 11256 11257 ObjectType = ObjectTy.get(); 11258 BaseType = ((Expr*) Base.get())->getType(); 11259 } else { 11260 OldBase = nullptr; 11261 BaseType = getDerived().TransformType(E->getBaseType()); 11262 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11263 } 11264 11265 // Transform the first part of the nested-name-specifier that qualifies 11266 // the member name. 11267 NamedDecl *FirstQualifierInScope 11268 = getDerived().TransformFirstQualifierInScope( 11269 E->getFirstQualifierFoundInScope(), 11270 E->getQualifierLoc().getBeginLoc()); 11271 11272 NestedNameSpecifierLoc QualifierLoc; 11273 if (E->getQualifier()) { 11274 QualifierLoc 11275 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11276 ObjectType, 11277 FirstQualifierInScope); 11278 if (!QualifierLoc) 11279 return ExprError(); 11280 } 11281 11282 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11283 11284 // TODO: If this is a conversion-function-id, verify that the 11285 // destination type name (if present) resolves the same way after 11286 // instantiation as it did in the local scope. 11287 11288 DeclarationNameInfo NameInfo 11289 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11290 if (!NameInfo.getName()) 11291 return ExprError(); 11292 11293 if (!E->hasExplicitTemplateArgs()) { 11294 // This is a reference to a member without an explicitly-specified 11295 // template argument list. Optimize for this common case. 11296 if (!getDerived().AlwaysRebuild() && 11297 Base.get() == OldBase && 11298 BaseType == E->getBaseType() && 11299 QualifierLoc == E->getQualifierLoc() && 11300 NameInfo.getName() == E->getMember() && 11301 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11302 return E; 11303 11304 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11305 BaseType, 11306 E->isArrow(), 11307 E->getOperatorLoc(), 11308 QualifierLoc, 11309 TemplateKWLoc, 11310 FirstQualifierInScope, 11311 NameInfo, 11312 /*TemplateArgs*/nullptr); 11313 } 11314 11315 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11316 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11317 E->getNumTemplateArgs(), 11318 TransArgs)) 11319 return ExprError(); 11320 11321 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11322 BaseType, 11323 E->isArrow(), 11324 E->getOperatorLoc(), 11325 QualifierLoc, 11326 TemplateKWLoc, 11327 FirstQualifierInScope, 11328 NameInfo, 11329 &TransArgs); 11330 } 11331 11332 template<typename Derived> 11333 ExprResult 11334 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11335 // Transform the base of the expression. 11336 ExprResult Base((Expr*) nullptr); 11337 QualType BaseType; 11338 if (!Old->isImplicitAccess()) { 11339 Base = getDerived().TransformExpr(Old->getBase()); 11340 if (Base.isInvalid()) 11341 return ExprError(); 11342 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11343 Old->isArrow()); 11344 if (Base.isInvalid()) 11345 return ExprError(); 11346 BaseType = Base.get()->getType(); 11347 } else { 11348 BaseType = getDerived().TransformType(Old->getBaseType()); 11349 } 11350 11351 NestedNameSpecifierLoc QualifierLoc; 11352 if (Old->getQualifierLoc()) { 11353 QualifierLoc 11354 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11355 if (!QualifierLoc) 11356 return ExprError(); 11357 } 11358 11359 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11360 11361 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11362 Sema::LookupOrdinaryName); 11363 11364 // Transform the declaration set. 11365 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11366 return ExprError(); 11367 11368 // Determine the naming class. 11369 if (Old->getNamingClass()) { 11370 CXXRecordDecl *NamingClass 11371 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11372 Old->getMemberLoc(), 11373 Old->getNamingClass())); 11374 if (!NamingClass) 11375 return ExprError(); 11376 11377 R.setNamingClass(NamingClass); 11378 } 11379 11380 TemplateArgumentListInfo TransArgs; 11381 if (Old->hasExplicitTemplateArgs()) { 11382 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11383 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11384 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11385 Old->getNumTemplateArgs(), 11386 TransArgs)) 11387 return ExprError(); 11388 } 11389 11390 // FIXME: to do this check properly, we will need to preserve the 11391 // first-qualifier-in-scope here, just in case we had a dependent 11392 // base (and therefore couldn't do the check) and a 11393 // nested-name-qualifier (and therefore could do the lookup). 11394 NamedDecl *FirstQualifierInScope = nullptr; 11395 11396 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11397 BaseType, 11398 Old->getOperatorLoc(), 11399 Old->isArrow(), 11400 QualifierLoc, 11401 TemplateKWLoc, 11402 FirstQualifierInScope, 11403 R, 11404 (Old->hasExplicitTemplateArgs() 11405 ? &TransArgs : nullptr)); 11406 } 11407 11408 template<typename Derived> 11409 ExprResult 11410 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11411 EnterExpressionEvaluationContext Unevaluated( 11412 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11413 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11414 if (SubExpr.isInvalid()) 11415 return ExprError(); 11416 11417 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11418 return E; 11419 11420 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11421 } 11422 11423 template<typename Derived> 11424 ExprResult 11425 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11426 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11427 if (Pattern.isInvalid()) 11428 return ExprError(); 11429 11430 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11431 return E; 11432 11433 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11434 E->getNumExpansions()); 11435 } 11436 11437 template<typename Derived> 11438 ExprResult 11439 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11440 // If E is not value-dependent, then nothing will change when we transform it. 11441 // Note: This is an instantiation-centric view. 11442 if (!E->isValueDependent()) 11443 return E; 11444 11445 EnterExpressionEvaluationContext Unevaluated( 11446 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11447 11448 ArrayRef<TemplateArgument> PackArgs; 11449 TemplateArgument ArgStorage; 11450 11451 // Find the argument list to transform. 11452 if (E->isPartiallySubstituted()) { 11453 PackArgs = E->getPartialArguments(); 11454 } else if (E->isValueDependent()) { 11455 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11456 bool ShouldExpand = false; 11457 bool RetainExpansion = false; 11458 Optional<unsigned> NumExpansions; 11459 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11460 Unexpanded, 11461 ShouldExpand, RetainExpansion, 11462 NumExpansions)) 11463 return ExprError(); 11464 11465 // If we need to expand the pack, build a template argument from it and 11466 // expand that. 11467 if (ShouldExpand) { 11468 auto *Pack = E->getPack(); 11469 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11470 ArgStorage = getSema().Context.getPackExpansionType( 11471 getSema().Context.getTypeDeclType(TTPD), None); 11472 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11473 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11474 } else { 11475 auto *VD = cast<ValueDecl>(Pack); 11476 ExprResult DRE = getSema().BuildDeclRefExpr( 11477 VD, VD->getType().getNonLValueExprType(getSema().Context), 11478 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11479 E->getPackLoc()); 11480 if (DRE.isInvalid()) 11481 return ExprError(); 11482 ArgStorage = new (getSema().Context) PackExpansionExpr( 11483 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11484 } 11485 PackArgs = ArgStorage; 11486 } 11487 } 11488 11489 // If we're not expanding the pack, just transform the decl. 11490 if (!PackArgs.size()) { 11491 auto *Pack = cast_or_null<NamedDecl>( 11492 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11493 if (!Pack) 11494 return ExprError(); 11495 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11496 E->getPackLoc(), 11497 E->getRParenLoc(), None, None); 11498 } 11499 11500 // Try to compute the result without performing a partial substitution. 11501 Optional<unsigned> Result = 0; 11502 for (const TemplateArgument &Arg : PackArgs) { 11503 if (!Arg.isPackExpansion()) { 11504 Result = *Result + 1; 11505 continue; 11506 } 11507 11508 TemplateArgumentLoc ArgLoc; 11509 InventTemplateArgumentLoc(Arg, ArgLoc); 11510 11511 // Find the pattern of the pack expansion. 11512 SourceLocation Ellipsis; 11513 Optional<unsigned> OrigNumExpansions; 11514 TemplateArgumentLoc Pattern = 11515 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11516 OrigNumExpansions); 11517 11518 // Substitute under the pack expansion. Do not expand the pack (yet). 11519 TemplateArgumentLoc OutPattern; 11520 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11521 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11522 /*Uneval*/ true)) 11523 return true; 11524 11525 // See if we can determine the number of arguments from the result. 11526 Optional<unsigned> NumExpansions = 11527 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11528 if (!NumExpansions) { 11529 // No: we must be in an alias template expansion, and we're going to need 11530 // to actually expand the packs. 11531 Result = None; 11532 break; 11533 } 11534 11535 Result = *Result + *NumExpansions; 11536 } 11537 11538 // Common case: we could determine the number of expansions without 11539 // substituting. 11540 if (Result) 11541 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11542 E->getPackLoc(), 11543 E->getRParenLoc(), *Result, None); 11544 11545 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11546 E->getPackLoc()); 11547 { 11548 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11549 typedef TemplateArgumentLocInventIterator< 11550 Derived, const TemplateArgument*> PackLocIterator; 11551 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11552 PackLocIterator(*this, PackArgs.end()), 11553 TransformedPackArgs, /*Uneval*/true)) 11554 return ExprError(); 11555 } 11556 11557 // Check whether we managed to fully-expand the pack. 11558 // FIXME: Is it possible for us to do so and not hit the early exit path? 11559 SmallVector<TemplateArgument, 8> Args; 11560 bool PartialSubstitution = false; 11561 for (auto &Loc : TransformedPackArgs.arguments()) { 11562 Args.push_back(Loc.getArgument()); 11563 if (Loc.getArgument().isPackExpansion()) 11564 PartialSubstitution = true; 11565 } 11566 11567 if (PartialSubstitution) 11568 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11569 E->getPackLoc(), 11570 E->getRParenLoc(), None, Args); 11571 11572 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11573 E->getPackLoc(), E->getRParenLoc(), 11574 Args.size(), None); 11575 } 11576 11577 template<typename Derived> 11578 ExprResult 11579 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11580 SubstNonTypeTemplateParmPackExpr *E) { 11581 // Default behavior is to do nothing with this transformation. 11582 return E; 11583 } 11584 11585 template<typename Derived> 11586 ExprResult 11587 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11588 SubstNonTypeTemplateParmExpr *E) { 11589 // Default behavior is to do nothing with this transformation. 11590 return E; 11591 } 11592 11593 template<typename Derived> 11594 ExprResult 11595 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11596 // Default behavior is to do nothing with this transformation. 11597 return E; 11598 } 11599 11600 template<typename Derived> 11601 ExprResult 11602 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11603 MaterializeTemporaryExpr *E) { 11604 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11605 } 11606 11607 template<typename Derived> 11608 ExprResult 11609 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11610 Expr *Pattern = E->getPattern(); 11611 11612 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11613 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11614 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11615 11616 // Determine whether the set of unexpanded parameter packs can and should 11617 // be expanded. 11618 bool Expand = true; 11619 bool RetainExpansion = false; 11620 Optional<unsigned> NumExpansions; 11621 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11622 Pattern->getSourceRange(), 11623 Unexpanded, 11624 Expand, RetainExpansion, 11625 NumExpansions)) 11626 return true; 11627 11628 if (!Expand) { 11629 // Do not expand any packs here, just transform and rebuild a fold 11630 // expression. 11631 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11632 11633 ExprResult LHS = 11634 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11635 if (LHS.isInvalid()) 11636 return true; 11637 11638 ExprResult RHS = 11639 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11640 if (RHS.isInvalid()) 11641 return true; 11642 11643 if (!getDerived().AlwaysRebuild() && 11644 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11645 return E; 11646 11647 return getDerived().RebuildCXXFoldExpr( 11648 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11649 RHS.get(), E->getEndLoc()); 11650 } 11651 11652 // The transform has determined that we should perform an elementwise 11653 // expansion of the pattern. Do so. 11654 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11655 if (Result.isInvalid()) 11656 return true; 11657 bool LeftFold = E->isLeftFold(); 11658 11659 // If we're retaining an expansion for a right fold, it is the innermost 11660 // component and takes the init (if any). 11661 if (!LeftFold && RetainExpansion) { 11662 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11663 11664 ExprResult Out = getDerived().TransformExpr(Pattern); 11665 if (Out.isInvalid()) 11666 return true; 11667 11668 Result = getDerived().RebuildCXXFoldExpr( 11669 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11670 Result.get(), E->getEndLoc()); 11671 if (Result.isInvalid()) 11672 return true; 11673 } 11674 11675 for (unsigned I = 0; I != *NumExpansions; ++I) { 11676 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11677 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11678 ExprResult Out = getDerived().TransformExpr(Pattern); 11679 if (Out.isInvalid()) 11680 return true; 11681 11682 if (Out.get()->containsUnexpandedParameterPack()) { 11683 // We still have a pack; retain a pack expansion for this slice. 11684 Result = getDerived().RebuildCXXFoldExpr( 11685 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11686 E->getOperator(), E->getEllipsisLoc(), 11687 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11688 } else if (Result.isUsable()) { 11689 // We've got down to a single element; build a binary operator. 11690 Result = getDerived().RebuildBinaryOperator( 11691 E->getEllipsisLoc(), E->getOperator(), 11692 LeftFold ? Result.get() : Out.get(), 11693 LeftFold ? Out.get() : Result.get()); 11694 } else 11695 Result = Out; 11696 11697 if (Result.isInvalid()) 11698 return true; 11699 } 11700 11701 // If we're retaining an expansion for a left fold, it is the outermost 11702 // component and takes the complete expansion so far as its init (if any). 11703 if (LeftFold && RetainExpansion) { 11704 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11705 11706 ExprResult Out = getDerived().TransformExpr(Pattern); 11707 if (Out.isInvalid()) 11708 return true; 11709 11710 Result = getDerived().RebuildCXXFoldExpr( 11711 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11712 Out.get(), E->getEndLoc()); 11713 if (Result.isInvalid()) 11714 return true; 11715 } 11716 11717 // If we had no init and an empty pack, and we're not retaining an expansion, 11718 // then produce a fallback value or error. 11719 if (Result.isUnset()) 11720 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11721 E->getOperator()); 11722 11723 return Result; 11724 } 11725 11726 template<typename Derived> 11727 ExprResult 11728 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11729 CXXStdInitializerListExpr *E) { 11730 return getDerived().TransformExpr(E->getSubExpr()); 11731 } 11732 11733 template<typename Derived> 11734 ExprResult 11735 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11736 return SemaRef.MaybeBindToTemporary(E); 11737 } 11738 11739 template<typename Derived> 11740 ExprResult 11741 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11742 return E; 11743 } 11744 11745 template<typename Derived> 11746 ExprResult 11747 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11748 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11749 if (SubExpr.isInvalid()) 11750 return ExprError(); 11751 11752 if (!getDerived().AlwaysRebuild() && 11753 SubExpr.get() == E->getSubExpr()) 11754 return E; 11755 11756 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11757 } 11758 11759 template<typename Derived> 11760 ExprResult 11761 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11762 // Transform each of the elements. 11763 SmallVector<Expr *, 8> Elements; 11764 bool ArgChanged = false; 11765 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11766 /*IsCall=*/false, Elements, &ArgChanged)) 11767 return ExprError(); 11768 11769 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11770 return SemaRef.MaybeBindToTemporary(E); 11771 11772 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11773 Elements.data(), 11774 Elements.size()); 11775 } 11776 11777 template<typename Derived> 11778 ExprResult 11779 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11780 ObjCDictionaryLiteral *E) { 11781 // Transform each of the elements. 11782 SmallVector<ObjCDictionaryElement, 8> Elements; 11783 bool ArgChanged = false; 11784 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11785 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11786 11787 if (OrigElement.isPackExpansion()) { 11788 // This key/value element is a pack expansion. 11789 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11790 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11791 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11792 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11793 11794 // Determine whether the set of unexpanded parameter packs can 11795 // and should be expanded. 11796 bool Expand = true; 11797 bool RetainExpansion = false; 11798 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11799 Optional<unsigned> NumExpansions = OrigNumExpansions; 11800 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11801 OrigElement.Value->getEndLoc()); 11802 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11803 PatternRange, Unexpanded, Expand, 11804 RetainExpansion, NumExpansions)) 11805 return ExprError(); 11806 11807 if (!Expand) { 11808 // The transform has determined that we should perform a simple 11809 // transformation on the pack expansion, producing another pack 11810 // expansion. 11811 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11812 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11813 if (Key.isInvalid()) 11814 return ExprError(); 11815 11816 if (Key.get() != OrigElement.Key) 11817 ArgChanged = true; 11818 11819 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11820 if (Value.isInvalid()) 11821 return ExprError(); 11822 11823 if (Value.get() != OrigElement.Value) 11824 ArgChanged = true; 11825 11826 ObjCDictionaryElement Expansion = { 11827 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11828 }; 11829 Elements.push_back(Expansion); 11830 continue; 11831 } 11832 11833 // Record right away that the argument was changed. This needs 11834 // to happen even if the array expands to nothing. 11835 ArgChanged = true; 11836 11837 // The transform has determined that we should perform an elementwise 11838 // expansion of the pattern. Do so. 11839 for (unsigned I = 0; I != *NumExpansions; ++I) { 11840 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11841 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11842 if (Key.isInvalid()) 11843 return ExprError(); 11844 11845 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11846 if (Value.isInvalid()) 11847 return ExprError(); 11848 11849 ObjCDictionaryElement Element = { 11850 Key.get(), Value.get(), SourceLocation(), NumExpansions 11851 }; 11852 11853 // If any unexpanded parameter packs remain, we still have a 11854 // pack expansion. 11855 // FIXME: Can this really happen? 11856 if (Key.get()->containsUnexpandedParameterPack() || 11857 Value.get()->containsUnexpandedParameterPack()) 11858 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11859 11860 Elements.push_back(Element); 11861 } 11862 11863 // FIXME: Retain a pack expansion if RetainExpansion is true. 11864 11865 // We've finished with this pack expansion. 11866 continue; 11867 } 11868 11869 // Transform and check key. 11870 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11871 if (Key.isInvalid()) 11872 return ExprError(); 11873 11874 if (Key.get() != OrigElement.Key) 11875 ArgChanged = true; 11876 11877 // Transform and check value. 11878 ExprResult Value 11879 = getDerived().TransformExpr(OrigElement.Value); 11880 if (Value.isInvalid()) 11881 return ExprError(); 11882 11883 if (Value.get() != OrigElement.Value) 11884 ArgChanged = true; 11885 11886 ObjCDictionaryElement Element = { 11887 Key.get(), Value.get(), SourceLocation(), None 11888 }; 11889 Elements.push_back(Element); 11890 } 11891 11892 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11893 return SemaRef.MaybeBindToTemporary(E); 11894 11895 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11896 Elements); 11897 } 11898 11899 template<typename Derived> 11900 ExprResult 11901 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11902 TypeSourceInfo *EncodedTypeInfo 11903 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11904 if (!EncodedTypeInfo) 11905 return ExprError(); 11906 11907 if (!getDerived().AlwaysRebuild() && 11908 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11909 return E; 11910 11911 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11912 EncodedTypeInfo, 11913 E->getRParenLoc()); 11914 } 11915 11916 template<typename Derived> 11917 ExprResult TreeTransform<Derived>:: 11918 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11919 // This is a kind of implicit conversion, and it needs to get dropped 11920 // and recomputed for the same general reasons that ImplicitCastExprs 11921 // do, as well a more specific one: this expression is only valid when 11922 // it appears *immediately* as an argument expression. 11923 return getDerived().TransformExpr(E->getSubExpr()); 11924 } 11925 11926 template<typename Derived> 11927 ExprResult TreeTransform<Derived>:: 11928 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11929 TypeSourceInfo *TSInfo 11930 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11931 if (!TSInfo) 11932 return ExprError(); 11933 11934 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11935 if (Result.isInvalid()) 11936 return ExprError(); 11937 11938 if (!getDerived().AlwaysRebuild() && 11939 TSInfo == E->getTypeInfoAsWritten() && 11940 Result.get() == E->getSubExpr()) 11941 return E; 11942 11943 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11944 E->getBridgeKeywordLoc(), TSInfo, 11945 Result.get()); 11946 } 11947 11948 template <typename Derived> 11949 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11950 ObjCAvailabilityCheckExpr *E) { 11951 return E; 11952 } 11953 11954 template<typename Derived> 11955 ExprResult 11956 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11957 // Transform arguments. 11958 bool ArgChanged = false; 11959 SmallVector<Expr*, 8> Args; 11960 Args.reserve(E->getNumArgs()); 11961 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11962 &ArgChanged)) 11963 return ExprError(); 11964 11965 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11966 // Class message: transform the receiver type. 11967 TypeSourceInfo *ReceiverTypeInfo 11968 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11969 if (!ReceiverTypeInfo) 11970 return ExprError(); 11971 11972 // If nothing changed, just retain the existing message send. 11973 if (!getDerived().AlwaysRebuild() && 11974 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11975 return SemaRef.MaybeBindToTemporary(E); 11976 11977 // Build a new class message send. 11978 SmallVector<SourceLocation, 16> SelLocs; 11979 E->getSelectorLocs(SelLocs); 11980 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11981 E->getSelector(), 11982 SelLocs, 11983 E->getMethodDecl(), 11984 E->getLeftLoc(), 11985 Args, 11986 E->getRightLoc()); 11987 } 11988 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11989 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11990 if (!E->getMethodDecl()) 11991 return ExprError(); 11992 11993 // Build a new class message send to 'super'. 11994 SmallVector<SourceLocation, 16> SelLocs; 11995 E->getSelectorLocs(SelLocs); 11996 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11997 E->getSelector(), 11998 SelLocs, 11999 E->getReceiverType(), 12000 E->getMethodDecl(), 12001 E->getLeftLoc(), 12002 Args, 12003 E->getRightLoc()); 12004 } 12005 12006 // Instance message: transform the receiver 12007 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12008 "Only class and instance messages may be instantiated"); 12009 ExprResult Receiver 12010 = getDerived().TransformExpr(E->getInstanceReceiver()); 12011 if (Receiver.isInvalid()) 12012 return ExprError(); 12013 12014 // If nothing changed, just retain the existing message send. 12015 if (!getDerived().AlwaysRebuild() && 12016 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12017 return SemaRef.MaybeBindToTemporary(E); 12018 12019 // Build a new instance message send. 12020 SmallVector<SourceLocation, 16> SelLocs; 12021 E->getSelectorLocs(SelLocs); 12022 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12023 E->getSelector(), 12024 SelLocs, 12025 E->getMethodDecl(), 12026 E->getLeftLoc(), 12027 Args, 12028 E->getRightLoc()); 12029 } 12030 12031 template<typename Derived> 12032 ExprResult 12033 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12034 return E; 12035 } 12036 12037 template<typename Derived> 12038 ExprResult 12039 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12040 return E; 12041 } 12042 12043 template<typename Derived> 12044 ExprResult 12045 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12046 // Transform the base expression. 12047 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12048 if (Base.isInvalid()) 12049 return ExprError(); 12050 12051 // We don't need to transform the ivar; it will never change. 12052 12053 // If nothing changed, just retain the existing expression. 12054 if (!getDerived().AlwaysRebuild() && 12055 Base.get() == E->getBase()) 12056 return E; 12057 12058 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12059 E->getLocation(), 12060 E->isArrow(), E->isFreeIvar()); 12061 } 12062 12063 template<typename Derived> 12064 ExprResult 12065 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12066 // 'super' and types never change. Property never changes. Just 12067 // retain the existing expression. 12068 if (!E->isObjectReceiver()) 12069 return E; 12070 12071 // Transform the base expression. 12072 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12073 if (Base.isInvalid()) 12074 return ExprError(); 12075 12076 // We don't need to transform the property; it will never change. 12077 12078 // If nothing changed, just retain the existing expression. 12079 if (!getDerived().AlwaysRebuild() && 12080 Base.get() == E->getBase()) 12081 return E; 12082 12083 if (E->isExplicitProperty()) 12084 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12085 E->getExplicitProperty(), 12086 E->getLocation()); 12087 12088 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12089 SemaRef.Context.PseudoObjectTy, 12090 E->getImplicitPropertyGetter(), 12091 E->getImplicitPropertySetter(), 12092 E->getLocation()); 12093 } 12094 12095 template<typename Derived> 12096 ExprResult 12097 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12098 // Transform the base expression. 12099 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12100 if (Base.isInvalid()) 12101 return ExprError(); 12102 12103 // Transform the key expression. 12104 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12105 if (Key.isInvalid()) 12106 return ExprError(); 12107 12108 // If nothing changed, just retain the existing expression. 12109 if (!getDerived().AlwaysRebuild() && 12110 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12111 return E; 12112 12113 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12114 Base.get(), Key.get(), 12115 E->getAtIndexMethodDecl(), 12116 E->setAtIndexMethodDecl()); 12117 } 12118 12119 template<typename Derived> 12120 ExprResult 12121 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12122 // Transform the base expression. 12123 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12124 if (Base.isInvalid()) 12125 return ExprError(); 12126 12127 // If nothing changed, just retain the existing expression. 12128 if (!getDerived().AlwaysRebuild() && 12129 Base.get() == E->getBase()) 12130 return E; 12131 12132 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12133 E->getOpLoc(), 12134 E->isArrow()); 12135 } 12136 12137 template<typename Derived> 12138 ExprResult 12139 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12140 bool ArgumentChanged = false; 12141 SmallVector<Expr*, 8> SubExprs; 12142 SubExprs.reserve(E->getNumSubExprs()); 12143 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12144 SubExprs, &ArgumentChanged)) 12145 return ExprError(); 12146 12147 if (!getDerived().AlwaysRebuild() && 12148 !ArgumentChanged) 12149 return E; 12150 12151 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12152 SubExprs, 12153 E->getRParenLoc()); 12154 } 12155 12156 template<typename Derived> 12157 ExprResult 12158 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12159 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12160 if (SrcExpr.isInvalid()) 12161 return ExprError(); 12162 12163 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12164 if (!Type) 12165 return ExprError(); 12166 12167 if (!getDerived().AlwaysRebuild() && 12168 Type == E->getTypeSourceInfo() && 12169 SrcExpr.get() == E->getSrcExpr()) 12170 return E; 12171 12172 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12173 SrcExpr.get(), Type, 12174 E->getRParenLoc()); 12175 } 12176 12177 template<typename Derived> 12178 ExprResult 12179 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12180 BlockDecl *oldBlock = E->getBlockDecl(); 12181 12182 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12183 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12184 12185 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12186 blockScope->TheDecl->setBlockMissingReturnType( 12187 oldBlock->blockMissingReturnType()); 12188 12189 SmallVector<ParmVarDecl*, 4> params; 12190 SmallVector<QualType, 4> paramTypes; 12191 12192 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12193 12194 // Parameter substitution. 12195 Sema::ExtParameterInfoBuilder extParamInfos; 12196 if (getDerived().TransformFunctionTypeParams( 12197 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12198 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12199 extParamInfos)) { 12200 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12201 return ExprError(); 12202 } 12203 12204 QualType exprResultType = 12205 getDerived().TransformType(exprFunctionType->getReturnType()); 12206 12207 auto epi = exprFunctionType->getExtProtoInfo(); 12208 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12209 12210 QualType functionType = 12211 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12212 blockScope->FunctionType = functionType; 12213 12214 // Set the parameters on the block decl. 12215 if (!params.empty()) 12216 blockScope->TheDecl->setParams(params); 12217 12218 if (!oldBlock->blockMissingReturnType()) { 12219 blockScope->HasImplicitReturnType = false; 12220 blockScope->ReturnType = exprResultType; 12221 } 12222 12223 // Transform the body 12224 StmtResult body = getDerived().TransformStmt(E->getBody()); 12225 if (body.isInvalid()) { 12226 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12227 return ExprError(); 12228 } 12229 12230 #ifndef NDEBUG 12231 // In builds with assertions, make sure that we captured everything we 12232 // captured before. 12233 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12234 for (const auto &I : oldBlock->captures()) { 12235 VarDecl *oldCapture = I.getVariable(); 12236 12237 // Ignore parameter packs. 12238 if (isa<ParmVarDecl>(oldCapture) && 12239 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12240 continue; 12241 12242 VarDecl *newCapture = 12243 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12244 oldCapture)); 12245 assert(blockScope->CaptureMap.count(newCapture)); 12246 } 12247 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12248 } 12249 #endif 12250 12251 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12252 /*Scope=*/nullptr); 12253 } 12254 12255 template<typename Derived> 12256 ExprResult 12257 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12258 llvm_unreachable("Cannot transform asType expressions yet"); 12259 } 12260 12261 template<typename Derived> 12262 ExprResult 12263 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12264 QualType RetTy = getDerived().TransformType(E->getType()); 12265 bool ArgumentChanged = false; 12266 SmallVector<Expr*, 8> SubExprs; 12267 SubExprs.reserve(E->getNumSubExprs()); 12268 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12269 SubExprs, &ArgumentChanged)) 12270 return ExprError(); 12271 12272 if (!getDerived().AlwaysRebuild() && 12273 !ArgumentChanged) 12274 return E; 12275 12276 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12277 RetTy, E->getOp(), E->getRParenLoc()); 12278 } 12279 12280 //===----------------------------------------------------------------------===// 12281 // Type reconstruction 12282 //===----------------------------------------------------------------------===// 12283 12284 template<typename Derived> 12285 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12286 SourceLocation Star) { 12287 return SemaRef.BuildPointerType(PointeeType, Star, 12288 getDerived().getBaseEntity()); 12289 } 12290 12291 template<typename Derived> 12292 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12293 SourceLocation Star) { 12294 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12295 getDerived().getBaseEntity()); 12296 } 12297 12298 template<typename Derived> 12299 QualType 12300 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12301 bool WrittenAsLValue, 12302 SourceLocation Sigil) { 12303 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12304 Sigil, getDerived().getBaseEntity()); 12305 } 12306 12307 template<typename Derived> 12308 QualType 12309 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12310 QualType ClassType, 12311 SourceLocation Sigil) { 12312 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12313 getDerived().getBaseEntity()); 12314 } 12315 12316 template<typename Derived> 12317 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12318 const ObjCTypeParamDecl *Decl, 12319 SourceLocation ProtocolLAngleLoc, 12320 ArrayRef<ObjCProtocolDecl *> Protocols, 12321 ArrayRef<SourceLocation> ProtocolLocs, 12322 SourceLocation ProtocolRAngleLoc) { 12323 return SemaRef.BuildObjCTypeParamType(Decl, 12324 ProtocolLAngleLoc, Protocols, 12325 ProtocolLocs, ProtocolRAngleLoc, 12326 /*FailOnError=*/true); 12327 } 12328 12329 template<typename Derived> 12330 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12331 QualType BaseType, 12332 SourceLocation Loc, 12333 SourceLocation TypeArgsLAngleLoc, 12334 ArrayRef<TypeSourceInfo *> TypeArgs, 12335 SourceLocation TypeArgsRAngleLoc, 12336 SourceLocation ProtocolLAngleLoc, 12337 ArrayRef<ObjCProtocolDecl *> Protocols, 12338 ArrayRef<SourceLocation> ProtocolLocs, 12339 SourceLocation ProtocolRAngleLoc) { 12340 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12341 TypeArgs, TypeArgsRAngleLoc, 12342 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12343 ProtocolRAngleLoc, 12344 /*FailOnError=*/true); 12345 } 12346 12347 template<typename Derived> 12348 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12349 QualType PointeeType, 12350 SourceLocation Star) { 12351 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12352 } 12353 12354 template<typename Derived> 12355 QualType 12356 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12357 ArrayType::ArraySizeModifier SizeMod, 12358 const llvm::APInt *Size, 12359 Expr *SizeExpr, 12360 unsigned IndexTypeQuals, 12361 SourceRange BracketsRange) { 12362 if (SizeExpr || !Size) 12363 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12364 IndexTypeQuals, BracketsRange, 12365 getDerived().getBaseEntity()); 12366 12367 QualType Types[] = { 12368 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12369 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12370 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12371 }; 12372 const unsigned NumTypes = llvm::array_lengthof(Types); 12373 QualType SizeType; 12374 for (unsigned I = 0; I != NumTypes; ++I) 12375 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12376 SizeType = Types[I]; 12377 break; 12378 } 12379 12380 // Note that we can return a VariableArrayType here in the case where 12381 // the element type was a dependent VariableArrayType. 12382 IntegerLiteral *ArraySize 12383 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12384 /*FIXME*/BracketsRange.getBegin()); 12385 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12386 IndexTypeQuals, BracketsRange, 12387 getDerived().getBaseEntity()); 12388 } 12389 12390 template<typename Derived> 12391 QualType 12392 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12393 ArrayType::ArraySizeModifier SizeMod, 12394 const llvm::APInt &Size, 12395 unsigned IndexTypeQuals, 12396 SourceRange BracketsRange) { 12397 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12398 IndexTypeQuals, BracketsRange); 12399 } 12400 12401 template<typename Derived> 12402 QualType 12403 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12404 ArrayType::ArraySizeModifier SizeMod, 12405 unsigned IndexTypeQuals, 12406 SourceRange BracketsRange) { 12407 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12408 IndexTypeQuals, BracketsRange); 12409 } 12410 12411 template<typename Derived> 12412 QualType 12413 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12414 ArrayType::ArraySizeModifier SizeMod, 12415 Expr *SizeExpr, 12416 unsigned IndexTypeQuals, 12417 SourceRange BracketsRange) { 12418 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12419 SizeExpr, 12420 IndexTypeQuals, BracketsRange); 12421 } 12422 12423 template<typename Derived> 12424 QualType 12425 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12426 ArrayType::ArraySizeModifier SizeMod, 12427 Expr *SizeExpr, 12428 unsigned IndexTypeQuals, 12429 SourceRange BracketsRange) { 12430 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12431 SizeExpr, 12432 IndexTypeQuals, BracketsRange); 12433 } 12434 12435 template <typename Derived> 12436 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12437 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12438 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12439 AttributeLoc); 12440 } 12441 12442 template <typename Derived> 12443 QualType 12444 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12445 unsigned NumElements, 12446 VectorType::VectorKind VecKind) { 12447 // FIXME: semantic checking! 12448 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12449 } 12450 12451 template <typename Derived> 12452 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12453 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12454 VectorType::VectorKind VecKind) { 12455 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12456 } 12457 12458 template<typename Derived> 12459 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12460 unsigned NumElements, 12461 SourceLocation AttributeLoc) { 12462 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12463 NumElements, true); 12464 IntegerLiteral *VectorSize 12465 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12466 AttributeLoc); 12467 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12468 } 12469 12470 template<typename Derived> 12471 QualType 12472 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12473 Expr *SizeExpr, 12474 SourceLocation AttributeLoc) { 12475 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12476 } 12477 12478 template<typename Derived> 12479 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12480 QualType T, 12481 MutableArrayRef<QualType> ParamTypes, 12482 const FunctionProtoType::ExtProtoInfo &EPI) { 12483 return SemaRef.BuildFunctionType(T, ParamTypes, 12484 getDerived().getBaseLocation(), 12485 getDerived().getBaseEntity(), 12486 EPI); 12487 } 12488 12489 template<typename Derived> 12490 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12491 return SemaRef.Context.getFunctionNoProtoType(T); 12492 } 12493 12494 template<typename Derived> 12495 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12496 Decl *D) { 12497 assert(D && "no decl found"); 12498 if (D->isInvalidDecl()) return QualType(); 12499 12500 // FIXME: Doesn't account for ObjCInterfaceDecl! 12501 TypeDecl *Ty; 12502 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12503 // A valid resolved using typename pack expansion decl can have multiple 12504 // UsingDecls, but they must each have exactly one type, and it must be 12505 // the same type in every case. But we must have at least one expansion! 12506 if (UPD->expansions().empty()) { 12507 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12508 << UPD->isCXXClassMember() << UPD; 12509 return QualType(); 12510 } 12511 12512 // We might still have some unresolved types. Try to pick a resolved type 12513 // if we can. The final instantiation will check that the remaining 12514 // unresolved types instantiate to the type we pick. 12515 QualType FallbackT; 12516 QualType T; 12517 for (auto *E : UPD->expansions()) { 12518 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12519 if (ThisT.isNull()) 12520 continue; 12521 else if (ThisT->getAs<UnresolvedUsingType>()) 12522 FallbackT = ThisT; 12523 else if (T.isNull()) 12524 T = ThisT; 12525 else 12526 assert(getSema().Context.hasSameType(ThisT, T) && 12527 "mismatched resolved types in using pack expansion"); 12528 } 12529 return T.isNull() ? FallbackT : T; 12530 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12531 assert(Using->hasTypename() && 12532 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12533 12534 // A valid resolved using typename decl points to exactly one type decl. 12535 assert(++Using->shadow_begin() == Using->shadow_end()); 12536 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12537 } else { 12538 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12539 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12540 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12541 } 12542 12543 return SemaRef.Context.getTypeDeclType(Ty); 12544 } 12545 12546 template<typename Derived> 12547 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12548 SourceLocation Loc) { 12549 return SemaRef.BuildTypeofExprType(E, Loc); 12550 } 12551 12552 template<typename Derived> 12553 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12554 return SemaRef.Context.getTypeOfType(Underlying); 12555 } 12556 12557 template<typename Derived> 12558 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12559 SourceLocation Loc) { 12560 return SemaRef.BuildDecltypeType(E, Loc); 12561 } 12562 12563 template<typename Derived> 12564 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12565 UnaryTransformType::UTTKind UKind, 12566 SourceLocation Loc) { 12567 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12568 } 12569 12570 template<typename Derived> 12571 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12572 TemplateName Template, 12573 SourceLocation TemplateNameLoc, 12574 TemplateArgumentListInfo &TemplateArgs) { 12575 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12576 } 12577 12578 template<typename Derived> 12579 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12580 SourceLocation KWLoc) { 12581 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12582 } 12583 12584 template<typename Derived> 12585 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12586 SourceLocation KWLoc, 12587 bool isReadPipe) { 12588 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12589 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12590 } 12591 12592 template<typename Derived> 12593 TemplateName 12594 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12595 bool TemplateKW, 12596 TemplateDecl *Template) { 12597 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12598 Template); 12599 } 12600 12601 template<typename Derived> 12602 TemplateName 12603 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12604 SourceLocation TemplateKWLoc, 12605 const IdentifierInfo &Name, 12606 SourceLocation NameLoc, 12607 QualType ObjectType, 12608 NamedDecl *FirstQualifierInScope, 12609 bool AllowInjectedClassName) { 12610 UnqualifiedId TemplateName; 12611 TemplateName.setIdentifier(&Name, NameLoc); 12612 Sema::TemplateTy Template; 12613 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12614 SS, TemplateKWLoc, TemplateName, 12615 ParsedType::make(ObjectType), 12616 /*EnteringContext=*/false, 12617 Template, AllowInjectedClassName); 12618 return Template.get(); 12619 } 12620 12621 template<typename Derived> 12622 TemplateName 12623 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12624 SourceLocation TemplateKWLoc, 12625 OverloadedOperatorKind Operator, 12626 SourceLocation NameLoc, 12627 QualType ObjectType, 12628 bool AllowInjectedClassName) { 12629 UnqualifiedId Name; 12630 // FIXME: Bogus location information. 12631 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12632 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12633 Sema::TemplateTy Template; 12634 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12635 SS, TemplateKWLoc, Name, 12636 ParsedType::make(ObjectType), 12637 /*EnteringContext=*/false, 12638 Template, AllowInjectedClassName); 12639 return Template.get(); 12640 } 12641 12642 template<typename Derived> 12643 ExprResult 12644 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12645 SourceLocation OpLoc, 12646 Expr *OrigCallee, 12647 Expr *First, 12648 Expr *Second) { 12649 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12650 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12651 12652 if (First->getObjectKind() == OK_ObjCProperty) { 12653 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12654 if (BinaryOperator::isAssignmentOp(Opc)) 12655 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12656 First, Second); 12657 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12658 if (Result.isInvalid()) 12659 return ExprError(); 12660 First = Result.get(); 12661 } 12662 12663 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12664 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12665 if (Result.isInvalid()) 12666 return ExprError(); 12667 Second = Result.get(); 12668 } 12669 12670 // Determine whether this should be a builtin operation. 12671 if (Op == OO_Subscript) { 12672 if (!First->getType()->isOverloadableType() && 12673 !Second->getType()->isOverloadableType()) 12674 return getSema().CreateBuiltinArraySubscriptExpr( 12675 First, Callee->getBeginLoc(), Second, OpLoc); 12676 } else if (Op == OO_Arrow) { 12677 // -> is never a builtin operation. 12678 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12679 } else if (Second == nullptr || isPostIncDec) { 12680 if (!First->getType()->isOverloadableType() || 12681 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12682 // The argument is not of overloadable type, or this is an expression 12683 // of the form &Class::member, so try to create a built-in unary 12684 // operation. 12685 UnaryOperatorKind Opc 12686 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12687 12688 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12689 } 12690 } else { 12691 if (!First->getType()->isOverloadableType() && 12692 !Second->getType()->isOverloadableType()) { 12693 // Neither of the arguments is an overloadable type, so try to 12694 // create a built-in binary operation. 12695 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12696 ExprResult Result 12697 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12698 if (Result.isInvalid()) 12699 return ExprError(); 12700 12701 return Result; 12702 } 12703 } 12704 12705 // Compute the transformed set of functions (and function templates) to be 12706 // used during overload resolution. 12707 UnresolvedSet<16> Functions; 12708 bool RequiresADL; 12709 12710 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12711 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12712 // If the overload could not be resolved in the template definition 12713 // (because we had a dependent argument), ADL is performed as part of 12714 // template instantiation. 12715 RequiresADL = ULE->requiresADL(); 12716 } else { 12717 // If we've resolved this to a particular non-member function, just call 12718 // that function. If we resolved it to a member function, 12719 // CreateOverloaded* will find that function for us. 12720 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12721 if (!isa<CXXMethodDecl>(ND)) 12722 Functions.addDecl(ND); 12723 RequiresADL = false; 12724 } 12725 12726 // Add any functions found via argument-dependent lookup. 12727 Expr *Args[2] = { First, Second }; 12728 unsigned NumArgs = 1 + (Second != nullptr); 12729 12730 // Create the overloaded operator invocation for unary operators. 12731 if (NumArgs == 1 || isPostIncDec) { 12732 UnaryOperatorKind Opc 12733 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12734 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12735 RequiresADL); 12736 } 12737 12738 if (Op == OO_Subscript) { 12739 SourceLocation LBrace; 12740 SourceLocation RBrace; 12741 12742 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12743 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12744 LBrace = SourceLocation::getFromRawEncoding( 12745 NameLoc.CXXOperatorName.BeginOpNameLoc); 12746 RBrace = SourceLocation::getFromRawEncoding( 12747 NameLoc.CXXOperatorName.EndOpNameLoc); 12748 } else { 12749 LBrace = Callee->getBeginLoc(); 12750 RBrace = OpLoc; 12751 } 12752 12753 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12754 First, Second); 12755 } 12756 12757 // Create the overloaded operator invocation for binary operators. 12758 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12759 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12760 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12761 if (Result.isInvalid()) 12762 return ExprError(); 12763 12764 return Result; 12765 } 12766 12767 template<typename Derived> 12768 ExprResult 12769 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12770 SourceLocation OperatorLoc, 12771 bool isArrow, 12772 CXXScopeSpec &SS, 12773 TypeSourceInfo *ScopeType, 12774 SourceLocation CCLoc, 12775 SourceLocation TildeLoc, 12776 PseudoDestructorTypeStorage Destroyed) { 12777 QualType BaseType = Base->getType(); 12778 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12779 (!isArrow && !BaseType->getAs<RecordType>()) || 12780 (isArrow && BaseType->getAs<PointerType>() && 12781 !BaseType->getAs<PointerType>()->getPointeeType() 12782 ->template getAs<RecordType>())){ 12783 // This pseudo-destructor expression is still a pseudo-destructor. 12784 return SemaRef.BuildPseudoDestructorExpr( 12785 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12786 CCLoc, TildeLoc, Destroyed); 12787 } 12788 12789 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12790 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12791 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12792 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12793 NameInfo.setNamedTypeInfo(DestroyedType); 12794 12795 // The scope type is now known to be a valid nested name specifier 12796 // component. Tack it on to the end of the nested name specifier. 12797 if (ScopeType) { 12798 if (!ScopeType->getType()->getAs<TagType>()) { 12799 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12800 diag::err_expected_class_or_namespace) 12801 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12802 return ExprError(); 12803 } 12804 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12805 CCLoc); 12806 } 12807 12808 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12809 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12810 OperatorLoc, isArrow, 12811 SS, TemplateKWLoc, 12812 /*FIXME: FirstQualifier*/ nullptr, 12813 NameInfo, 12814 /*TemplateArgs*/ nullptr, 12815 /*S*/nullptr); 12816 } 12817 12818 template<typename Derived> 12819 StmtResult 12820 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12821 SourceLocation Loc = S->getBeginLoc(); 12822 CapturedDecl *CD = S->getCapturedDecl(); 12823 unsigned NumParams = CD->getNumParams(); 12824 unsigned ContextParamPos = CD->getContextParamPosition(); 12825 SmallVector<Sema::CapturedParamNameType, 4> Params; 12826 for (unsigned I = 0; I < NumParams; ++I) { 12827 if (I != ContextParamPos) { 12828 Params.push_back( 12829 std::make_pair( 12830 CD->getParam(I)->getName(), 12831 getDerived().TransformType(CD->getParam(I)->getType()))); 12832 } else { 12833 Params.push_back(std::make_pair(StringRef(), QualType())); 12834 } 12835 } 12836 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12837 S->getCapturedRegionKind(), Params); 12838 StmtResult Body; 12839 { 12840 Sema::CompoundScopeRAII CompoundScope(getSema()); 12841 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12842 } 12843 12844 if (Body.isInvalid()) { 12845 getSema().ActOnCapturedRegionError(); 12846 return StmtError(); 12847 } 12848 12849 return getSema().ActOnCapturedRegionEnd(Body.get()); 12850 } 12851 12852 } // end namespace clang 12853 12854 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12855