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 "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprCXX.h" 23 #include "clang/AST/ExprObjC.h" 24 #include "clang/AST/Stmt.h" 25 #include "clang/AST/StmtCXX.h" 26 #include "clang/AST/StmtObjC.h" 27 #include "clang/AST/StmtOpenMP.h" 28 #include "clang/Sema/Designator.h" 29 #include "clang/Sema/Lookup.h" 30 #include "clang/Sema/Ownership.h" 31 #include "clang/Sema/ParsedTemplate.h" 32 #include "clang/Sema/ScopeInfo.h" 33 #include "clang/Sema/SemaDiagnostic.h" 34 #include "clang/Sema/SemaInternal.h" 35 #include "llvm/ADT/ArrayRef.h" 36 #include "llvm/Support/ErrorHandling.h" 37 #include <algorithm> 38 39 namespace clang { 40 using namespace sema; 41 42 /// \brief A semantic tree transformation that allows one to transform one 43 /// abstract syntax tree into another. 44 /// 45 /// A new tree transformation is defined by creating a new subclass \c X of 46 /// \c TreeTransform<X> and then overriding certain operations to provide 47 /// behavior specific to that transformation. For example, template 48 /// instantiation is implemented as a tree transformation where the 49 /// transformation of TemplateTypeParmType nodes involves substituting the 50 /// template arguments for their corresponding template parameters; a similar 51 /// transformation is performed for non-type template parameters and 52 /// template template parameters. 53 /// 54 /// This tree-transformation template uses static polymorphism to allow 55 /// subclasses to customize any of its operations. Thus, a subclass can 56 /// override any of the transformation or rebuild operators by providing an 57 /// operation with the same signature as the default implementation. The 58 /// overridding function should not be virtual. 59 /// 60 /// Semantic tree transformations are split into two stages, either of which 61 /// can be replaced by a subclass. The "transform" step transforms an AST node 62 /// or the parts of an AST node using the various transformation functions, 63 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 64 /// node of the appropriate kind from the pieces. The default transformation 65 /// routines recursively transform the operands to composite AST nodes (e.g., 66 /// the pointee type of a PointerType node) and, if any of those operand nodes 67 /// were changed by the transformation, invokes the rebuild operation to create 68 /// a new AST node. 69 /// 70 /// Subclasses can customize the transformation at various levels. The 71 /// most coarse-grained transformations involve replacing TransformType(), 72 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 73 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 74 /// new implementations. 75 /// 76 /// For more fine-grained transformations, subclasses can replace any of the 77 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 78 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 79 /// replacing TransformTemplateTypeParmType() allows template instantiation 80 /// to substitute template arguments for their corresponding template 81 /// parameters. Additionally, subclasses can override the \c RebuildXXX 82 /// functions to control how AST nodes are rebuilt when their operands change. 83 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 84 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 85 /// be able to use more efficient rebuild steps. 86 /// 87 /// There are a handful of other functions that can be overridden, allowing one 88 /// to avoid traversing nodes that don't need any transformation 89 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 90 /// operands have not changed (\c AlwaysRebuild()), and customize the 91 /// default locations and entity names used for type-checking 92 /// (\c getBaseLocation(), \c getBaseEntity()). 93 template<typename Derived> 94 class TreeTransform { 95 /// \brief Private RAII object that helps us forget and then re-remember 96 /// the template argument corresponding to a partially-substituted parameter 97 /// pack. 98 class ForgetPartiallySubstitutedPackRAII { 99 Derived &Self; 100 TemplateArgument Old; 101 102 public: 103 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 104 Old = Self.ForgetPartiallySubstitutedPack(); 105 } 106 107 ~ForgetPartiallySubstitutedPackRAII() { 108 Self.RememberPartiallySubstitutedPack(Old); 109 } 110 }; 111 112 protected: 113 Sema &SemaRef; 114 115 /// \brief The set of local declarations that have been transformed, for 116 /// cases where we are forced to build new declarations within the transformer 117 /// rather than in the subclass (e.g., lambda closure types). 118 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 119 120 public: 121 /// \brief Initializes a new tree transformer. 122 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 123 124 /// \brief Retrieves a reference to the derived class. 125 Derived &getDerived() { return static_cast<Derived&>(*this); } 126 127 /// \brief Retrieves a reference to the derived class. 128 const Derived &getDerived() const { 129 return static_cast<const Derived&>(*this); 130 } 131 132 static inline ExprResult Owned(Expr *E) { return E; } 133 static inline StmtResult Owned(Stmt *S) { return S; } 134 135 /// \brief Retrieves a reference to the semantic analysis object used for 136 /// this tree transform. 137 Sema &getSema() const { return SemaRef; } 138 139 /// \brief Whether the transformation should always rebuild AST nodes, even 140 /// if none of the children have changed. 141 /// 142 /// Subclasses may override this function to specify when the transformation 143 /// should rebuild all AST nodes. 144 /// 145 /// We must always rebuild all AST nodes when performing variadic template 146 /// pack expansion, in order to avoid violating the AST invariant that each 147 /// statement node appears at most once in its containing declaration. 148 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 149 150 /// \brief Returns the location of the entity being transformed, if that 151 /// information was not available elsewhere in the AST. 152 /// 153 /// By default, returns no source-location information. Subclasses can 154 /// provide an alternative implementation that provides better location 155 /// information. 156 SourceLocation getBaseLocation() { return SourceLocation(); } 157 158 /// \brief Returns the name of the entity being transformed, if that 159 /// information was not available elsewhere in the AST. 160 /// 161 /// By default, returns an empty name. Subclasses can provide an alternative 162 /// implementation with a more precise name. 163 DeclarationName getBaseEntity() { return DeclarationName(); } 164 165 /// \brief Sets the "base" location and entity when that 166 /// information is known based on another transformation. 167 /// 168 /// By default, the source location and entity are ignored. Subclasses can 169 /// override this function to provide a customized implementation. 170 void setBase(SourceLocation Loc, DeclarationName Entity) { } 171 172 /// \brief RAII object that temporarily sets the base location and entity 173 /// used for reporting diagnostics in types. 174 class TemporaryBase { 175 TreeTransform &Self; 176 SourceLocation OldLocation; 177 DeclarationName OldEntity; 178 179 public: 180 TemporaryBase(TreeTransform &Self, SourceLocation Location, 181 DeclarationName Entity) : Self(Self) { 182 OldLocation = Self.getDerived().getBaseLocation(); 183 OldEntity = Self.getDerived().getBaseEntity(); 184 185 if (Location.isValid()) 186 Self.getDerived().setBase(Location, Entity); 187 } 188 189 ~TemporaryBase() { 190 Self.getDerived().setBase(OldLocation, OldEntity); 191 } 192 }; 193 194 /// \brief Determine whether the given type \p T has already been 195 /// transformed. 196 /// 197 /// Subclasses can provide an alternative implementation of this routine 198 /// to short-circuit evaluation when it is known that a given type will 199 /// not change. For example, template instantiation need not traverse 200 /// non-dependent types. 201 bool AlreadyTransformed(QualType T) { 202 return T.isNull(); 203 } 204 205 /// \brief Determine whether the given call argument should be dropped, e.g., 206 /// because it is a default argument. 207 /// 208 /// Subclasses can provide an alternative implementation of this routine to 209 /// determine which kinds of call arguments get dropped. By default, 210 /// CXXDefaultArgument nodes are dropped (prior to transformation). 211 bool DropCallArgument(Expr *E) { 212 return E->isDefaultArgument(); 213 } 214 215 /// \brief Determine whether we should expand a pack expansion with the 216 /// given set of parameter packs into separate arguments by repeatedly 217 /// transforming the pattern. 218 /// 219 /// By default, the transformer never tries to expand pack expansions. 220 /// Subclasses can override this routine to provide different behavior. 221 /// 222 /// \param EllipsisLoc The location of the ellipsis that identifies the 223 /// pack expansion. 224 /// 225 /// \param PatternRange The source range that covers the entire pattern of 226 /// the pack expansion. 227 /// 228 /// \param Unexpanded The set of unexpanded parameter packs within the 229 /// pattern. 230 /// 231 /// \param ShouldExpand Will be set to \c true if the transformer should 232 /// expand the corresponding pack expansions into separate arguments. When 233 /// set, \c NumExpansions must also be set. 234 /// 235 /// \param RetainExpansion Whether the caller should add an unexpanded 236 /// pack expansion after all of the expanded arguments. This is used 237 /// when extending explicitly-specified template argument packs per 238 /// C++0x [temp.arg.explicit]p9. 239 /// 240 /// \param NumExpansions The number of separate arguments that will be in 241 /// the expanded form of the corresponding pack expansion. This is both an 242 /// input and an output parameter, which can be set by the caller if the 243 /// number of expansions is known a priori (e.g., due to a prior substitution) 244 /// and will be set by the callee when the number of expansions is known. 245 /// The callee must set this value when \c ShouldExpand is \c true; it may 246 /// set this value in other cases. 247 /// 248 /// \returns true if an error occurred (e.g., because the parameter packs 249 /// are to be instantiated with arguments of different lengths), false 250 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 251 /// must be set. 252 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 253 SourceRange PatternRange, 254 ArrayRef<UnexpandedParameterPack> Unexpanded, 255 bool &ShouldExpand, 256 bool &RetainExpansion, 257 Optional<unsigned> &NumExpansions) { 258 ShouldExpand = false; 259 return false; 260 } 261 262 /// \brief "Forget" about the partially-substituted pack template argument, 263 /// when performing an instantiation that must preserve the parameter pack 264 /// use. 265 /// 266 /// This routine is meant to be overridden by the template instantiator. 267 TemplateArgument ForgetPartiallySubstitutedPack() { 268 return TemplateArgument(); 269 } 270 271 /// \brief "Remember" the partially-substituted pack template argument 272 /// after performing an instantiation that must preserve the parameter pack 273 /// use. 274 /// 275 /// This routine is meant to be overridden by the template instantiator. 276 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 277 278 /// \brief Note to the derived class when a function parameter pack is 279 /// being expanded. 280 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 281 282 /// \brief Transforms the given type into another type. 283 /// 284 /// By default, this routine transforms a type by creating a 285 /// TypeSourceInfo for it and delegating to the appropriate 286 /// function. This is expensive, but we don't mind, because 287 /// this method is deprecated anyway; all users should be 288 /// switched to storing TypeSourceInfos. 289 /// 290 /// \returns the transformed type. 291 QualType TransformType(QualType T); 292 293 /// \brief Transforms the given type-with-location into a new 294 /// type-with-location. 295 /// 296 /// By default, this routine transforms a type by delegating to the 297 /// appropriate TransformXXXType to build a new type. Subclasses 298 /// may override this function (to take over all type 299 /// transformations) or some set of the TransformXXXType functions 300 /// to alter the transformation. 301 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 302 303 /// \brief Transform the given type-with-location into a new 304 /// type, collecting location information in the given builder 305 /// as necessary. 306 /// 307 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 308 309 /// \brief Transform the given statement. 310 /// 311 /// By default, this routine transforms a statement by delegating to the 312 /// appropriate TransformXXXStmt function to transform a specific kind of 313 /// statement or the TransformExpr() function to transform an expression. 314 /// Subclasses may override this function to transform statements using some 315 /// other mechanism. 316 /// 317 /// \returns the transformed statement. 318 StmtResult TransformStmt(Stmt *S); 319 320 /// \brief Transform the given statement. 321 /// 322 /// By default, this routine transforms a statement by delegating to the 323 /// appropriate TransformOMPXXXClause function to transform a specific kind 324 /// of clause. Subclasses may override this function to transform statements 325 /// using some other mechanism. 326 /// 327 /// \returns the transformed OpenMP clause. 328 OMPClause *TransformOMPClause(OMPClause *S); 329 330 /// \brief Transform the given attribute. 331 /// 332 /// By default, this routine transforms a statement by delegating to the 333 /// appropriate TransformXXXAttr function to transform a specific kind 334 /// of attribute. Subclasses may override this function to transform 335 /// attributed statements using some other mechanism. 336 /// 337 /// \returns the transformed attribute 338 const Attr *TransformAttr(const Attr *S); 339 340 /// \brief Transform the specified attribute. 341 /// 342 /// Subclasses should override the transformation of attributes with a pragma 343 /// spelling to transform expressions stored within the attribute. 344 /// 345 /// \returns the transformed attribute. 346 #define ATTR(X) 347 #define PRAGMA_SPELLING_ATTR(X) \ 348 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 349 #include "clang/Basic/AttrList.inc" 350 351 /// \brief Transform the given expression. 352 /// 353 /// By default, this routine transforms an expression by delegating to the 354 /// appropriate TransformXXXExpr function to build a new expression. 355 /// Subclasses may override this function to transform expressions using some 356 /// other mechanism. 357 /// 358 /// \returns the transformed expression. 359 ExprResult TransformExpr(Expr *E); 360 361 /// \brief Transform the given initializer. 362 /// 363 /// By default, this routine transforms an initializer by stripping off the 364 /// semantic nodes added by initialization, then passing the result to 365 /// TransformExpr or TransformExprs. 366 /// 367 /// \returns the transformed initializer. 368 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 369 370 /// \brief Transform the given list of expressions. 371 /// 372 /// This routine transforms a list of expressions by invoking 373 /// \c TransformExpr() for each subexpression. However, it also provides 374 /// support for variadic templates by expanding any pack expansions (if the 375 /// derived class permits such expansion) along the way. When pack expansions 376 /// are present, the number of outputs may not equal the number of inputs. 377 /// 378 /// \param Inputs The set of expressions to be transformed. 379 /// 380 /// \param NumInputs The number of expressions in \c Inputs. 381 /// 382 /// \param IsCall If \c true, then this transform is being performed on 383 /// function-call arguments, and any arguments that should be dropped, will 384 /// be. 385 /// 386 /// \param Outputs The transformed input expressions will be added to this 387 /// vector. 388 /// 389 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 390 /// due to transformation. 391 /// 392 /// \returns true if an error occurred, false otherwise. 393 bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall, 394 SmallVectorImpl<Expr *> &Outputs, 395 bool *ArgChanged = nullptr); 396 397 /// \brief Transform the given declaration, which is referenced from a type 398 /// or expression. 399 /// 400 /// By default, acts as the identity function on declarations, unless the 401 /// transformer has had to transform the declaration itself. Subclasses 402 /// may override this function to provide alternate behavior. 403 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 404 llvm::DenseMap<Decl *, Decl *>::iterator Known 405 = TransformedLocalDecls.find(D); 406 if (Known != TransformedLocalDecls.end()) 407 return Known->second; 408 409 return D; 410 } 411 412 /// \brief Transform the attributes associated with the given declaration and 413 /// place them on the new declaration. 414 /// 415 /// By default, this operation does nothing. Subclasses may override this 416 /// behavior to transform attributes. 417 void transformAttrs(Decl *Old, Decl *New) { } 418 419 /// \brief Note that a local declaration has been transformed by this 420 /// transformer. 421 /// 422 /// Local declarations are typically transformed via a call to 423 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 424 /// the transformer itself has to transform the declarations. This routine 425 /// can be overridden by a subclass that keeps track of such mappings. 426 void transformedLocalDecl(Decl *Old, Decl *New) { 427 TransformedLocalDecls[Old] = New; 428 } 429 430 /// \brief Transform the definition of the given declaration. 431 /// 432 /// By default, invokes TransformDecl() to transform the declaration. 433 /// Subclasses may override this function to provide alternate behavior. 434 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 435 return getDerived().TransformDecl(Loc, D); 436 } 437 438 /// \brief Transform the given declaration, which was the first part of a 439 /// nested-name-specifier in a member access expression. 440 /// 441 /// This specific declaration transformation only applies to the first 442 /// identifier in a nested-name-specifier of a member access expression, e.g., 443 /// the \c T in \c x->T::member 444 /// 445 /// By default, invokes TransformDecl() to transform the declaration. 446 /// Subclasses may override this function to provide alternate behavior. 447 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 448 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 449 } 450 451 /// \brief Transform the given nested-name-specifier with source-location 452 /// information. 453 /// 454 /// By default, transforms all of the types and declarations within the 455 /// nested-name-specifier. Subclasses may override this function to provide 456 /// alternate behavior. 457 NestedNameSpecifierLoc 458 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 459 QualType ObjectType = QualType(), 460 NamedDecl *FirstQualifierInScope = nullptr); 461 462 /// \brief Transform the given declaration name. 463 /// 464 /// By default, transforms the types of conversion function, constructor, 465 /// and destructor names and then (if needed) rebuilds the declaration name. 466 /// Identifiers and selectors are returned unmodified. Sublcasses may 467 /// override this function to provide alternate behavior. 468 DeclarationNameInfo 469 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 470 471 /// \brief Transform the given template name. 472 /// 473 /// \param SS The nested-name-specifier that qualifies the template 474 /// name. This nested-name-specifier must already have been transformed. 475 /// 476 /// \param Name The template name to transform. 477 /// 478 /// \param NameLoc The source location of the template name. 479 /// 480 /// \param ObjectType If we're translating a template name within a member 481 /// access expression, this is the type of the object whose member template 482 /// is being referenced. 483 /// 484 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 485 /// also refers to a name within the current (lexical) scope, this is the 486 /// declaration it refers to. 487 /// 488 /// By default, transforms the template name by transforming the declarations 489 /// and nested-name-specifiers that occur within the template name. 490 /// Subclasses may override this function to provide alternate behavior. 491 TemplateName 492 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 493 SourceLocation NameLoc, 494 QualType ObjectType = QualType(), 495 NamedDecl *FirstQualifierInScope = nullptr); 496 497 /// \brief Transform the given template argument. 498 /// 499 /// By default, this operation transforms the type, expression, or 500 /// declaration stored within the template argument and constructs a 501 /// new template argument from the transformed result. Subclasses may 502 /// override this function to provide alternate behavior. 503 /// 504 /// Returns true if there was an error. 505 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 506 TemplateArgumentLoc &Output); 507 508 /// \brief Transform the given set of template arguments. 509 /// 510 /// By default, this operation transforms all of the template arguments 511 /// in the input set using \c TransformTemplateArgument(), and appends 512 /// the transformed arguments to the output list. 513 /// 514 /// Note that this overload of \c TransformTemplateArguments() is merely 515 /// a convenience function. Subclasses that wish to override this behavior 516 /// should override the iterator-based member template version. 517 /// 518 /// \param Inputs The set of template arguments to be transformed. 519 /// 520 /// \param NumInputs The number of template arguments in \p Inputs. 521 /// 522 /// \param Outputs The set of transformed template arguments output by this 523 /// routine. 524 /// 525 /// Returns true if an error occurred. 526 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 527 unsigned NumInputs, 528 TemplateArgumentListInfo &Outputs) { 529 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs); 530 } 531 532 /// \brief Transform the given set of template arguments. 533 /// 534 /// By default, this operation transforms all of the template arguments 535 /// in the input set using \c TransformTemplateArgument(), and appends 536 /// the transformed arguments to the output list. 537 /// 538 /// \param First An iterator to the first template argument. 539 /// 540 /// \param Last An iterator one step past the last template argument. 541 /// 542 /// \param Outputs The set of transformed template arguments output by this 543 /// routine. 544 /// 545 /// Returns true if an error occurred. 546 template<typename InputIterator> 547 bool TransformTemplateArguments(InputIterator First, 548 InputIterator Last, 549 TemplateArgumentListInfo &Outputs); 550 551 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 552 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 553 TemplateArgumentLoc &ArgLoc); 554 555 /// \brief Fakes up a TypeSourceInfo for a type. 556 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 557 return SemaRef.Context.getTrivialTypeSourceInfo(T, 558 getDerived().getBaseLocation()); 559 } 560 561 #define ABSTRACT_TYPELOC(CLASS, PARENT) 562 #define TYPELOC(CLASS, PARENT) \ 563 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 564 #include "clang/AST/TypeLocNodes.def" 565 566 template<typename Fn> 567 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 568 FunctionProtoTypeLoc TL, 569 CXXRecordDecl *ThisContext, 570 unsigned ThisTypeQuals, 571 Fn TransformExceptionSpec); 572 573 bool TransformExceptionSpec(SourceLocation Loc, 574 FunctionProtoType::ExceptionSpecInfo &ESI, 575 SmallVectorImpl<QualType> &Exceptions, 576 bool &Changed); 577 578 StmtResult TransformSEHHandler(Stmt *Handler); 579 580 QualType 581 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 582 TemplateSpecializationTypeLoc TL, 583 TemplateName Template); 584 585 QualType 586 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 587 DependentTemplateSpecializationTypeLoc TL, 588 TemplateName Template, 589 CXXScopeSpec &SS); 590 591 QualType TransformDependentTemplateSpecializationType( 592 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 593 NestedNameSpecifierLoc QualifierLoc); 594 595 /// \brief Transforms the parameters of a function type into the 596 /// given vectors. 597 /// 598 /// The result vectors should be kept in sync; null entries in the 599 /// variables vector are acceptable. 600 /// 601 /// Return true on error. 602 bool TransformFunctionTypeParams(SourceLocation Loc, 603 ParmVarDecl **Params, unsigned NumParams, 604 const QualType *ParamTypes, 605 SmallVectorImpl<QualType> &PTypes, 606 SmallVectorImpl<ParmVarDecl*> *PVars); 607 608 /// \brief Transforms a single function-type parameter. Return null 609 /// on error. 610 /// 611 /// \param indexAdjustment - A number to add to the parameter's 612 /// scope index; can be negative 613 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 614 int indexAdjustment, 615 Optional<unsigned> NumExpansions, 616 bool ExpectParameterPack); 617 618 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 619 620 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 621 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 622 623 TemplateParameterList *TransformTemplateParameterList( 624 TemplateParameterList *TPL) { 625 return TPL; 626 } 627 628 ExprResult TransformAddressOfOperand(Expr *E); 629 630 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 631 bool IsAddressOfOperand, 632 TypeSourceInfo **RecoveryTSI); 633 634 ExprResult TransformParenDependentScopeDeclRefExpr( 635 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 636 TypeSourceInfo **RecoveryTSI); 637 638 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 639 640 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 641 // amount of stack usage with clang. 642 #define STMT(Node, Parent) \ 643 LLVM_ATTRIBUTE_NOINLINE \ 644 StmtResult Transform##Node(Node *S); 645 #define EXPR(Node, Parent) \ 646 LLVM_ATTRIBUTE_NOINLINE \ 647 ExprResult Transform##Node(Node *E); 648 #define ABSTRACT_STMT(Stmt) 649 #include "clang/AST/StmtNodes.inc" 650 651 #define OPENMP_CLAUSE(Name, Class) \ 652 LLVM_ATTRIBUTE_NOINLINE \ 653 OMPClause *Transform ## Class(Class *S); 654 #include "clang/Basic/OpenMPKinds.def" 655 656 /// \brief Build a new pointer type given its pointee type. 657 /// 658 /// By default, performs semantic analysis when building the pointer type. 659 /// Subclasses may override this routine to provide different behavior. 660 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 661 662 /// \brief Build a new block pointer type given its pointee type. 663 /// 664 /// By default, performs semantic analysis when building the block pointer 665 /// type. Subclasses may override this routine to provide different behavior. 666 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 667 668 /// \brief Build a new reference type given the type it references. 669 /// 670 /// By default, performs semantic analysis when building the 671 /// reference type. Subclasses may override this routine to provide 672 /// different behavior. 673 /// 674 /// \param LValue whether the type was written with an lvalue sigil 675 /// or an rvalue sigil. 676 QualType RebuildReferenceType(QualType ReferentType, 677 bool LValue, 678 SourceLocation Sigil); 679 680 /// \brief Build a new member pointer type given the pointee type and the 681 /// class type it refers into. 682 /// 683 /// By default, performs semantic analysis when building the member pointer 684 /// type. Subclasses may override this routine to provide different behavior. 685 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 686 SourceLocation Sigil); 687 688 /// \brief Build a new array type given the element type, size 689 /// modifier, size of the array (if known), size expression, and index type 690 /// qualifiers. 691 /// 692 /// By default, performs semantic analysis when building the array type. 693 /// Subclasses may override this routine to provide different behavior. 694 /// Also by default, all of the other Rebuild*Array 695 QualType RebuildArrayType(QualType ElementType, 696 ArrayType::ArraySizeModifier SizeMod, 697 const llvm::APInt *Size, 698 Expr *SizeExpr, 699 unsigned IndexTypeQuals, 700 SourceRange BracketsRange); 701 702 /// \brief Build a new constant array type given the element type, size 703 /// modifier, (known) size of the array, and index type qualifiers. 704 /// 705 /// By default, performs semantic analysis when building the array type. 706 /// Subclasses may override this routine to provide different behavior. 707 QualType RebuildConstantArrayType(QualType ElementType, 708 ArrayType::ArraySizeModifier SizeMod, 709 const llvm::APInt &Size, 710 unsigned IndexTypeQuals, 711 SourceRange BracketsRange); 712 713 /// \brief Build a new incomplete array type given the element type, size 714 /// modifier, and index type qualifiers. 715 /// 716 /// By default, performs semantic analysis when building the array type. 717 /// Subclasses may override this routine to provide different behavior. 718 QualType RebuildIncompleteArrayType(QualType ElementType, 719 ArrayType::ArraySizeModifier SizeMod, 720 unsigned IndexTypeQuals, 721 SourceRange BracketsRange); 722 723 /// \brief Build a new variable-length array type given the element type, 724 /// size modifier, size expression, and index type qualifiers. 725 /// 726 /// By default, performs semantic analysis when building the array type. 727 /// Subclasses may override this routine to provide different behavior. 728 QualType RebuildVariableArrayType(QualType ElementType, 729 ArrayType::ArraySizeModifier SizeMod, 730 Expr *SizeExpr, 731 unsigned IndexTypeQuals, 732 SourceRange BracketsRange); 733 734 /// \brief Build a new dependent-sized array type given the element type, 735 /// size modifier, size expression, and index type qualifiers. 736 /// 737 /// By default, performs semantic analysis when building the array type. 738 /// Subclasses may override this routine to provide different behavior. 739 QualType RebuildDependentSizedArrayType(QualType ElementType, 740 ArrayType::ArraySizeModifier SizeMod, 741 Expr *SizeExpr, 742 unsigned IndexTypeQuals, 743 SourceRange BracketsRange); 744 745 /// \brief Build a new vector type given the element type and 746 /// number of elements. 747 /// 748 /// By default, performs semantic analysis when building the vector type. 749 /// Subclasses may override this routine to provide different behavior. 750 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 751 VectorType::VectorKind VecKind); 752 753 /// \brief Build a new extended vector type given the element type and 754 /// number of elements. 755 /// 756 /// By default, performs semantic analysis when building the vector type. 757 /// Subclasses may override this routine to provide different behavior. 758 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 759 SourceLocation AttributeLoc); 760 761 /// \brief Build a new potentially dependently-sized extended vector type 762 /// given the element type and number of elements. 763 /// 764 /// By default, performs semantic analysis when building the vector type. 765 /// Subclasses may override this routine to provide different behavior. 766 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 767 Expr *SizeExpr, 768 SourceLocation AttributeLoc); 769 770 /// \brief Build a new function type. 771 /// 772 /// By default, performs semantic analysis when building the function type. 773 /// Subclasses may override this routine to provide different behavior. 774 QualType RebuildFunctionProtoType(QualType T, 775 MutableArrayRef<QualType> ParamTypes, 776 const FunctionProtoType::ExtProtoInfo &EPI); 777 778 /// \brief Build a new unprototyped function type. 779 QualType RebuildFunctionNoProtoType(QualType ResultType); 780 781 /// \brief Rebuild an unresolved typename type, given the decl that 782 /// the UnresolvedUsingTypenameDecl was transformed to. 783 QualType RebuildUnresolvedUsingType(Decl *D); 784 785 /// \brief Build a new typedef type. 786 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 787 return SemaRef.Context.getTypeDeclType(Typedef); 788 } 789 790 /// \brief Build a new class/struct/union type. 791 QualType RebuildRecordType(RecordDecl *Record) { 792 return SemaRef.Context.getTypeDeclType(Record); 793 } 794 795 /// \brief Build a new Enum type. 796 QualType RebuildEnumType(EnumDecl *Enum) { 797 return SemaRef.Context.getTypeDeclType(Enum); 798 } 799 800 /// \brief Build a new typeof(expr) type. 801 /// 802 /// By default, performs semantic analysis when building the typeof type. 803 /// Subclasses may override this routine to provide different behavior. 804 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 805 806 /// \brief Build a new typeof(type) type. 807 /// 808 /// By default, builds a new TypeOfType with the given underlying type. 809 QualType RebuildTypeOfType(QualType Underlying); 810 811 /// \brief Build a new unary transform type. 812 QualType RebuildUnaryTransformType(QualType BaseType, 813 UnaryTransformType::UTTKind UKind, 814 SourceLocation Loc); 815 816 /// \brief Build a new C++11 decltype type. 817 /// 818 /// By default, performs semantic analysis when building the decltype type. 819 /// Subclasses may override this routine to provide different behavior. 820 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 821 822 /// \brief Build a new C++11 auto type. 823 /// 824 /// By default, builds a new AutoType with the given deduced type. 825 QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) { 826 // Note, IsDependent is always false here: we implicitly convert an 'auto' 827 // which has been deduced to a dependent type into an undeduced 'auto', so 828 // that we'll retry deduction after the transformation. 829 return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto, 830 /*IsDependent*/ false); 831 } 832 833 /// \brief Build a new template specialization type. 834 /// 835 /// By default, performs semantic analysis when building the template 836 /// specialization type. Subclasses may override this routine to provide 837 /// different behavior. 838 QualType RebuildTemplateSpecializationType(TemplateName Template, 839 SourceLocation TemplateLoc, 840 TemplateArgumentListInfo &Args); 841 842 /// \brief Build a new parenthesized type. 843 /// 844 /// By default, builds a new ParenType type from the inner type. 845 /// Subclasses may override this routine to provide different behavior. 846 QualType RebuildParenType(QualType InnerType) { 847 return SemaRef.Context.getParenType(InnerType); 848 } 849 850 /// \brief Build a new qualified name type. 851 /// 852 /// By default, builds a new ElaboratedType type from the keyword, 853 /// the nested-name-specifier and the named type. 854 /// Subclasses may override this routine to provide different behavior. 855 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 856 ElaboratedTypeKeyword Keyword, 857 NestedNameSpecifierLoc QualifierLoc, 858 QualType Named) { 859 return SemaRef.Context.getElaboratedType(Keyword, 860 QualifierLoc.getNestedNameSpecifier(), 861 Named); 862 } 863 864 /// \brief Build a new typename type that refers to a template-id. 865 /// 866 /// By default, builds a new DependentNameType type from the 867 /// nested-name-specifier and the given type. Subclasses may override 868 /// this routine to provide different behavior. 869 QualType RebuildDependentTemplateSpecializationType( 870 ElaboratedTypeKeyword Keyword, 871 NestedNameSpecifierLoc QualifierLoc, 872 const IdentifierInfo *Name, 873 SourceLocation NameLoc, 874 TemplateArgumentListInfo &Args) { 875 // Rebuild the template name. 876 // TODO: avoid TemplateName abstraction 877 CXXScopeSpec SS; 878 SS.Adopt(QualifierLoc); 879 TemplateName InstName 880 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 881 nullptr); 882 883 if (InstName.isNull()) 884 return QualType(); 885 886 // If it's still dependent, make a dependent specialization. 887 if (InstName.getAsDependentTemplateName()) 888 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 889 QualifierLoc.getNestedNameSpecifier(), 890 Name, 891 Args); 892 893 // Otherwise, make an elaborated type wrapping a non-dependent 894 // specialization. 895 QualType T = 896 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 897 if (T.isNull()) return QualType(); 898 899 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 900 return T; 901 902 return SemaRef.Context.getElaboratedType(Keyword, 903 QualifierLoc.getNestedNameSpecifier(), 904 T); 905 } 906 907 /// \brief Build a new typename type that refers to an identifier. 908 /// 909 /// By default, performs semantic analysis when building the typename type 910 /// (or elaborated type). Subclasses may override this routine to provide 911 /// different behavior. 912 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 913 SourceLocation KeywordLoc, 914 NestedNameSpecifierLoc QualifierLoc, 915 const IdentifierInfo *Id, 916 SourceLocation IdLoc) { 917 CXXScopeSpec SS; 918 SS.Adopt(QualifierLoc); 919 920 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 921 // If the name is still dependent, just build a new dependent name type. 922 if (!SemaRef.computeDeclContext(SS)) 923 return SemaRef.Context.getDependentNameType(Keyword, 924 QualifierLoc.getNestedNameSpecifier(), 925 Id); 926 } 927 928 if (Keyword == ETK_None || Keyword == ETK_Typename) 929 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 930 *Id, IdLoc); 931 932 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 933 934 // We had a dependent elaborated-type-specifier that has been transformed 935 // into a non-dependent elaborated-type-specifier. Find the tag we're 936 // referring to. 937 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 938 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 939 if (!DC) 940 return QualType(); 941 942 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 943 return QualType(); 944 945 TagDecl *Tag = nullptr; 946 SemaRef.LookupQualifiedName(Result, DC); 947 switch (Result.getResultKind()) { 948 case LookupResult::NotFound: 949 case LookupResult::NotFoundInCurrentInstantiation: 950 break; 951 952 case LookupResult::Found: 953 Tag = Result.getAsSingle<TagDecl>(); 954 break; 955 956 case LookupResult::FoundOverloaded: 957 case LookupResult::FoundUnresolvedValue: 958 llvm_unreachable("Tag lookup cannot find non-tags"); 959 960 case LookupResult::Ambiguous: 961 // Let the LookupResult structure handle ambiguities. 962 return QualType(); 963 } 964 965 if (!Tag) { 966 // Check where the name exists but isn't a tag type and use that to emit 967 // better diagnostics. 968 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 969 SemaRef.LookupQualifiedName(Result, DC); 970 switch (Result.getResultKind()) { 971 case LookupResult::Found: 972 case LookupResult::FoundOverloaded: 973 case LookupResult::FoundUnresolvedValue: { 974 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 975 unsigned Kind = 0; 976 if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 977 else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2; 978 else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3; 979 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 980 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 981 break; 982 } 983 default: 984 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 985 << Kind << Id << DC << QualifierLoc.getSourceRange(); 986 break; 987 } 988 return QualType(); 989 } 990 991 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 992 IdLoc, *Id)) { 993 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 994 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 995 return QualType(); 996 } 997 998 // Build the elaborated-type-specifier type. 999 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1000 return SemaRef.Context.getElaboratedType(Keyword, 1001 QualifierLoc.getNestedNameSpecifier(), 1002 T); 1003 } 1004 1005 /// \brief Build a new pack expansion type. 1006 /// 1007 /// By default, builds a new PackExpansionType type from the given pattern. 1008 /// Subclasses may override this routine to provide different behavior. 1009 QualType RebuildPackExpansionType(QualType Pattern, 1010 SourceRange PatternRange, 1011 SourceLocation EllipsisLoc, 1012 Optional<unsigned> NumExpansions) { 1013 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1014 NumExpansions); 1015 } 1016 1017 /// \brief Build a new atomic type given its value type. 1018 /// 1019 /// By default, performs semantic analysis when building the atomic type. 1020 /// Subclasses may override this routine to provide different behavior. 1021 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1022 1023 /// \brief Build a new template name given a nested name specifier, a flag 1024 /// indicating whether the "template" keyword was provided, and the template 1025 /// that the template name refers to. 1026 /// 1027 /// By default, builds the new template name directly. Subclasses may override 1028 /// this routine to provide different behavior. 1029 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1030 bool TemplateKW, 1031 TemplateDecl *Template); 1032 1033 /// \brief Build a new template name given a nested name specifier and the 1034 /// name that is referred to as a template. 1035 /// 1036 /// By default, performs semantic analysis to determine whether the name can 1037 /// be resolved to a specific template, then builds the appropriate kind of 1038 /// template name. Subclasses may override this routine to provide different 1039 /// behavior. 1040 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1041 const IdentifierInfo &Name, 1042 SourceLocation NameLoc, 1043 QualType ObjectType, 1044 NamedDecl *FirstQualifierInScope); 1045 1046 /// \brief Build a new template name given a nested name specifier and the 1047 /// overloaded operator name that is referred to as a template. 1048 /// 1049 /// By default, performs semantic analysis to determine whether the name can 1050 /// be resolved to a specific template, then builds the appropriate kind of 1051 /// template name. Subclasses may override this routine to provide different 1052 /// behavior. 1053 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1054 OverloadedOperatorKind Operator, 1055 SourceLocation NameLoc, 1056 QualType ObjectType); 1057 1058 /// \brief Build a new template name given a template template parameter pack 1059 /// and the 1060 /// 1061 /// By default, performs semantic analysis to determine whether the name can 1062 /// be resolved to a specific template, then builds the appropriate kind of 1063 /// template name. Subclasses may override this routine to provide different 1064 /// behavior. 1065 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1066 const TemplateArgument &ArgPack) { 1067 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1068 } 1069 1070 /// \brief Build a new compound statement. 1071 /// 1072 /// By default, performs semantic analysis to build the new statement. 1073 /// Subclasses may override this routine to provide different behavior. 1074 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1075 MultiStmtArg Statements, 1076 SourceLocation RBraceLoc, 1077 bool IsStmtExpr) { 1078 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1079 IsStmtExpr); 1080 } 1081 1082 /// \brief Build a new case statement. 1083 /// 1084 /// By default, performs semantic analysis to build the new statement. 1085 /// Subclasses may override this routine to provide different behavior. 1086 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1087 Expr *LHS, 1088 SourceLocation EllipsisLoc, 1089 Expr *RHS, 1090 SourceLocation ColonLoc) { 1091 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1092 ColonLoc); 1093 } 1094 1095 /// \brief Attach the body to a new case statement. 1096 /// 1097 /// By default, performs semantic analysis to build the new statement. 1098 /// Subclasses may override this routine to provide different behavior. 1099 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1100 getSema().ActOnCaseStmtBody(S, Body); 1101 return S; 1102 } 1103 1104 /// \brief Build a new default statement. 1105 /// 1106 /// By default, performs semantic analysis to build the new statement. 1107 /// Subclasses may override this routine to provide different behavior. 1108 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1109 SourceLocation ColonLoc, 1110 Stmt *SubStmt) { 1111 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1112 /*CurScope=*/nullptr); 1113 } 1114 1115 /// \brief Build a new label statement. 1116 /// 1117 /// By default, performs semantic analysis to build the new statement. 1118 /// Subclasses may override this routine to provide different behavior. 1119 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1120 SourceLocation ColonLoc, Stmt *SubStmt) { 1121 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1122 } 1123 1124 /// \brief Build a new label statement. 1125 /// 1126 /// By default, performs semantic analysis to build the new statement. 1127 /// Subclasses may override this routine to provide different behavior. 1128 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1129 ArrayRef<const Attr*> Attrs, 1130 Stmt *SubStmt) { 1131 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1132 } 1133 1134 /// \brief Build a new "if" statement. 1135 /// 1136 /// By default, performs semantic analysis to build the new statement. 1137 /// Subclasses may override this routine to provide different behavior. 1138 StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 1139 VarDecl *CondVar, Stmt *Then, 1140 SourceLocation ElseLoc, Stmt *Else) { 1141 return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 1142 } 1143 1144 /// \brief Start building a new switch statement. 1145 /// 1146 /// By default, performs semantic analysis to build the new statement. 1147 /// Subclasses may override this routine to provide different behavior. 1148 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1149 Expr *Cond, VarDecl *CondVar) { 1150 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 1151 CondVar); 1152 } 1153 1154 /// \brief Attach the body to the switch statement. 1155 /// 1156 /// By default, performs semantic analysis to build the new statement. 1157 /// Subclasses may override this routine to provide different behavior. 1158 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1159 Stmt *Switch, Stmt *Body) { 1160 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1161 } 1162 1163 /// \brief Build a new while statement. 1164 /// 1165 /// By default, performs semantic analysis to build the new statement. 1166 /// Subclasses may override this routine to provide different behavior. 1167 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 1168 VarDecl *CondVar, Stmt *Body) { 1169 return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 1170 } 1171 1172 /// \brief Build a new do-while statement. 1173 /// 1174 /// By default, performs semantic analysis to build the new statement. 1175 /// Subclasses may override this routine to provide different behavior. 1176 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1177 SourceLocation WhileLoc, SourceLocation LParenLoc, 1178 Expr *Cond, SourceLocation RParenLoc) { 1179 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1180 Cond, RParenLoc); 1181 } 1182 1183 /// \brief Build a new for statement. 1184 /// 1185 /// By default, performs semantic analysis to build the new statement. 1186 /// Subclasses may override this routine to provide different behavior. 1187 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1188 Stmt *Init, Sema::FullExprArg Cond, 1189 VarDecl *CondVar, Sema::FullExprArg Inc, 1190 SourceLocation RParenLoc, Stmt *Body) { 1191 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1192 CondVar, Inc, RParenLoc, Body); 1193 } 1194 1195 /// \brief Build a new goto statement. 1196 /// 1197 /// By default, performs semantic analysis to build the new statement. 1198 /// Subclasses may override this routine to provide different behavior. 1199 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1200 LabelDecl *Label) { 1201 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1202 } 1203 1204 /// \brief Build a new indirect goto statement. 1205 /// 1206 /// By default, performs semantic analysis to build the new statement. 1207 /// Subclasses may override this routine to provide different behavior. 1208 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1209 SourceLocation StarLoc, 1210 Expr *Target) { 1211 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1212 } 1213 1214 /// \brief Build a new return statement. 1215 /// 1216 /// By default, performs semantic analysis to build the new statement. 1217 /// Subclasses may override this routine to provide different behavior. 1218 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1219 return getSema().BuildReturnStmt(ReturnLoc, Result); 1220 } 1221 1222 /// \brief Build a new declaration statement. 1223 /// 1224 /// By default, performs semantic analysis to build the new statement. 1225 /// Subclasses may override this routine to provide different behavior. 1226 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1227 SourceLocation StartLoc, SourceLocation EndLoc) { 1228 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1229 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1230 } 1231 1232 /// \brief Build a new inline asm statement. 1233 /// 1234 /// By default, performs semantic analysis to build the new statement. 1235 /// Subclasses may override this routine to provide different behavior. 1236 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1237 bool IsVolatile, unsigned NumOutputs, 1238 unsigned NumInputs, IdentifierInfo **Names, 1239 MultiExprArg Constraints, MultiExprArg Exprs, 1240 Expr *AsmString, MultiExprArg Clobbers, 1241 SourceLocation RParenLoc) { 1242 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1243 NumInputs, Names, Constraints, Exprs, 1244 AsmString, Clobbers, RParenLoc); 1245 } 1246 1247 /// \brief Build a new MS style inline asm statement. 1248 /// 1249 /// By default, performs semantic analysis to build the new statement. 1250 /// Subclasses may override this routine to provide different behavior. 1251 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1252 ArrayRef<Token> AsmToks, 1253 StringRef AsmString, 1254 unsigned NumOutputs, unsigned NumInputs, 1255 ArrayRef<StringRef> Constraints, 1256 ArrayRef<StringRef> Clobbers, 1257 ArrayRef<Expr*> Exprs, 1258 SourceLocation EndLoc) { 1259 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1260 NumOutputs, NumInputs, 1261 Constraints, Clobbers, Exprs, EndLoc); 1262 } 1263 1264 /// \brief Build a new Objective-C \@try statement. 1265 /// 1266 /// By default, performs semantic analysis to build the new statement. 1267 /// Subclasses may override this routine to provide different behavior. 1268 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1269 Stmt *TryBody, 1270 MultiStmtArg CatchStmts, 1271 Stmt *Finally) { 1272 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1273 Finally); 1274 } 1275 1276 /// \brief Rebuild an Objective-C exception declaration. 1277 /// 1278 /// By default, performs semantic analysis to build the new declaration. 1279 /// Subclasses may override this routine to provide different behavior. 1280 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1281 TypeSourceInfo *TInfo, QualType T) { 1282 return getSema().BuildObjCExceptionDecl(TInfo, T, 1283 ExceptionDecl->getInnerLocStart(), 1284 ExceptionDecl->getLocation(), 1285 ExceptionDecl->getIdentifier()); 1286 } 1287 1288 /// \brief Build a new Objective-C \@catch statement. 1289 /// 1290 /// By default, performs semantic analysis to build the new statement. 1291 /// Subclasses may override this routine to provide different behavior. 1292 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1293 SourceLocation RParenLoc, 1294 VarDecl *Var, 1295 Stmt *Body) { 1296 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1297 Var, Body); 1298 } 1299 1300 /// \brief Build a new Objective-C \@finally statement. 1301 /// 1302 /// By default, performs semantic analysis to build the new statement. 1303 /// Subclasses may override this routine to provide different behavior. 1304 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1305 Stmt *Body) { 1306 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1307 } 1308 1309 /// \brief Build a new Objective-C \@throw statement. 1310 /// 1311 /// By default, performs semantic analysis to build the new statement. 1312 /// Subclasses may override this routine to provide different behavior. 1313 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1314 Expr *Operand) { 1315 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1316 } 1317 1318 /// \brief Build a new OpenMP executable directive. 1319 /// 1320 /// By default, performs semantic analysis to build the new statement. 1321 /// Subclasses may override this routine to provide different behavior. 1322 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1323 DeclarationNameInfo DirName, 1324 ArrayRef<OMPClause *> Clauses, 1325 Stmt *AStmt, SourceLocation StartLoc, 1326 SourceLocation EndLoc) { 1327 return getSema().ActOnOpenMPExecutableDirective(Kind, DirName, Clauses, 1328 AStmt, StartLoc, EndLoc); 1329 } 1330 1331 /// \brief Build a new OpenMP 'if' clause. 1332 /// 1333 /// By default, performs semantic analysis to build the new OpenMP clause. 1334 /// Subclasses may override this routine to provide different behavior. 1335 OMPClause *RebuildOMPIfClause(Expr *Condition, 1336 SourceLocation StartLoc, 1337 SourceLocation LParenLoc, 1338 SourceLocation EndLoc) { 1339 return getSema().ActOnOpenMPIfClause(Condition, StartLoc, 1340 LParenLoc, EndLoc); 1341 } 1342 1343 /// \brief Build a new OpenMP 'final' clause. 1344 /// 1345 /// By default, performs semantic analysis to build the new OpenMP clause. 1346 /// Subclasses may override this routine to provide different behavior. 1347 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1348 SourceLocation LParenLoc, 1349 SourceLocation EndLoc) { 1350 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1351 EndLoc); 1352 } 1353 1354 /// \brief Build a new OpenMP 'num_threads' clause. 1355 /// 1356 /// By default, performs semantic analysis to build the new OpenMP clause. 1357 /// Subclasses may override this routine to provide different behavior. 1358 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1359 SourceLocation StartLoc, 1360 SourceLocation LParenLoc, 1361 SourceLocation EndLoc) { 1362 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1363 LParenLoc, EndLoc); 1364 } 1365 1366 /// \brief Build a new OpenMP 'safelen' clause. 1367 /// 1368 /// By default, performs semantic analysis to build the new OpenMP clause. 1369 /// Subclasses may override this routine to provide different behavior. 1370 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1371 SourceLocation LParenLoc, 1372 SourceLocation EndLoc) { 1373 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1374 } 1375 1376 /// \brief Build a new OpenMP 'collapse' clause. 1377 /// 1378 /// By default, performs semantic analysis to build the new OpenMP clause. 1379 /// Subclasses may override this routine to provide different behavior. 1380 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1381 SourceLocation LParenLoc, 1382 SourceLocation EndLoc) { 1383 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1384 EndLoc); 1385 } 1386 1387 /// \brief Build a new OpenMP 'default' clause. 1388 /// 1389 /// By default, performs semantic analysis to build the new OpenMP clause. 1390 /// Subclasses may override this routine to provide different behavior. 1391 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1392 SourceLocation KindKwLoc, 1393 SourceLocation StartLoc, 1394 SourceLocation LParenLoc, 1395 SourceLocation EndLoc) { 1396 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1397 StartLoc, LParenLoc, EndLoc); 1398 } 1399 1400 /// \brief Build a new OpenMP 'proc_bind' clause. 1401 /// 1402 /// By default, performs semantic analysis to build the new OpenMP clause. 1403 /// Subclasses may override this routine to provide different behavior. 1404 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1405 SourceLocation KindKwLoc, 1406 SourceLocation StartLoc, 1407 SourceLocation LParenLoc, 1408 SourceLocation EndLoc) { 1409 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1410 StartLoc, LParenLoc, EndLoc); 1411 } 1412 1413 /// \brief Build a new OpenMP 'schedule' clause. 1414 /// 1415 /// By default, performs semantic analysis to build the new OpenMP clause. 1416 /// Subclasses may override this routine to provide different behavior. 1417 OMPClause *RebuildOMPScheduleClause(OpenMPScheduleClauseKind Kind, 1418 Expr *ChunkSize, 1419 SourceLocation StartLoc, 1420 SourceLocation LParenLoc, 1421 SourceLocation KindLoc, 1422 SourceLocation CommaLoc, 1423 SourceLocation EndLoc) { 1424 return getSema().ActOnOpenMPScheduleClause( 1425 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1426 } 1427 1428 /// \brief Build a new OpenMP 'private' clause. 1429 /// 1430 /// By default, performs semantic analysis to build the new OpenMP clause. 1431 /// Subclasses may override this routine to provide different behavior. 1432 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1433 SourceLocation StartLoc, 1434 SourceLocation LParenLoc, 1435 SourceLocation EndLoc) { 1436 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1437 EndLoc); 1438 } 1439 1440 /// \brief Build a new OpenMP 'firstprivate' clause. 1441 /// 1442 /// By default, performs semantic analysis to build the new OpenMP clause. 1443 /// Subclasses may override this routine to provide different behavior. 1444 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1445 SourceLocation StartLoc, 1446 SourceLocation LParenLoc, 1447 SourceLocation EndLoc) { 1448 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1449 EndLoc); 1450 } 1451 1452 /// \brief Build a new OpenMP 'lastprivate' clause. 1453 /// 1454 /// By default, performs semantic analysis to build the new OpenMP clause. 1455 /// Subclasses may override this routine to provide different behavior. 1456 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1457 SourceLocation StartLoc, 1458 SourceLocation LParenLoc, 1459 SourceLocation EndLoc) { 1460 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1461 EndLoc); 1462 } 1463 1464 /// \brief Build a new OpenMP 'shared' clause. 1465 /// 1466 /// By default, performs semantic analysis to build the new OpenMP clause. 1467 /// Subclasses may override this routine to provide different behavior. 1468 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1469 SourceLocation StartLoc, 1470 SourceLocation LParenLoc, 1471 SourceLocation EndLoc) { 1472 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1473 EndLoc); 1474 } 1475 1476 /// \brief Build a new OpenMP 'reduction' clause. 1477 /// 1478 /// By default, performs semantic analysis to build the new statement. 1479 /// Subclasses may override this routine to provide different behavior. 1480 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1481 SourceLocation StartLoc, 1482 SourceLocation LParenLoc, 1483 SourceLocation ColonLoc, 1484 SourceLocation EndLoc, 1485 CXXScopeSpec &ReductionIdScopeSpec, 1486 const DeclarationNameInfo &ReductionId) { 1487 return getSema().ActOnOpenMPReductionClause( 1488 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1489 ReductionId); 1490 } 1491 1492 /// \brief Build a new OpenMP 'linear' 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 *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1497 SourceLocation StartLoc, 1498 SourceLocation LParenLoc, 1499 SourceLocation ColonLoc, 1500 SourceLocation EndLoc) { 1501 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1502 ColonLoc, EndLoc); 1503 } 1504 1505 /// \brief Build a new OpenMP 'aligned' clause. 1506 /// 1507 /// By default, performs semantic analysis to build the new OpenMP clause. 1508 /// Subclasses may override this routine to provide different behavior. 1509 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1510 SourceLocation StartLoc, 1511 SourceLocation LParenLoc, 1512 SourceLocation ColonLoc, 1513 SourceLocation EndLoc) { 1514 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1515 LParenLoc, ColonLoc, EndLoc); 1516 } 1517 1518 /// \brief Build a new OpenMP 'copyin' 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 *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1523 SourceLocation StartLoc, 1524 SourceLocation LParenLoc, 1525 SourceLocation EndLoc) { 1526 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1527 EndLoc); 1528 } 1529 1530 /// \brief Build a new OpenMP 'copyprivate' 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 *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1535 SourceLocation StartLoc, 1536 SourceLocation LParenLoc, 1537 SourceLocation EndLoc) { 1538 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1539 EndLoc); 1540 } 1541 1542 /// \brief Build a new OpenMP 'flush' pseudo clause. 1543 /// 1544 /// By default, performs semantic analysis to build the new OpenMP clause. 1545 /// Subclasses may override this routine to provide different behavior. 1546 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1547 SourceLocation StartLoc, 1548 SourceLocation LParenLoc, 1549 SourceLocation EndLoc) { 1550 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1551 EndLoc); 1552 } 1553 1554 /// \brief Rebuild the operand to an Objective-C \@synchronized statement. 1555 /// 1556 /// By default, performs semantic analysis to build the new statement. 1557 /// Subclasses may override this routine to provide different behavior. 1558 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1559 Expr *object) { 1560 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1561 } 1562 1563 /// \brief Build a new Objective-C \@synchronized statement. 1564 /// 1565 /// By default, performs semantic analysis to build the new statement. 1566 /// Subclasses may override this routine to provide different behavior. 1567 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1568 Expr *Object, Stmt *Body) { 1569 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1570 } 1571 1572 /// \brief Build a new Objective-C \@autoreleasepool statement. 1573 /// 1574 /// By default, performs semantic analysis to build the new statement. 1575 /// Subclasses may override this routine to provide different behavior. 1576 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1577 Stmt *Body) { 1578 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1579 } 1580 1581 /// \brief Build a new Objective-C fast enumeration statement. 1582 /// 1583 /// By default, performs semantic analysis to build the new statement. 1584 /// Subclasses may override this routine to provide different behavior. 1585 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1586 Stmt *Element, 1587 Expr *Collection, 1588 SourceLocation RParenLoc, 1589 Stmt *Body) { 1590 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1591 Element, 1592 Collection, 1593 RParenLoc); 1594 if (ForEachStmt.isInvalid()) 1595 return StmtError(); 1596 1597 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1598 } 1599 1600 /// \brief Build a new C++ exception declaration. 1601 /// 1602 /// By default, performs semantic analysis to build the new decaration. 1603 /// Subclasses may override this routine to provide different behavior. 1604 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1605 TypeSourceInfo *Declarator, 1606 SourceLocation StartLoc, 1607 SourceLocation IdLoc, 1608 IdentifierInfo *Id) { 1609 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1610 StartLoc, IdLoc, Id); 1611 if (Var) 1612 getSema().CurContext->addDecl(Var); 1613 return Var; 1614 } 1615 1616 /// \brief Build a new C++ catch statement. 1617 /// 1618 /// By default, performs semantic analysis to build the new statement. 1619 /// Subclasses may override this routine to provide different behavior. 1620 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1621 VarDecl *ExceptionDecl, 1622 Stmt *Handler) { 1623 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1624 Handler)); 1625 } 1626 1627 /// \brief Build a new C++ try statement. 1628 /// 1629 /// By default, performs semantic analysis to build the new statement. 1630 /// Subclasses may override this routine to provide different behavior. 1631 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 1632 ArrayRef<Stmt *> Handlers) { 1633 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 1634 } 1635 1636 /// \brief Build a new C++0x range-based for statement. 1637 /// 1638 /// By default, performs semantic analysis to build the new statement. 1639 /// Subclasses may override this routine to provide different behavior. 1640 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 1641 SourceLocation ColonLoc, 1642 Stmt *Range, Stmt *BeginEnd, 1643 Expr *Cond, Expr *Inc, 1644 Stmt *LoopVar, 1645 SourceLocation RParenLoc) { 1646 // If we've just learned that the range is actually an Objective-C 1647 // collection, treat this as an Objective-C fast enumeration loop. 1648 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 1649 if (RangeStmt->isSingleDecl()) { 1650 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 1651 if (RangeVar->isInvalidDecl()) 1652 return StmtError(); 1653 1654 Expr *RangeExpr = RangeVar->getInit(); 1655 if (!RangeExpr->isTypeDependent() && 1656 RangeExpr->getType()->isObjCObjectPointerType()) 1657 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 1658 RParenLoc); 1659 } 1660 } 1661 } 1662 1663 return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd, 1664 Cond, Inc, LoopVar, RParenLoc, 1665 Sema::BFRK_Rebuild); 1666 } 1667 1668 /// \brief Build a new C++0x range-based for statement. 1669 /// 1670 /// By default, performs semantic analysis to build the new statement. 1671 /// Subclasses may override this routine to provide different behavior. 1672 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 1673 bool IsIfExists, 1674 NestedNameSpecifierLoc QualifierLoc, 1675 DeclarationNameInfo NameInfo, 1676 Stmt *Nested) { 1677 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 1678 QualifierLoc, NameInfo, Nested); 1679 } 1680 1681 /// \brief Attach body to a C++0x range-based for statement. 1682 /// 1683 /// By default, performs semantic analysis to finish the new statement. 1684 /// Subclasses may override this routine to provide different behavior. 1685 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 1686 return getSema().FinishCXXForRangeStmt(ForRange, Body); 1687 } 1688 1689 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 1690 Stmt *TryBlock, Stmt *Handler) { 1691 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 1692 } 1693 1694 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 1695 Stmt *Block) { 1696 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 1697 } 1698 1699 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 1700 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 1701 } 1702 1703 /// \brief Build a new predefined expression. 1704 /// 1705 /// By default, performs semantic analysis to build the new expression. 1706 /// Subclasses may override this routine to provide different behavior. 1707 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 1708 PredefinedExpr::IdentType IT) { 1709 return getSema().BuildPredefinedExpr(Loc, IT); 1710 } 1711 1712 /// \brief Build a new expression that references a declaration. 1713 /// 1714 /// By default, performs semantic analysis to build the new expression. 1715 /// Subclasses may override this routine to provide different behavior. 1716 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1717 LookupResult &R, 1718 bool RequiresADL) { 1719 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1720 } 1721 1722 1723 /// \brief Build a new expression that references a declaration. 1724 /// 1725 /// By default, performs semantic analysis to build the new expression. 1726 /// Subclasses may override this routine to provide different behavior. 1727 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 1728 ValueDecl *VD, 1729 const DeclarationNameInfo &NameInfo, 1730 TemplateArgumentListInfo *TemplateArgs) { 1731 CXXScopeSpec SS; 1732 SS.Adopt(QualifierLoc); 1733 1734 // FIXME: loses template args. 1735 1736 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 1737 } 1738 1739 /// \brief Build a new expression in parentheses. 1740 /// 1741 /// By default, performs semantic analysis to build the new expression. 1742 /// Subclasses may override this routine to provide different behavior. 1743 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 1744 SourceLocation RParen) { 1745 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 1746 } 1747 1748 /// \brief Build a new pseudo-destructor expression. 1749 /// 1750 /// By default, performs semantic analysis to build the new expression. 1751 /// Subclasses may override this routine to provide different behavior. 1752 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 1753 SourceLocation OperatorLoc, 1754 bool isArrow, 1755 CXXScopeSpec &SS, 1756 TypeSourceInfo *ScopeType, 1757 SourceLocation CCLoc, 1758 SourceLocation TildeLoc, 1759 PseudoDestructorTypeStorage Destroyed); 1760 1761 /// \brief Build a new unary operator expression. 1762 /// 1763 /// By default, performs semantic analysis to build the new expression. 1764 /// Subclasses may override this routine to provide different behavior. 1765 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 1766 UnaryOperatorKind Opc, 1767 Expr *SubExpr) { 1768 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 1769 } 1770 1771 /// \brief Build a new builtin offsetof expression. 1772 /// 1773 /// By default, performs semantic analysis to build the new expression. 1774 /// Subclasses may override this routine to provide different behavior. 1775 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 1776 TypeSourceInfo *Type, 1777 Sema::OffsetOfComponent *Components, 1778 unsigned NumComponents, 1779 SourceLocation RParenLoc) { 1780 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 1781 NumComponents, RParenLoc); 1782 } 1783 1784 /// \brief Build a new sizeof, alignof or vec_step expression with a 1785 /// type argument. 1786 /// 1787 /// By default, performs semantic analysis to build the new expression. 1788 /// Subclasses may override this routine to provide different behavior. 1789 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 1790 SourceLocation OpLoc, 1791 UnaryExprOrTypeTrait ExprKind, 1792 SourceRange R) { 1793 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 1794 } 1795 1796 /// \brief Build a new sizeof, alignof or vec step expression with an 1797 /// expression argument. 1798 /// 1799 /// By default, performs semantic analysis to build the new expression. 1800 /// Subclasses may override this routine to provide different behavior. 1801 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 1802 UnaryExprOrTypeTrait ExprKind, 1803 SourceRange R) { 1804 ExprResult Result 1805 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 1806 if (Result.isInvalid()) 1807 return ExprError(); 1808 1809 return Result; 1810 } 1811 1812 /// \brief Build a new array subscript expression. 1813 /// 1814 /// By default, performs semantic analysis to build the new expression. 1815 /// Subclasses may override this routine to provide different behavior. 1816 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 1817 SourceLocation LBracketLoc, 1818 Expr *RHS, 1819 SourceLocation RBracketLoc) { 1820 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 1821 LBracketLoc, RHS, 1822 RBracketLoc); 1823 } 1824 1825 /// \brief Build a new call expression. 1826 /// 1827 /// By default, performs semantic analysis to build the new expression. 1828 /// Subclasses may override this routine to provide different behavior. 1829 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 1830 MultiExprArg Args, 1831 SourceLocation RParenLoc, 1832 Expr *ExecConfig = nullptr) { 1833 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 1834 Args, RParenLoc, ExecConfig); 1835 } 1836 1837 /// \brief Build a new member access expression. 1838 /// 1839 /// By default, performs semantic analysis to build the new expression. 1840 /// Subclasses may override this routine to provide different behavior. 1841 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 1842 bool isArrow, 1843 NestedNameSpecifierLoc QualifierLoc, 1844 SourceLocation TemplateKWLoc, 1845 const DeclarationNameInfo &MemberNameInfo, 1846 ValueDecl *Member, 1847 NamedDecl *FoundDecl, 1848 const TemplateArgumentListInfo *ExplicitTemplateArgs, 1849 NamedDecl *FirstQualifierInScope) { 1850 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 1851 isArrow); 1852 if (!Member->getDeclName()) { 1853 // We have a reference to an unnamed field. This is always the 1854 // base of an anonymous struct/union member access, i.e. the 1855 // field is always of record type. 1856 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 1857 assert(Member->getType()->isRecordType() && 1858 "unnamed member not of record type?"); 1859 1860 BaseResult = 1861 getSema().PerformObjectMemberConversion(BaseResult.get(), 1862 QualifierLoc.getNestedNameSpecifier(), 1863 FoundDecl, Member); 1864 if (BaseResult.isInvalid()) 1865 return ExprError(); 1866 Base = BaseResult.get(); 1867 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 1868 MemberExpr *ME = new (getSema().Context) 1869 MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo, 1870 cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary); 1871 return ME; 1872 } 1873 1874 CXXScopeSpec SS; 1875 SS.Adopt(QualifierLoc); 1876 1877 Base = BaseResult.get(); 1878 QualType BaseType = Base->getType(); 1879 1880 // FIXME: this involves duplicating earlier analysis in a lot of 1881 // cases; we should avoid this when possible. 1882 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 1883 R.addDecl(FoundDecl); 1884 R.resolveKind(); 1885 1886 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 1887 SS, TemplateKWLoc, 1888 FirstQualifierInScope, 1889 R, ExplicitTemplateArgs); 1890 } 1891 1892 /// \brief Build a new binary operator expression. 1893 /// 1894 /// By default, performs semantic analysis to build the new expression. 1895 /// Subclasses may override this routine to provide different behavior. 1896 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 1897 BinaryOperatorKind Opc, 1898 Expr *LHS, Expr *RHS) { 1899 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 1900 } 1901 1902 /// \brief Build a new conditional operator expression. 1903 /// 1904 /// By default, performs semantic analysis to build the new expression. 1905 /// Subclasses may override this routine to provide different behavior. 1906 ExprResult RebuildConditionalOperator(Expr *Cond, 1907 SourceLocation QuestionLoc, 1908 Expr *LHS, 1909 SourceLocation ColonLoc, 1910 Expr *RHS) { 1911 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 1912 LHS, RHS); 1913 } 1914 1915 /// \brief Build a new C-style cast expression. 1916 /// 1917 /// By default, performs semantic analysis to build the new expression. 1918 /// Subclasses may override this routine to provide different behavior. 1919 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 1920 TypeSourceInfo *TInfo, 1921 SourceLocation RParenLoc, 1922 Expr *SubExpr) { 1923 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 1924 SubExpr); 1925 } 1926 1927 /// \brief Build a new compound literal expression. 1928 /// 1929 /// By default, performs semantic analysis to build the new expression. 1930 /// Subclasses may override this routine to provide different behavior. 1931 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1932 TypeSourceInfo *TInfo, 1933 SourceLocation RParenLoc, 1934 Expr *Init) { 1935 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 1936 Init); 1937 } 1938 1939 /// \brief Build a new extended vector element access expression. 1940 /// 1941 /// By default, performs semantic analysis to build the new expression. 1942 /// Subclasses may override this routine to provide different behavior. 1943 ExprResult RebuildExtVectorElementExpr(Expr *Base, 1944 SourceLocation OpLoc, 1945 SourceLocation AccessorLoc, 1946 IdentifierInfo &Accessor) { 1947 1948 CXXScopeSpec SS; 1949 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 1950 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 1951 OpLoc, /*IsArrow*/ false, 1952 SS, SourceLocation(), 1953 /*FirstQualifierInScope*/ nullptr, 1954 NameInfo, 1955 /* TemplateArgs */ nullptr); 1956 } 1957 1958 /// \brief Build a new initializer list expression. 1959 /// 1960 /// By default, performs semantic analysis to build the new expression. 1961 /// Subclasses may override this routine to provide different behavior. 1962 ExprResult RebuildInitList(SourceLocation LBraceLoc, 1963 MultiExprArg Inits, 1964 SourceLocation RBraceLoc, 1965 QualType ResultTy) { 1966 ExprResult Result 1967 = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 1968 if (Result.isInvalid() || ResultTy->isDependentType()) 1969 return Result; 1970 1971 // Patch in the result type we were given, which may have been computed 1972 // when the initial InitListExpr was built. 1973 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1974 ILE->setType(ResultTy); 1975 return Result; 1976 } 1977 1978 /// \brief Build a new designated initializer expression. 1979 /// 1980 /// By default, performs semantic analysis to build the new expression. 1981 /// Subclasses may override this routine to provide different behavior. 1982 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 1983 MultiExprArg ArrayExprs, 1984 SourceLocation EqualOrColonLoc, 1985 bool GNUSyntax, 1986 Expr *Init) { 1987 ExprResult Result 1988 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1989 Init); 1990 if (Result.isInvalid()) 1991 return ExprError(); 1992 1993 return Result; 1994 } 1995 1996 /// \brief Build a new value-initialized expression. 1997 /// 1998 /// By default, builds the implicit value initialization without performing 1999 /// any semantic analysis. Subclasses may override this routine to provide 2000 /// different behavior. 2001 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2002 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2003 } 2004 2005 /// \brief Build a new \c va_arg expression. 2006 /// 2007 /// By default, performs semantic analysis to build the new expression. 2008 /// Subclasses may override this routine to provide different behavior. 2009 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2010 Expr *SubExpr, TypeSourceInfo *TInfo, 2011 SourceLocation RParenLoc) { 2012 return getSema().BuildVAArgExpr(BuiltinLoc, 2013 SubExpr, TInfo, 2014 RParenLoc); 2015 } 2016 2017 /// \brief Build a new expression list in parentheses. 2018 /// 2019 /// By default, performs semantic analysis to build the new expression. 2020 /// Subclasses may override this routine to provide different behavior. 2021 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2022 MultiExprArg SubExprs, 2023 SourceLocation RParenLoc) { 2024 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2025 } 2026 2027 /// \brief Build a new address-of-label expression. 2028 /// 2029 /// By default, performs semantic analysis, using the name of the label 2030 /// rather than attempting to map the label statement itself. 2031 /// Subclasses may override this routine to provide different behavior. 2032 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2033 SourceLocation LabelLoc, LabelDecl *Label) { 2034 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2035 } 2036 2037 /// \brief Build a new GNU statement expression. 2038 /// 2039 /// By default, performs semantic analysis to build the new expression. 2040 /// Subclasses may override this routine to provide different behavior. 2041 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2042 Stmt *SubStmt, 2043 SourceLocation RParenLoc) { 2044 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2045 } 2046 2047 /// \brief Build a new __builtin_choose_expr expression. 2048 /// 2049 /// By default, performs semantic analysis to build the new expression. 2050 /// Subclasses may override this routine to provide different behavior. 2051 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2052 Expr *Cond, Expr *LHS, Expr *RHS, 2053 SourceLocation RParenLoc) { 2054 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2055 Cond, LHS, RHS, 2056 RParenLoc); 2057 } 2058 2059 /// \brief Build a new generic selection expression. 2060 /// 2061 /// By default, performs semantic analysis to build the new expression. 2062 /// Subclasses may override this routine to provide different behavior. 2063 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2064 SourceLocation DefaultLoc, 2065 SourceLocation RParenLoc, 2066 Expr *ControllingExpr, 2067 ArrayRef<TypeSourceInfo *> Types, 2068 ArrayRef<Expr *> Exprs) { 2069 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2070 ControllingExpr, Types, Exprs); 2071 } 2072 2073 /// \brief Build a new overloaded operator call expression. 2074 /// 2075 /// By default, performs semantic analysis to build the new expression. 2076 /// The semantic analysis provides the behavior of template instantiation, 2077 /// copying with transformations that turn what looks like an overloaded 2078 /// operator call into a use of a builtin operator, performing 2079 /// argument-dependent lookup, etc. Subclasses may override this routine to 2080 /// provide different behavior. 2081 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2082 SourceLocation OpLoc, 2083 Expr *Callee, 2084 Expr *First, 2085 Expr *Second); 2086 2087 /// \brief Build a new C++ "named" cast expression, such as static_cast or 2088 /// reinterpret_cast. 2089 /// 2090 /// By default, this routine dispatches to one of the more-specific routines 2091 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2092 /// Subclasses may override this routine to provide different behavior. 2093 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2094 Stmt::StmtClass Class, 2095 SourceLocation LAngleLoc, 2096 TypeSourceInfo *TInfo, 2097 SourceLocation RAngleLoc, 2098 SourceLocation LParenLoc, 2099 Expr *SubExpr, 2100 SourceLocation RParenLoc) { 2101 switch (Class) { 2102 case Stmt::CXXStaticCastExprClass: 2103 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2104 RAngleLoc, LParenLoc, 2105 SubExpr, RParenLoc); 2106 2107 case Stmt::CXXDynamicCastExprClass: 2108 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2109 RAngleLoc, LParenLoc, 2110 SubExpr, RParenLoc); 2111 2112 case Stmt::CXXReinterpretCastExprClass: 2113 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2114 RAngleLoc, LParenLoc, 2115 SubExpr, 2116 RParenLoc); 2117 2118 case Stmt::CXXConstCastExprClass: 2119 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2120 RAngleLoc, LParenLoc, 2121 SubExpr, RParenLoc); 2122 2123 default: 2124 llvm_unreachable("Invalid C++ named cast"); 2125 } 2126 } 2127 2128 /// \brief Build a new C++ static_cast expression. 2129 /// 2130 /// By default, performs semantic analysis to build the new expression. 2131 /// Subclasses may override this routine to provide different behavior. 2132 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2133 SourceLocation LAngleLoc, 2134 TypeSourceInfo *TInfo, 2135 SourceLocation RAngleLoc, 2136 SourceLocation LParenLoc, 2137 Expr *SubExpr, 2138 SourceLocation RParenLoc) { 2139 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2140 TInfo, SubExpr, 2141 SourceRange(LAngleLoc, RAngleLoc), 2142 SourceRange(LParenLoc, RParenLoc)); 2143 } 2144 2145 /// \brief Build a new C++ dynamic_cast expression. 2146 /// 2147 /// By default, performs semantic analysis to build the new expression. 2148 /// Subclasses may override this routine to provide different behavior. 2149 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2150 SourceLocation LAngleLoc, 2151 TypeSourceInfo *TInfo, 2152 SourceLocation RAngleLoc, 2153 SourceLocation LParenLoc, 2154 Expr *SubExpr, 2155 SourceLocation RParenLoc) { 2156 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2157 TInfo, SubExpr, 2158 SourceRange(LAngleLoc, RAngleLoc), 2159 SourceRange(LParenLoc, RParenLoc)); 2160 } 2161 2162 /// \brief Build a new C++ reinterpret_cast 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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2167 SourceLocation LAngleLoc, 2168 TypeSourceInfo *TInfo, 2169 SourceLocation RAngleLoc, 2170 SourceLocation LParenLoc, 2171 Expr *SubExpr, 2172 SourceLocation RParenLoc) { 2173 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2174 TInfo, SubExpr, 2175 SourceRange(LAngleLoc, RAngleLoc), 2176 SourceRange(LParenLoc, RParenLoc)); 2177 } 2178 2179 /// \brief Build a new C++ const_cast expression. 2180 /// 2181 /// By default, performs semantic analysis to build the new expression. 2182 /// Subclasses may override this routine to provide different behavior. 2183 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2184 SourceLocation LAngleLoc, 2185 TypeSourceInfo *TInfo, 2186 SourceLocation RAngleLoc, 2187 SourceLocation LParenLoc, 2188 Expr *SubExpr, 2189 SourceLocation RParenLoc) { 2190 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2191 TInfo, SubExpr, 2192 SourceRange(LAngleLoc, RAngleLoc), 2193 SourceRange(LParenLoc, RParenLoc)); 2194 } 2195 2196 /// \brief Build a new C++ functional-style cast expression. 2197 /// 2198 /// By default, performs semantic analysis to build the new expression. 2199 /// Subclasses may override this routine to provide different behavior. 2200 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2201 SourceLocation LParenLoc, 2202 Expr *Sub, 2203 SourceLocation RParenLoc) { 2204 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2205 MultiExprArg(&Sub, 1), 2206 RParenLoc); 2207 } 2208 2209 /// \brief Build a new C++ typeid(type) expression. 2210 /// 2211 /// By default, performs semantic analysis to build the new expression. 2212 /// Subclasses may override this routine to provide different behavior. 2213 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2214 SourceLocation TypeidLoc, 2215 TypeSourceInfo *Operand, 2216 SourceLocation RParenLoc) { 2217 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2218 RParenLoc); 2219 } 2220 2221 2222 /// \brief Build a new C++ typeid(expr) expression. 2223 /// 2224 /// By default, performs semantic analysis to build the new expression. 2225 /// Subclasses may override this routine to provide different behavior. 2226 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2227 SourceLocation TypeidLoc, 2228 Expr *Operand, 2229 SourceLocation RParenLoc) { 2230 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2231 RParenLoc); 2232 } 2233 2234 /// \brief Build a new C++ __uuidof(type) expression. 2235 /// 2236 /// By default, performs semantic analysis to build the new expression. 2237 /// Subclasses may override this routine to provide different behavior. 2238 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2239 SourceLocation TypeidLoc, 2240 TypeSourceInfo *Operand, 2241 SourceLocation RParenLoc) { 2242 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2243 RParenLoc); 2244 } 2245 2246 /// \brief Build a new C++ __uuidof(expr) expression. 2247 /// 2248 /// By default, performs semantic analysis to build the new expression. 2249 /// Subclasses may override this routine to provide different behavior. 2250 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2251 SourceLocation TypeidLoc, 2252 Expr *Operand, 2253 SourceLocation RParenLoc) { 2254 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2255 RParenLoc); 2256 } 2257 2258 /// \brief Build a new C++ "this" expression. 2259 /// 2260 /// By default, builds a new "this" expression without performing any 2261 /// semantic analysis. Subclasses may override this routine to provide 2262 /// different behavior. 2263 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2264 QualType ThisType, 2265 bool isImplicit) { 2266 getSema().CheckCXXThisCapture(ThisLoc); 2267 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2268 } 2269 2270 /// \brief Build a new C++ throw expression. 2271 /// 2272 /// By default, performs semantic analysis to build the new expression. 2273 /// Subclasses may override this routine to provide different behavior. 2274 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2275 bool IsThrownVariableInScope) { 2276 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2277 } 2278 2279 /// \brief Build a new C++ default-argument expression. 2280 /// 2281 /// By default, builds a new default-argument expression, which does not 2282 /// require any semantic analysis. Subclasses may override this routine to 2283 /// provide different behavior. 2284 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2285 ParmVarDecl *Param) { 2286 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2287 } 2288 2289 /// \brief Build a new C++11 default-initialization expression. 2290 /// 2291 /// By default, builds a new default field initialization expression, which 2292 /// does not require any semantic analysis. Subclasses may override this 2293 /// routine to provide different behavior. 2294 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2295 FieldDecl *Field) { 2296 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2297 } 2298 2299 /// \brief Build a new C++ zero-initialization expression. 2300 /// 2301 /// By default, performs semantic analysis to build the new expression. 2302 /// Subclasses may override this routine to provide different behavior. 2303 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2304 SourceLocation LParenLoc, 2305 SourceLocation RParenLoc) { 2306 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 2307 None, RParenLoc); 2308 } 2309 2310 /// \brief Build a new C++ "new" expression. 2311 /// 2312 /// By default, performs semantic analysis to build the new expression. 2313 /// Subclasses may override this routine to provide different behavior. 2314 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2315 bool UseGlobal, 2316 SourceLocation PlacementLParen, 2317 MultiExprArg PlacementArgs, 2318 SourceLocation PlacementRParen, 2319 SourceRange TypeIdParens, 2320 QualType AllocatedType, 2321 TypeSourceInfo *AllocatedTypeInfo, 2322 Expr *ArraySize, 2323 SourceRange DirectInitRange, 2324 Expr *Initializer) { 2325 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2326 PlacementLParen, 2327 PlacementArgs, 2328 PlacementRParen, 2329 TypeIdParens, 2330 AllocatedType, 2331 AllocatedTypeInfo, 2332 ArraySize, 2333 DirectInitRange, 2334 Initializer); 2335 } 2336 2337 /// \brief Build a new C++ "delete" expression. 2338 /// 2339 /// By default, performs semantic analysis to build the new expression. 2340 /// Subclasses may override this routine to provide different behavior. 2341 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2342 bool IsGlobalDelete, 2343 bool IsArrayForm, 2344 Expr *Operand) { 2345 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2346 Operand); 2347 } 2348 2349 /// \brief Build a new type trait expression. 2350 /// 2351 /// By default, performs semantic analysis to build the new expression. 2352 /// Subclasses may override this routine to provide different behavior. 2353 ExprResult RebuildTypeTrait(TypeTrait Trait, 2354 SourceLocation StartLoc, 2355 ArrayRef<TypeSourceInfo *> Args, 2356 SourceLocation RParenLoc) { 2357 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2358 } 2359 2360 /// \brief Build a new array type trait expression. 2361 /// 2362 /// By default, performs semantic analysis to build the new expression. 2363 /// Subclasses may override this routine to provide different behavior. 2364 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2365 SourceLocation StartLoc, 2366 TypeSourceInfo *TSInfo, 2367 Expr *DimExpr, 2368 SourceLocation RParenLoc) { 2369 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2370 } 2371 2372 /// \brief Build a new expression trait expression. 2373 /// 2374 /// By default, performs semantic analysis to build the new expression. 2375 /// Subclasses may override this routine to provide different behavior. 2376 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2377 SourceLocation StartLoc, 2378 Expr *Queried, 2379 SourceLocation RParenLoc) { 2380 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2381 } 2382 2383 /// \brief Build a new (previously unresolved) declaration reference 2384 /// expression. 2385 /// 2386 /// By default, performs semantic analysis to build the new expression. 2387 /// Subclasses may override this routine to provide different behavior. 2388 ExprResult RebuildDependentScopeDeclRefExpr( 2389 NestedNameSpecifierLoc QualifierLoc, 2390 SourceLocation TemplateKWLoc, 2391 const DeclarationNameInfo &NameInfo, 2392 const TemplateArgumentListInfo *TemplateArgs, 2393 bool IsAddressOfOperand, 2394 TypeSourceInfo **RecoveryTSI) { 2395 CXXScopeSpec SS; 2396 SS.Adopt(QualifierLoc); 2397 2398 if (TemplateArgs || TemplateKWLoc.isValid()) 2399 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2400 TemplateArgs); 2401 2402 return getSema().BuildQualifiedDeclarationNameExpr( 2403 SS, NameInfo, IsAddressOfOperand, RecoveryTSI); 2404 } 2405 2406 /// \brief Build a new template-id expression. 2407 /// 2408 /// By default, performs semantic analysis to build the new expression. 2409 /// Subclasses may override this routine to provide different behavior. 2410 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2411 SourceLocation TemplateKWLoc, 2412 LookupResult &R, 2413 bool RequiresADL, 2414 const TemplateArgumentListInfo *TemplateArgs) { 2415 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2416 TemplateArgs); 2417 } 2418 2419 /// \brief Build a new object-construction expression. 2420 /// 2421 /// By default, performs semantic analysis to build the new expression. 2422 /// Subclasses may override this routine to provide different behavior. 2423 ExprResult RebuildCXXConstructExpr(QualType T, 2424 SourceLocation Loc, 2425 CXXConstructorDecl *Constructor, 2426 bool IsElidable, 2427 MultiExprArg Args, 2428 bool HadMultipleCandidates, 2429 bool ListInitialization, 2430 bool StdInitListInitialization, 2431 bool RequiresZeroInit, 2432 CXXConstructExpr::ConstructionKind ConstructKind, 2433 SourceRange ParenRange) { 2434 SmallVector<Expr*, 8> ConvertedArgs; 2435 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2436 ConvertedArgs)) 2437 return ExprError(); 2438 2439 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 2440 ConvertedArgs, 2441 HadMultipleCandidates, 2442 ListInitialization, 2443 StdInitListInitialization, 2444 RequiresZeroInit, ConstructKind, 2445 ParenRange); 2446 } 2447 2448 /// \brief Build a new object-construction expression. 2449 /// 2450 /// By default, performs semantic analysis to build the new expression. 2451 /// Subclasses may override this routine to provide different behavior. 2452 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2453 SourceLocation LParenLoc, 2454 MultiExprArg Args, 2455 SourceLocation RParenLoc) { 2456 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2457 LParenLoc, 2458 Args, 2459 RParenLoc); 2460 } 2461 2462 /// \brief Build a new object-construction expression. 2463 /// 2464 /// By default, performs semantic analysis to build the new expression. 2465 /// Subclasses may override this routine to provide different behavior. 2466 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2467 SourceLocation LParenLoc, 2468 MultiExprArg Args, 2469 SourceLocation RParenLoc) { 2470 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2471 LParenLoc, 2472 Args, 2473 RParenLoc); 2474 } 2475 2476 /// \brief Build a new member reference expression. 2477 /// 2478 /// By default, performs semantic analysis to build the new expression. 2479 /// Subclasses may override this routine to provide different behavior. 2480 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2481 QualType BaseType, 2482 bool IsArrow, 2483 SourceLocation OperatorLoc, 2484 NestedNameSpecifierLoc QualifierLoc, 2485 SourceLocation TemplateKWLoc, 2486 NamedDecl *FirstQualifierInScope, 2487 const DeclarationNameInfo &MemberNameInfo, 2488 const TemplateArgumentListInfo *TemplateArgs) { 2489 CXXScopeSpec SS; 2490 SS.Adopt(QualifierLoc); 2491 2492 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2493 OperatorLoc, IsArrow, 2494 SS, TemplateKWLoc, 2495 FirstQualifierInScope, 2496 MemberNameInfo, 2497 TemplateArgs); 2498 } 2499 2500 /// \brief Build a new member reference expression. 2501 /// 2502 /// By default, performs semantic analysis to build the new expression. 2503 /// Subclasses may override this routine to provide different behavior. 2504 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2505 SourceLocation OperatorLoc, 2506 bool IsArrow, 2507 NestedNameSpecifierLoc QualifierLoc, 2508 SourceLocation TemplateKWLoc, 2509 NamedDecl *FirstQualifierInScope, 2510 LookupResult &R, 2511 const TemplateArgumentListInfo *TemplateArgs) { 2512 CXXScopeSpec SS; 2513 SS.Adopt(QualifierLoc); 2514 2515 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2516 OperatorLoc, IsArrow, 2517 SS, TemplateKWLoc, 2518 FirstQualifierInScope, 2519 R, TemplateArgs); 2520 } 2521 2522 /// \brief Build a new noexcept expression. 2523 /// 2524 /// By default, performs semantic analysis to build the new expression. 2525 /// Subclasses may override this routine to provide different behavior. 2526 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2527 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2528 } 2529 2530 /// \brief Build a new expression to compute the length of a parameter pack. 2531 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 2532 SourceLocation PackLoc, 2533 SourceLocation RParenLoc, 2534 Optional<unsigned> Length) { 2535 if (Length) 2536 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2537 OperatorLoc, Pack, PackLoc, 2538 RParenLoc, *Length); 2539 2540 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2541 OperatorLoc, Pack, PackLoc, 2542 RParenLoc); 2543 } 2544 2545 /// \brief Build a new Objective-C boxed expression. 2546 /// 2547 /// By default, performs semantic analysis to build the new expression. 2548 /// Subclasses may override this routine to provide different behavior. 2549 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2550 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2551 } 2552 2553 /// \brief Build a new Objective-C array literal. 2554 /// 2555 /// By default, performs semantic analysis to build the new expression. 2556 /// Subclasses may override this routine to provide different behavior. 2557 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2558 Expr **Elements, unsigned NumElements) { 2559 return getSema().BuildObjCArrayLiteral(Range, 2560 MultiExprArg(Elements, NumElements)); 2561 } 2562 2563 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2564 Expr *Base, Expr *Key, 2565 ObjCMethodDecl *getterMethod, 2566 ObjCMethodDecl *setterMethod) { 2567 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2568 getterMethod, setterMethod); 2569 } 2570 2571 /// \brief Build a new Objective-C dictionary literal. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2576 ObjCDictionaryElement *Elements, 2577 unsigned NumElements) { 2578 return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements); 2579 } 2580 2581 /// \brief Build a new Objective-C \@encode expression. 2582 /// 2583 /// By default, performs semantic analysis to build the new expression. 2584 /// Subclasses may override this routine to provide different behavior. 2585 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2586 TypeSourceInfo *EncodeTypeInfo, 2587 SourceLocation RParenLoc) { 2588 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2589 } 2590 2591 /// \brief Build a new Objective-C class message. 2592 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2593 Selector Sel, 2594 ArrayRef<SourceLocation> SelectorLocs, 2595 ObjCMethodDecl *Method, 2596 SourceLocation LBracLoc, 2597 MultiExprArg Args, 2598 SourceLocation RBracLoc) { 2599 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2600 ReceiverTypeInfo->getType(), 2601 /*SuperLoc=*/SourceLocation(), 2602 Sel, Method, LBracLoc, SelectorLocs, 2603 RBracLoc, Args); 2604 } 2605 2606 /// \brief Build a new Objective-C instance message. 2607 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2608 Selector Sel, 2609 ArrayRef<SourceLocation> SelectorLocs, 2610 ObjCMethodDecl *Method, 2611 SourceLocation LBracLoc, 2612 MultiExprArg Args, 2613 SourceLocation RBracLoc) { 2614 return SemaRef.BuildInstanceMessage(Receiver, 2615 Receiver->getType(), 2616 /*SuperLoc=*/SourceLocation(), 2617 Sel, Method, LBracLoc, SelectorLocs, 2618 RBracLoc, Args); 2619 } 2620 2621 /// \brief Build a new Objective-C instance/class message to 'super'. 2622 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 2623 Selector Sel, 2624 ArrayRef<SourceLocation> SelectorLocs, 2625 ObjCMethodDecl *Method, 2626 SourceLocation LBracLoc, 2627 MultiExprArg Args, 2628 SourceLocation RBracLoc) { 2629 ObjCInterfaceDecl *Class = Method->getClassInterface(); 2630 QualType ReceiverTy = SemaRef.Context.getObjCInterfaceType(Class); 2631 2632 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 2633 ReceiverTy, 2634 SuperLoc, 2635 Sel, Method, LBracLoc, SelectorLocs, 2636 RBracLoc, Args) 2637 : SemaRef.BuildClassMessage(nullptr, 2638 ReceiverTy, 2639 SuperLoc, 2640 Sel, Method, LBracLoc, SelectorLocs, 2641 RBracLoc, Args); 2642 2643 2644 } 2645 2646 /// \brief Build a new Objective-C ivar reference expression. 2647 /// 2648 /// By default, performs semantic analysis to build the new expression. 2649 /// Subclasses may override this routine to provide different behavior. 2650 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 2651 SourceLocation IvarLoc, 2652 bool IsArrow, bool IsFreeIvar) { 2653 // FIXME: We lose track of the IsFreeIvar bit. 2654 CXXScopeSpec SS; 2655 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 2656 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2657 /*FIXME:*/IvarLoc, IsArrow, 2658 SS, SourceLocation(), 2659 /*FirstQualifierInScope=*/nullptr, 2660 NameInfo, 2661 /*TemplateArgs=*/nullptr); 2662 } 2663 2664 /// \brief Build a new Objective-C property reference expression. 2665 /// 2666 /// By default, performs semantic analysis to build the new expression. 2667 /// Subclasses may override this routine to provide different behavior. 2668 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 2669 ObjCPropertyDecl *Property, 2670 SourceLocation PropertyLoc) { 2671 CXXScopeSpec SS; 2672 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 2673 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2674 /*FIXME:*/PropertyLoc, 2675 /*IsArrow=*/false, 2676 SS, SourceLocation(), 2677 /*FirstQualifierInScope=*/nullptr, 2678 NameInfo, 2679 /*TemplateArgs=*/nullptr); 2680 } 2681 2682 /// \brief Build a new Objective-C property reference expression. 2683 /// 2684 /// By default, performs semantic analysis to build the new expression. 2685 /// Subclasses may override this routine to provide different behavior. 2686 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 2687 ObjCMethodDecl *Getter, 2688 ObjCMethodDecl *Setter, 2689 SourceLocation PropertyLoc) { 2690 // Since these expressions can only be value-dependent, we do not 2691 // need to perform semantic analysis again. 2692 return Owned( 2693 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 2694 VK_LValue, OK_ObjCProperty, 2695 PropertyLoc, Base)); 2696 } 2697 2698 /// \brief Build a new Objective-C "isa" expression. 2699 /// 2700 /// By default, performs semantic analysis to build the new expression. 2701 /// Subclasses may override this routine to provide different behavior. 2702 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 2703 SourceLocation OpLoc, bool IsArrow) { 2704 CXXScopeSpec SS; 2705 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 2706 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 2707 OpLoc, IsArrow, 2708 SS, SourceLocation(), 2709 /*FirstQualifierInScope=*/nullptr, 2710 NameInfo, 2711 /*TemplateArgs=*/nullptr); 2712 } 2713 2714 /// \brief Build a new shuffle vector expression. 2715 /// 2716 /// By default, performs semantic analysis to build the new expression. 2717 /// Subclasses may override this routine to provide different behavior. 2718 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 2719 MultiExprArg SubExprs, 2720 SourceLocation RParenLoc) { 2721 // Find the declaration for __builtin_shufflevector 2722 const IdentifierInfo &Name 2723 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 2724 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 2725 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 2726 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 2727 2728 // Build a reference to the __builtin_shufflevector builtin 2729 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 2730 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 2731 SemaRef.Context.BuiltinFnTy, 2732 VK_RValue, BuiltinLoc); 2733 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 2734 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 2735 CK_BuiltinFnToFnPtr).get(); 2736 2737 // Build the CallExpr 2738 ExprResult TheCall = new (SemaRef.Context) CallExpr( 2739 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 2740 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 2741 2742 // Type-check the __builtin_shufflevector expression. 2743 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 2744 } 2745 2746 /// \brief Build a new convert vector expression. 2747 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 2748 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 2749 SourceLocation RParenLoc) { 2750 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 2751 BuiltinLoc, RParenLoc); 2752 } 2753 2754 /// \brief Build a new template argument pack expansion. 2755 /// 2756 /// By default, performs semantic analysis to build a new pack expansion 2757 /// for a template argument. Subclasses may override this routine to provide 2758 /// different behavior. 2759 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 2760 SourceLocation EllipsisLoc, 2761 Optional<unsigned> NumExpansions) { 2762 switch (Pattern.getArgument().getKind()) { 2763 case TemplateArgument::Expression: { 2764 ExprResult Result 2765 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 2766 EllipsisLoc, NumExpansions); 2767 if (Result.isInvalid()) 2768 return TemplateArgumentLoc(); 2769 2770 return TemplateArgumentLoc(Result.get(), Result.get()); 2771 } 2772 2773 case TemplateArgument::Template: 2774 return TemplateArgumentLoc(TemplateArgument( 2775 Pattern.getArgument().getAsTemplate(), 2776 NumExpansions), 2777 Pattern.getTemplateQualifierLoc(), 2778 Pattern.getTemplateNameLoc(), 2779 EllipsisLoc); 2780 2781 case TemplateArgument::Null: 2782 case TemplateArgument::Integral: 2783 case TemplateArgument::Declaration: 2784 case TemplateArgument::Pack: 2785 case TemplateArgument::TemplateExpansion: 2786 case TemplateArgument::NullPtr: 2787 llvm_unreachable("Pack expansion pattern has no parameter packs"); 2788 2789 case TemplateArgument::Type: 2790 if (TypeSourceInfo *Expansion 2791 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 2792 EllipsisLoc, 2793 NumExpansions)) 2794 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 2795 Expansion); 2796 break; 2797 } 2798 2799 return TemplateArgumentLoc(); 2800 } 2801 2802 /// \brief Build a new expression pack expansion. 2803 /// 2804 /// By default, performs semantic analysis to build a new pack expansion 2805 /// for an expression. Subclasses may override this routine to provide 2806 /// different behavior. 2807 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 2808 Optional<unsigned> NumExpansions) { 2809 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 2810 } 2811 2812 /// \brief Build a new C++1z fold-expression. 2813 /// 2814 /// By default, performs semantic analysis in order to build a new fold 2815 /// expression. 2816 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 2817 BinaryOperatorKind Operator, 2818 SourceLocation EllipsisLoc, Expr *RHS, 2819 SourceLocation RParenLoc) { 2820 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 2821 RHS, RParenLoc); 2822 } 2823 2824 /// \brief Build an empty C++1z fold-expression with the given operator. 2825 /// 2826 /// By default, produces the fallback value for the fold-expression, or 2827 /// produce an error if there is no fallback value. 2828 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 2829 BinaryOperatorKind Operator) { 2830 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 2831 } 2832 2833 /// \brief Build a new atomic operation expression. 2834 /// 2835 /// By default, performs semantic analysis to build the new expression. 2836 /// Subclasses may override this routine to provide different behavior. 2837 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 2838 MultiExprArg SubExprs, 2839 QualType RetTy, 2840 AtomicExpr::AtomicOp Op, 2841 SourceLocation RParenLoc) { 2842 // Just create the expression; there is not any interesting semantic 2843 // analysis here because we can't actually build an AtomicExpr until 2844 // we are sure it is semantically sound. 2845 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 2846 RParenLoc); 2847 } 2848 2849 private: 2850 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 2851 QualType ObjectType, 2852 NamedDecl *FirstQualifierInScope, 2853 CXXScopeSpec &SS); 2854 2855 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 2856 QualType ObjectType, 2857 NamedDecl *FirstQualifierInScope, 2858 CXXScopeSpec &SS); 2859 2860 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 2861 NamedDecl *FirstQualifierInScope, 2862 CXXScopeSpec &SS); 2863 }; 2864 2865 template<typename Derived> 2866 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 2867 if (!S) 2868 return S; 2869 2870 switch (S->getStmtClass()) { 2871 case Stmt::NoStmtClass: break; 2872 2873 // Transform individual statement nodes 2874 #define STMT(Node, Parent) \ 2875 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 2876 #define ABSTRACT_STMT(Node) 2877 #define EXPR(Node, Parent) 2878 #include "clang/AST/StmtNodes.inc" 2879 2880 // Transform expressions by calling TransformExpr. 2881 #define STMT(Node, Parent) 2882 #define ABSTRACT_STMT(Stmt) 2883 #define EXPR(Node, Parent) case Stmt::Node##Class: 2884 #include "clang/AST/StmtNodes.inc" 2885 { 2886 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 2887 if (E.isInvalid()) 2888 return StmtError(); 2889 2890 return getSema().ActOnExprStmt(E); 2891 } 2892 } 2893 2894 return S; 2895 } 2896 2897 template<typename Derived> 2898 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 2899 if (!S) 2900 return S; 2901 2902 switch (S->getClauseKind()) { 2903 default: break; 2904 // Transform individual clause nodes 2905 #define OPENMP_CLAUSE(Name, Class) \ 2906 case OMPC_ ## Name : \ 2907 return getDerived().Transform ## Class(cast<Class>(S)); 2908 #include "clang/Basic/OpenMPKinds.def" 2909 } 2910 2911 return S; 2912 } 2913 2914 2915 template<typename Derived> 2916 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 2917 if (!E) 2918 return E; 2919 2920 switch (E->getStmtClass()) { 2921 case Stmt::NoStmtClass: break; 2922 #define STMT(Node, Parent) case Stmt::Node##Class: break; 2923 #define ABSTRACT_STMT(Stmt) 2924 #define EXPR(Node, Parent) \ 2925 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 2926 #include "clang/AST/StmtNodes.inc" 2927 } 2928 2929 return E; 2930 } 2931 2932 template<typename Derived> 2933 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 2934 bool NotCopyInit) { 2935 // Initializers are instantiated like expressions, except that various outer 2936 // layers are stripped. 2937 if (!Init) 2938 return Init; 2939 2940 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 2941 Init = ExprTemp->getSubExpr(); 2942 2943 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 2944 Init = MTE->GetTemporaryExpr(); 2945 2946 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 2947 Init = Binder->getSubExpr(); 2948 2949 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 2950 Init = ICE->getSubExprAsWritten(); 2951 2952 if (CXXStdInitializerListExpr *ILE = 2953 dyn_cast<CXXStdInitializerListExpr>(Init)) 2954 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 2955 2956 // If this is copy-initialization, we only need to reconstruct 2957 // InitListExprs. Other forms of copy-initialization will be a no-op if 2958 // the initializer is already the right type. 2959 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 2960 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 2961 return getDerived().TransformExpr(Init); 2962 2963 // Revert value-initialization back to empty parens. 2964 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 2965 SourceRange Parens = VIE->getSourceRange(); 2966 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 2967 Parens.getEnd()); 2968 } 2969 2970 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 2971 if (isa<ImplicitValueInitExpr>(Init)) 2972 return getDerived().RebuildParenListExpr(SourceLocation(), None, 2973 SourceLocation()); 2974 2975 // Revert initialization by constructor back to a parenthesized or braced list 2976 // of expressions. Any other form of initializer can just be reused directly. 2977 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 2978 return getDerived().TransformExpr(Init); 2979 2980 // If the initialization implicitly converted an initializer list to a 2981 // std::initializer_list object, unwrap the std::initializer_list too. 2982 if (Construct && Construct->isStdInitListInitialization()) 2983 return TransformInitializer(Construct->getArg(0), NotCopyInit); 2984 2985 SmallVector<Expr*, 8> NewArgs; 2986 bool ArgChanged = false; 2987 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 2988 /*IsCall*/true, NewArgs, &ArgChanged)) 2989 return ExprError(); 2990 2991 // If this was list initialization, revert to list form. 2992 if (Construct->isListInitialization()) 2993 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 2994 Construct->getLocEnd(), 2995 Construct->getType()); 2996 2997 // Build a ParenListExpr to represent anything else. 2998 SourceRange Parens = Construct->getParenOrBraceRange(); 2999 if (Parens.isInvalid()) { 3000 // This was a variable declaration's initialization for which no initializer 3001 // was specified. 3002 assert(NewArgs.empty() && 3003 "no parens or braces but have direct init with arguments?"); 3004 return ExprEmpty(); 3005 } 3006 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3007 Parens.getEnd()); 3008 } 3009 3010 template<typename Derived> 3011 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 3012 unsigned NumInputs, 3013 bool IsCall, 3014 SmallVectorImpl<Expr *> &Outputs, 3015 bool *ArgChanged) { 3016 for (unsigned I = 0; I != NumInputs; ++I) { 3017 // If requested, drop call arguments that need to be dropped. 3018 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3019 if (ArgChanged) 3020 *ArgChanged = true; 3021 3022 break; 3023 } 3024 3025 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3026 Expr *Pattern = Expansion->getPattern(); 3027 3028 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3029 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3030 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3031 3032 // Determine whether the set of unexpanded parameter packs can and should 3033 // be expanded. 3034 bool Expand = true; 3035 bool RetainExpansion = false; 3036 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3037 Optional<unsigned> NumExpansions = OrigNumExpansions; 3038 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3039 Pattern->getSourceRange(), 3040 Unexpanded, 3041 Expand, RetainExpansion, 3042 NumExpansions)) 3043 return true; 3044 3045 if (!Expand) { 3046 // The transform has determined that we should perform a simple 3047 // transformation on the pack expansion, producing another pack 3048 // expansion. 3049 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3050 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3051 if (OutPattern.isInvalid()) 3052 return true; 3053 3054 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3055 Expansion->getEllipsisLoc(), 3056 NumExpansions); 3057 if (Out.isInvalid()) 3058 return true; 3059 3060 if (ArgChanged) 3061 *ArgChanged = true; 3062 Outputs.push_back(Out.get()); 3063 continue; 3064 } 3065 3066 // Record right away that the argument was changed. This needs 3067 // to happen even if the array expands to nothing. 3068 if (ArgChanged) *ArgChanged = true; 3069 3070 // The transform has determined that we should perform an elementwise 3071 // expansion of the pattern. Do so. 3072 for (unsigned I = 0; I != *NumExpansions; ++I) { 3073 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3074 ExprResult Out = getDerived().TransformExpr(Pattern); 3075 if (Out.isInvalid()) 3076 return true; 3077 3078 // FIXME: Can this happen? We should not try to expand the pack 3079 // in this case. 3080 if (Out.get()->containsUnexpandedParameterPack()) { 3081 Out = getDerived().RebuildPackExpansion( 3082 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3083 if (Out.isInvalid()) 3084 return true; 3085 } 3086 3087 Outputs.push_back(Out.get()); 3088 } 3089 3090 // If we're supposed to retain a pack expansion, do so by temporarily 3091 // forgetting the partially-substituted parameter pack. 3092 if (RetainExpansion) { 3093 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3094 3095 ExprResult Out = getDerived().TransformExpr(Pattern); 3096 if (Out.isInvalid()) 3097 return true; 3098 3099 Out = getDerived().RebuildPackExpansion( 3100 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3101 if (Out.isInvalid()) 3102 return true; 3103 3104 Outputs.push_back(Out.get()); 3105 } 3106 3107 continue; 3108 } 3109 3110 ExprResult Result = 3111 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3112 : getDerived().TransformExpr(Inputs[I]); 3113 if (Result.isInvalid()) 3114 return true; 3115 3116 if (Result.get() != Inputs[I] && ArgChanged) 3117 *ArgChanged = true; 3118 3119 Outputs.push_back(Result.get()); 3120 } 3121 3122 return false; 3123 } 3124 3125 template<typename Derived> 3126 NestedNameSpecifierLoc 3127 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3128 NestedNameSpecifierLoc NNS, 3129 QualType ObjectType, 3130 NamedDecl *FirstQualifierInScope) { 3131 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3132 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3133 Qualifier = Qualifier.getPrefix()) 3134 Qualifiers.push_back(Qualifier); 3135 3136 CXXScopeSpec SS; 3137 while (!Qualifiers.empty()) { 3138 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3139 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3140 3141 switch (QNNS->getKind()) { 3142 case NestedNameSpecifier::Identifier: 3143 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, 3144 *QNNS->getAsIdentifier(), 3145 Q.getLocalBeginLoc(), 3146 Q.getLocalEndLoc(), 3147 ObjectType, false, SS, 3148 FirstQualifierInScope, false)) 3149 return NestedNameSpecifierLoc(); 3150 3151 break; 3152 3153 case NestedNameSpecifier::Namespace: { 3154 NamespaceDecl *NS 3155 = cast_or_null<NamespaceDecl>( 3156 getDerived().TransformDecl( 3157 Q.getLocalBeginLoc(), 3158 QNNS->getAsNamespace())); 3159 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3160 break; 3161 } 3162 3163 case NestedNameSpecifier::NamespaceAlias: { 3164 NamespaceAliasDecl *Alias 3165 = cast_or_null<NamespaceAliasDecl>( 3166 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3167 QNNS->getAsNamespaceAlias())); 3168 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3169 Q.getLocalEndLoc()); 3170 break; 3171 } 3172 3173 case NestedNameSpecifier::Global: 3174 // There is no meaningful transformation that one could perform on the 3175 // global scope. 3176 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3177 break; 3178 3179 case NestedNameSpecifier::Super: { 3180 CXXRecordDecl *RD = 3181 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3182 SourceLocation(), QNNS->getAsRecordDecl())); 3183 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3184 break; 3185 } 3186 3187 case NestedNameSpecifier::TypeSpecWithTemplate: 3188 case NestedNameSpecifier::TypeSpec: { 3189 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3190 FirstQualifierInScope, SS); 3191 3192 if (!TL) 3193 return NestedNameSpecifierLoc(); 3194 3195 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3196 (SemaRef.getLangOpts().CPlusPlus11 && 3197 TL.getType()->isEnumeralType())) { 3198 assert(!TL.getType().hasLocalQualifiers() && 3199 "Can't get cv-qualifiers here"); 3200 if (TL.getType()->isEnumeralType()) 3201 SemaRef.Diag(TL.getBeginLoc(), 3202 diag::warn_cxx98_compat_enum_nested_name_spec); 3203 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3204 Q.getLocalEndLoc()); 3205 break; 3206 } 3207 // If the nested-name-specifier is an invalid type def, don't emit an 3208 // error because a previous error should have already been emitted. 3209 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3210 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3211 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3212 << TL.getType() << SS.getRange(); 3213 } 3214 return NestedNameSpecifierLoc(); 3215 } 3216 } 3217 3218 // The qualifier-in-scope and object type only apply to the leftmost entity. 3219 FirstQualifierInScope = nullptr; 3220 ObjectType = QualType(); 3221 } 3222 3223 // Don't rebuild the nested-name-specifier if we don't have to. 3224 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3225 !getDerived().AlwaysRebuild()) 3226 return NNS; 3227 3228 // If we can re-use the source-location data from the original 3229 // nested-name-specifier, do so. 3230 if (SS.location_size() == NNS.getDataLength() && 3231 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3232 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3233 3234 // Allocate new nested-name-specifier location information. 3235 return SS.getWithLocInContext(SemaRef.Context); 3236 } 3237 3238 template<typename Derived> 3239 DeclarationNameInfo 3240 TreeTransform<Derived> 3241 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3242 DeclarationName Name = NameInfo.getName(); 3243 if (!Name) 3244 return DeclarationNameInfo(); 3245 3246 switch (Name.getNameKind()) { 3247 case DeclarationName::Identifier: 3248 case DeclarationName::ObjCZeroArgSelector: 3249 case DeclarationName::ObjCOneArgSelector: 3250 case DeclarationName::ObjCMultiArgSelector: 3251 case DeclarationName::CXXOperatorName: 3252 case DeclarationName::CXXLiteralOperatorName: 3253 case DeclarationName::CXXUsingDirective: 3254 return NameInfo; 3255 3256 case DeclarationName::CXXConstructorName: 3257 case DeclarationName::CXXDestructorName: 3258 case DeclarationName::CXXConversionFunctionName: { 3259 TypeSourceInfo *NewTInfo; 3260 CanQualType NewCanTy; 3261 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3262 NewTInfo = getDerived().TransformType(OldTInfo); 3263 if (!NewTInfo) 3264 return DeclarationNameInfo(); 3265 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3266 } 3267 else { 3268 NewTInfo = nullptr; 3269 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3270 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3271 if (NewT.isNull()) 3272 return DeclarationNameInfo(); 3273 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3274 } 3275 3276 DeclarationName NewName 3277 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3278 NewCanTy); 3279 DeclarationNameInfo NewNameInfo(NameInfo); 3280 NewNameInfo.setName(NewName); 3281 NewNameInfo.setNamedTypeInfo(NewTInfo); 3282 return NewNameInfo; 3283 } 3284 } 3285 3286 llvm_unreachable("Unknown name kind."); 3287 } 3288 3289 template<typename Derived> 3290 TemplateName 3291 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3292 TemplateName Name, 3293 SourceLocation NameLoc, 3294 QualType ObjectType, 3295 NamedDecl *FirstQualifierInScope) { 3296 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3297 TemplateDecl *Template = QTN->getTemplateDecl(); 3298 assert(Template && "qualified template name must refer to a template"); 3299 3300 TemplateDecl *TransTemplate 3301 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3302 Template)); 3303 if (!TransTemplate) 3304 return TemplateName(); 3305 3306 if (!getDerived().AlwaysRebuild() && 3307 SS.getScopeRep() == QTN->getQualifier() && 3308 TransTemplate == Template) 3309 return Name; 3310 3311 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3312 TransTemplate); 3313 } 3314 3315 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3316 if (SS.getScopeRep()) { 3317 // These apply to the scope specifier, not the template. 3318 ObjectType = QualType(); 3319 FirstQualifierInScope = nullptr; 3320 } 3321 3322 if (!getDerived().AlwaysRebuild() && 3323 SS.getScopeRep() == DTN->getQualifier() && 3324 ObjectType.isNull()) 3325 return Name; 3326 3327 if (DTN->isIdentifier()) { 3328 return getDerived().RebuildTemplateName(SS, 3329 *DTN->getIdentifier(), 3330 NameLoc, 3331 ObjectType, 3332 FirstQualifierInScope); 3333 } 3334 3335 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 3336 ObjectType); 3337 } 3338 3339 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3340 TemplateDecl *TransTemplate 3341 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3342 Template)); 3343 if (!TransTemplate) 3344 return TemplateName(); 3345 3346 if (!getDerived().AlwaysRebuild() && 3347 TransTemplate == Template) 3348 return Name; 3349 3350 return TemplateName(TransTemplate); 3351 } 3352 3353 if (SubstTemplateTemplateParmPackStorage *SubstPack 3354 = Name.getAsSubstTemplateTemplateParmPack()) { 3355 TemplateTemplateParmDecl *TransParam 3356 = cast_or_null<TemplateTemplateParmDecl>( 3357 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3358 if (!TransParam) 3359 return TemplateName(); 3360 3361 if (!getDerived().AlwaysRebuild() && 3362 TransParam == SubstPack->getParameterPack()) 3363 return Name; 3364 3365 return getDerived().RebuildTemplateName(TransParam, 3366 SubstPack->getArgumentPack()); 3367 } 3368 3369 // These should be getting filtered out before they reach the AST. 3370 llvm_unreachable("overloaded function decl survived to here"); 3371 } 3372 3373 template<typename Derived> 3374 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3375 const TemplateArgument &Arg, 3376 TemplateArgumentLoc &Output) { 3377 SourceLocation Loc = getDerived().getBaseLocation(); 3378 switch (Arg.getKind()) { 3379 case TemplateArgument::Null: 3380 llvm_unreachable("null template argument in TreeTransform"); 3381 break; 3382 3383 case TemplateArgument::Type: 3384 Output = TemplateArgumentLoc(Arg, 3385 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3386 3387 break; 3388 3389 case TemplateArgument::Template: 3390 case TemplateArgument::TemplateExpansion: { 3391 NestedNameSpecifierLocBuilder Builder; 3392 TemplateName Template = Arg.getAsTemplate(); 3393 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3394 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3395 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3396 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3397 3398 if (Arg.getKind() == TemplateArgument::Template) 3399 Output = TemplateArgumentLoc(Arg, 3400 Builder.getWithLocInContext(SemaRef.Context), 3401 Loc); 3402 else 3403 Output = TemplateArgumentLoc(Arg, 3404 Builder.getWithLocInContext(SemaRef.Context), 3405 Loc, Loc); 3406 3407 break; 3408 } 3409 3410 case TemplateArgument::Expression: 3411 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3412 break; 3413 3414 case TemplateArgument::Declaration: 3415 case TemplateArgument::Integral: 3416 case TemplateArgument::Pack: 3417 case TemplateArgument::NullPtr: 3418 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3419 break; 3420 } 3421 } 3422 3423 template<typename Derived> 3424 bool TreeTransform<Derived>::TransformTemplateArgument( 3425 const TemplateArgumentLoc &Input, 3426 TemplateArgumentLoc &Output) { 3427 const TemplateArgument &Arg = Input.getArgument(); 3428 switch (Arg.getKind()) { 3429 case TemplateArgument::Null: 3430 case TemplateArgument::Integral: 3431 case TemplateArgument::Pack: 3432 case TemplateArgument::Declaration: 3433 case TemplateArgument::NullPtr: 3434 llvm_unreachable("Unexpected TemplateArgument"); 3435 3436 case TemplateArgument::Type: { 3437 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3438 if (!DI) 3439 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3440 3441 DI = getDerived().TransformType(DI); 3442 if (!DI) return true; 3443 3444 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3445 return false; 3446 } 3447 3448 case TemplateArgument::Template: { 3449 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3450 if (QualifierLoc) { 3451 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3452 if (!QualifierLoc) 3453 return true; 3454 } 3455 3456 CXXScopeSpec SS; 3457 SS.Adopt(QualifierLoc); 3458 TemplateName Template 3459 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3460 Input.getTemplateNameLoc()); 3461 if (Template.isNull()) 3462 return true; 3463 3464 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3465 Input.getTemplateNameLoc()); 3466 return false; 3467 } 3468 3469 case TemplateArgument::TemplateExpansion: 3470 llvm_unreachable("Caller should expand pack expansions"); 3471 3472 case TemplateArgument::Expression: { 3473 // Template argument expressions are constant expressions. 3474 EnterExpressionEvaluationContext Unevaluated(getSema(), 3475 Sema::ConstantEvaluated); 3476 3477 Expr *InputExpr = Input.getSourceExpression(); 3478 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3479 3480 ExprResult E = getDerived().TransformExpr(InputExpr); 3481 E = SemaRef.ActOnConstantExpression(E); 3482 if (E.isInvalid()) return true; 3483 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3484 return false; 3485 } 3486 } 3487 3488 // Work around bogus GCC warning 3489 return true; 3490 } 3491 3492 /// \brief Iterator adaptor that invents template argument location information 3493 /// for each of the template arguments in its underlying iterator. 3494 template<typename Derived, typename InputIterator> 3495 class TemplateArgumentLocInventIterator { 3496 TreeTransform<Derived> &Self; 3497 InputIterator Iter; 3498 3499 public: 3500 typedef TemplateArgumentLoc value_type; 3501 typedef TemplateArgumentLoc reference; 3502 typedef typename std::iterator_traits<InputIterator>::difference_type 3503 difference_type; 3504 typedef std::input_iterator_tag iterator_category; 3505 3506 class pointer { 3507 TemplateArgumentLoc Arg; 3508 3509 public: 3510 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3511 3512 const TemplateArgumentLoc *operator->() const { return &Arg; } 3513 }; 3514 3515 TemplateArgumentLocInventIterator() { } 3516 3517 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3518 InputIterator Iter) 3519 : Self(Self), Iter(Iter) { } 3520 3521 TemplateArgumentLocInventIterator &operator++() { 3522 ++Iter; 3523 return *this; 3524 } 3525 3526 TemplateArgumentLocInventIterator operator++(int) { 3527 TemplateArgumentLocInventIterator Old(*this); 3528 ++(*this); 3529 return Old; 3530 } 3531 3532 reference operator*() const { 3533 TemplateArgumentLoc Result; 3534 Self.InventTemplateArgumentLoc(*Iter, Result); 3535 return Result; 3536 } 3537 3538 pointer operator->() const { return pointer(**this); } 3539 3540 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3541 const TemplateArgumentLocInventIterator &Y) { 3542 return X.Iter == Y.Iter; 3543 } 3544 3545 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3546 const TemplateArgumentLocInventIterator &Y) { 3547 return X.Iter != Y.Iter; 3548 } 3549 }; 3550 3551 template<typename Derived> 3552 template<typename InputIterator> 3553 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 3554 InputIterator Last, 3555 TemplateArgumentListInfo &Outputs) { 3556 for (; First != Last; ++First) { 3557 TemplateArgumentLoc Out; 3558 TemplateArgumentLoc In = *First; 3559 3560 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3561 // Unpack argument packs, which we translate them into separate 3562 // arguments. 3563 // FIXME: We could do much better if we could guarantee that the 3564 // TemplateArgumentLocInfo for the pack expansion would be usable for 3565 // all of the template arguments in the argument pack. 3566 typedef TemplateArgumentLocInventIterator<Derived, 3567 TemplateArgument::pack_iterator> 3568 PackLocIterator; 3569 if (TransformTemplateArguments(PackLocIterator(*this, 3570 In.getArgument().pack_begin()), 3571 PackLocIterator(*this, 3572 In.getArgument().pack_end()), 3573 Outputs)) 3574 return true; 3575 3576 continue; 3577 } 3578 3579 if (In.getArgument().isPackExpansion()) { 3580 // We have a pack expansion, for which we will be substituting into 3581 // the pattern. 3582 SourceLocation Ellipsis; 3583 Optional<unsigned> OrigNumExpansions; 3584 TemplateArgumentLoc Pattern 3585 = getSema().getTemplateArgumentPackExpansionPattern( 3586 In, Ellipsis, OrigNumExpansions); 3587 3588 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3589 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3590 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3591 3592 // Determine whether the set of unexpanded parameter packs can and should 3593 // be expanded. 3594 bool Expand = true; 3595 bool RetainExpansion = false; 3596 Optional<unsigned> NumExpansions = OrigNumExpansions; 3597 if (getDerived().TryExpandParameterPacks(Ellipsis, 3598 Pattern.getSourceRange(), 3599 Unexpanded, 3600 Expand, 3601 RetainExpansion, 3602 NumExpansions)) 3603 return true; 3604 3605 if (!Expand) { 3606 // The transform has determined that we should perform a simple 3607 // transformation on the pack expansion, producing another pack 3608 // expansion. 3609 TemplateArgumentLoc OutPattern; 3610 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3611 if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 3612 return true; 3613 3614 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 3615 NumExpansions); 3616 if (Out.getArgument().isNull()) 3617 return true; 3618 3619 Outputs.addArgument(Out); 3620 continue; 3621 } 3622 3623 // The transform has determined that we should perform an elementwise 3624 // expansion of the pattern. Do so. 3625 for (unsigned I = 0; I != *NumExpansions; ++I) { 3626 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3627 3628 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3629 return true; 3630 3631 if (Out.getArgument().containsUnexpandedParameterPack()) { 3632 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3633 OrigNumExpansions); 3634 if (Out.getArgument().isNull()) 3635 return true; 3636 } 3637 3638 Outputs.addArgument(Out); 3639 } 3640 3641 // If we're supposed to retain a pack expansion, do so by temporarily 3642 // forgetting the partially-substituted parameter pack. 3643 if (RetainExpansion) { 3644 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3645 3646 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3647 return true; 3648 3649 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3650 OrigNumExpansions); 3651 if (Out.getArgument().isNull()) 3652 return true; 3653 3654 Outputs.addArgument(Out); 3655 } 3656 3657 continue; 3658 } 3659 3660 // The simple case: 3661 if (getDerived().TransformTemplateArgument(In, Out)) 3662 return true; 3663 3664 Outputs.addArgument(Out); 3665 } 3666 3667 return false; 3668 3669 } 3670 3671 //===----------------------------------------------------------------------===// 3672 // Type transformation 3673 //===----------------------------------------------------------------------===// 3674 3675 template<typename Derived> 3676 QualType TreeTransform<Derived>::TransformType(QualType T) { 3677 if (getDerived().AlreadyTransformed(T)) 3678 return T; 3679 3680 // Temporary workaround. All of these transformations should 3681 // eventually turn into transformations on TypeLocs. 3682 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 3683 getDerived().getBaseLocation()); 3684 3685 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 3686 3687 if (!NewDI) 3688 return QualType(); 3689 3690 return NewDI->getType(); 3691 } 3692 3693 template<typename Derived> 3694 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3695 // Refine the base location to the type's location. 3696 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 3697 getDerived().getBaseEntity()); 3698 if (getDerived().AlreadyTransformed(DI->getType())) 3699 return DI; 3700 3701 TypeLocBuilder TLB; 3702 3703 TypeLoc TL = DI->getTypeLoc(); 3704 TLB.reserve(TL.getFullDataSize()); 3705 3706 QualType Result = getDerived().TransformType(TLB, TL); 3707 if (Result.isNull()) 3708 return nullptr; 3709 3710 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3711 } 3712 3713 template<typename Derived> 3714 QualType 3715 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3716 switch (T.getTypeLocClass()) { 3717 #define ABSTRACT_TYPELOC(CLASS, PARENT) 3718 #define TYPELOC(CLASS, PARENT) \ 3719 case TypeLoc::CLASS: \ 3720 return getDerived().Transform##CLASS##Type(TLB, \ 3721 T.castAs<CLASS##TypeLoc>()); 3722 #include "clang/AST/TypeLocNodes.def" 3723 } 3724 3725 llvm_unreachable("unhandled type loc!"); 3726 } 3727 3728 /// FIXME: By default, this routine adds type qualifiers only to types 3729 /// that can have qualifiers, and silently suppresses those qualifiers 3730 /// that are not permitted (e.g., qualifiers on reference or function 3731 /// types). This is the right thing for template instantiation, but 3732 /// probably not for other clients. 3733 template<typename Derived> 3734 QualType 3735 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 3736 QualifiedTypeLoc T) { 3737 Qualifiers Quals = T.getType().getLocalQualifiers(); 3738 3739 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3740 if (Result.isNull()) 3741 return QualType(); 3742 3743 // Silently suppress qualifiers if the result type can't be qualified. 3744 // FIXME: this is the right thing for template instantiation, but 3745 // probably not for other clients. 3746 if (Result->isFunctionType() || Result->isReferenceType()) 3747 return Result; 3748 3749 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 3750 // resulting type. 3751 if (Quals.hasObjCLifetime()) { 3752 if (!Result->isObjCLifetimeType() && !Result->isDependentType()) 3753 Quals.removeObjCLifetime(); 3754 else if (Result.getObjCLifetime()) { 3755 // Objective-C ARC: 3756 // A lifetime qualifier applied to a substituted template parameter 3757 // overrides the lifetime qualifier from the template argument. 3758 const AutoType *AutoTy; 3759 if (const SubstTemplateTypeParmType *SubstTypeParam 3760 = dyn_cast<SubstTemplateTypeParmType>(Result)) { 3761 QualType Replacement = SubstTypeParam->getReplacementType(); 3762 Qualifiers Qs = Replacement.getQualifiers(); 3763 Qs.removeObjCLifetime(); 3764 Replacement 3765 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), 3766 Qs); 3767 Result = SemaRef.Context.getSubstTemplateTypeParmType( 3768 SubstTypeParam->getReplacedParameter(), 3769 Replacement); 3770 TLB.TypeWasModifiedSafely(Result); 3771 } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) { 3772 // 'auto' types behave the same way as template parameters. 3773 QualType Deduced = AutoTy->getDeducedType(); 3774 Qualifiers Qs = Deduced.getQualifiers(); 3775 Qs.removeObjCLifetime(); 3776 Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), 3777 Qs); 3778 Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto(), 3779 AutoTy->isDependentType()); 3780 TLB.TypeWasModifiedSafely(Result); 3781 } else { 3782 // Otherwise, complain about the addition of a qualifier to an 3783 // already-qualified type. 3784 SourceRange R = T.getUnqualifiedLoc().getSourceRange(); 3785 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant) 3786 << Result << R; 3787 3788 Quals.removeObjCLifetime(); 3789 } 3790 } 3791 } 3792 if (!Quals.empty()) { 3793 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 3794 // BuildQualifiedType might not add qualifiers if they are invalid. 3795 if (Result.hasLocalQualifiers()) 3796 TLB.push<QualifiedTypeLoc>(Result); 3797 // No location information to preserve. 3798 } 3799 3800 return Result; 3801 } 3802 3803 template<typename Derived> 3804 TypeLoc 3805 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 3806 QualType ObjectType, 3807 NamedDecl *UnqualLookup, 3808 CXXScopeSpec &SS) { 3809 if (getDerived().AlreadyTransformed(TL.getType())) 3810 return TL; 3811 3812 TypeSourceInfo *TSI = 3813 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 3814 if (TSI) 3815 return TSI->getTypeLoc(); 3816 return TypeLoc(); 3817 } 3818 3819 template<typename Derived> 3820 TypeSourceInfo * 3821 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3822 QualType ObjectType, 3823 NamedDecl *UnqualLookup, 3824 CXXScopeSpec &SS) { 3825 if (getDerived().AlreadyTransformed(TSInfo->getType())) 3826 return TSInfo; 3827 3828 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 3829 UnqualLookup, SS); 3830 } 3831 3832 template <typename Derived> 3833 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 3834 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 3835 CXXScopeSpec &SS) { 3836 QualType T = TL.getType(); 3837 assert(!getDerived().AlreadyTransformed(T)); 3838 3839 TypeLocBuilder TLB; 3840 QualType Result; 3841 3842 if (isa<TemplateSpecializationType>(T)) { 3843 TemplateSpecializationTypeLoc SpecTL = 3844 TL.castAs<TemplateSpecializationTypeLoc>(); 3845 3846 TemplateName Template 3847 = getDerived().TransformTemplateName(SS, 3848 SpecTL.getTypePtr()->getTemplateName(), 3849 SpecTL.getTemplateNameLoc(), 3850 ObjectType, UnqualLookup); 3851 if (Template.isNull()) 3852 return nullptr; 3853 3854 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3855 Template); 3856 } else if (isa<DependentTemplateSpecializationType>(T)) { 3857 DependentTemplateSpecializationTypeLoc SpecTL = 3858 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 3859 3860 TemplateName Template 3861 = getDerived().RebuildTemplateName(SS, 3862 *SpecTL.getTypePtr()->getIdentifier(), 3863 SpecTL.getTemplateNameLoc(), 3864 ObjectType, UnqualLookup); 3865 if (Template.isNull()) 3866 return nullptr; 3867 3868 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3869 SpecTL, 3870 Template, 3871 SS); 3872 } else { 3873 // Nothing special needs to be done for these. 3874 Result = getDerived().TransformType(TLB, TL); 3875 } 3876 3877 if (Result.isNull()) 3878 return nullptr; 3879 3880 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3881 } 3882 3883 template <class TyLoc> static inline 3884 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 3885 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 3886 NewT.setNameLoc(T.getNameLoc()); 3887 return T.getType(); 3888 } 3889 3890 template<typename Derived> 3891 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 3892 BuiltinTypeLoc T) { 3893 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 3894 NewT.setBuiltinLoc(T.getBuiltinLoc()); 3895 if (T.needsExtraLocalData()) 3896 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 3897 return T.getType(); 3898 } 3899 3900 template<typename Derived> 3901 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 3902 ComplexTypeLoc T) { 3903 // FIXME: recurse? 3904 return TransformTypeSpecType(TLB, T); 3905 } 3906 3907 template <typename Derived> 3908 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 3909 AdjustedTypeLoc TL) { 3910 // Adjustments applied during transformation are handled elsewhere. 3911 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 3912 } 3913 3914 template<typename Derived> 3915 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 3916 DecayedTypeLoc TL) { 3917 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 3918 if (OriginalType.isNull()) 3919 return QualType(); 3920 3921 QualType Result = TL.getType(); 3922 if (getDerived().AlwaysRebuild() || 3923 OriginalType != TL.getOriginalLoc().getType()) 3924 Result = SemaRef.Context.getDecayedType(OriginalType); 3925 TLB.push<DecayedTypeLoc>(Result); 3926 // Nothing to set for DecayedTypeLoc. 3927 return Result; 3928 } 3929 3930 template<typename Derived> 3931 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 3932 PointerTypeLoc TL) { 3933 QualType PointeeType 3934 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3935 if (PointeeType.isNull()) 3936 return QualType(); 3937 3938 QualType Result = TL.getType(); 3939 if (PointeeType->getAs<ObjCObjectType>()) { 3940 // A dependent pointer type 'T *' has is being transformed such 3941 // that an Objective-C class type is being replaced for 'T'. The 3942 // resulting pointer type is an ObjCObjectPointerType, not a 3943 // PointerType. 3944 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 3945 3946 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 3947 NewT.setStarLoc(TL.getStarLoc()); 3948 return Result; 3949 } 3950 3951 if (getDerived().AlwaysRebuild() || 3952 PointeeType != TL.getPointeeLoc().getType()) { 3953 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 3954 if (Result.isNull()) 3955 return QualType(); 3956 } 3957 3958 // Objective-C ARC can add lifetime qualifiers to the type that we're 3959 // pointing to. 3960 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 3961 3962 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 3963 NewT.setSigilLoc(TL.getSigilLoc()); 3964 return Result; 3965 } 3966 3967 template<typename Derived> 3968 QualType 3969 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 3970 BlockPointerTypeLoc TL) { 3971 QualType PointeeType 3972 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3973 if (PointeeType.isNull()) 3974 return QualType(); 3975 3976 QualType Result = TL.getType(); 3977 if (getDerived().AlwaysRebuild() || 3978 PointeeType != TL.getPointeeLoc().getType()) { 3979 Result = getDerived().RebuildBlockPointerType(PointeeType, 3980 TL.getSigilLoc()); 3981 if (Result.isNull()) 3982 return QualType(); 3983 } 3984 3985 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 3986 NewT.setSigilLoc(TL.getSigilLoc()); 3987 return Result; 3988 } 3989 3990 /// Transforms a reference type. Note that somewhat paradoxically we 3991 /// don't care whether the type itself is an l-value type or an r-value 3992 /// type; we only care if the type was *written* as an l-value type 3993 /// or an r-value type. 3994 template<typename Derived> 3995 QualType 3996 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 3997 ReferenceTypeLoc TL) { 3998 const ReferenceType *T = TL.getTypePtr(); 3999 4000 // Note that this works with the pointee-as-written. 4001 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4002 if (PointeeType.isNull()) 4003 return QualType(); 4004 4005 QualType Result = TL.getType(); 4006 if (getDerived().AlwaysRebuild() || 4007 PointeeType != T->getPointeeTypeAsWritten()) { 4008 Result = getDerived().RebuildReferenceType(PointeeType, 4009 T->isSpelledAsLValue(), 4010 TL.getSigilLoc()); 4011 if (Result.isNull()) 4012 return QualType(); 4013 } 4014 4015 // Objective-C ARC can add lifetime qualifiers to the type that we're 4016 // referring to. 4017 TLB.TypeWasModifiedSafely( 4018 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4019 4020 // r-value references can be rebuilt as l-value references. 4021 ReferenceTypeLoc NewTL; 4022 if (isa<LValueReferenceType>(Result)) 4023 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4024 else 4025 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4026 NewTL.setSigilLoc(TL.getSigilLoc()); 4027 4028 return Result; 4029 } 4030 4031 template<typename Derived> 4032 QualType 4033 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4034 LValueReferenceTypeLoc TL) { 4035 return TransformReferenceType(TLB, TL); 4036 } 4037 4038 template<typename Derived> 4039 QualType 4040 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4041 RValueReferenceTypeLoc TL) { 4042 return TransformReferenceType(TLB, TL); 4043 } 4044 4045 template<typename Derived> 4046 QualType 4047 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4048 MemberPointerTypeLoc TL) { 4049 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4050 if (PointeeType.isNull()) 4051 return QualType(); 4052 4053 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4054 TypeSourceInfo *NewClsTInfo = nullptr; 4055 if (OldClsTInfo) { 4056 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4057 if (!NewClsTInfo) 4058 return QualType(); 4059 } 4060 4061 const MemberPointerType *T = TL.getTypePtr(); 4062 QualType OldClsType = QualType(T->getClass(), 0); 4063 QualType NewClsType; 4064 if (NewClsTInfo) 4065 NewClsType = NewClsTInfo->getType(); 4066 else { 4067 NewClsType = getDerived().TransformType(OldClsType); 4068 if (NewClsType.isNull()) 4069 return QualType(); 4070 } 4071 4072 QualType Result = TL.getType(); 4073 if (getDerived().AlwaysRebuild() || 4074 PointeeType != T->getPointeeType() || 4075 NewClsType != OldClsType) { 4076 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4077 TL.getStarLoc()); 4078 if (Result.isNull()) 4079 return QualType(); 4080 } 4081 4082 // If we had to adjust the pointee type when building a member pointer, make 4083 // sure to push TypeLoc info for it. 4084 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4085 if (MPT && PointeeType != MPT->getPointeeType()) { 4086 assert(isa<AdjustedType>(MPT->getPointeeType())); 4087 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4088 } 4089 4090 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4091 NewTL.setSigilLoc(TL.getSigilLoc()); 4092 NewTL.setClassTInfo(NewClsTInfo); 4093 4094 return Result; 4095 } 4096 4097 template<typename Derived> 4098 QualType 4099 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4100 ConstantArrayTypeLoc TL) { 4101 const ConstantArrayType *T = TL.getTypePtr(); 4102 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4103 if (ElementType.isNull()) 4104 return QualType(); 4105 4106 QualType Result = TL.getType(); 4107 if (getDerived().AlwaysRebuild() || 4108 ElementType != T->getElementType()) { 4109 Result = getDerived().RebuildConstantArrayType(ElementType, 4110 T->getSizeModifier(), 4111 T->getSize(), 4112 T->getIndexTypeCVRQualifiers(), 4113 TL.getBracketsRange()); 4114 if (Result.isNull()) 4115 return QualType(); 4116 } 4117 4118 // We might have either a ConstantArrayType or a VariableArrayType now: 4119 // a ConstantArrayType is allowed to have an element type which is a 4120 // VariableArrayType if the type is dependent. Fortunately, all array 4121 // types have the same location layout. 4122 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4123 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4124 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4125 4126 Expr *Size = TL.getSizeExpr(); 4127 if (Size) { 4128 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4129 Sema::ConstantEvaluated); 4130 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4131 Size = SemaRef.ActOnConstantExpression(Size).get(); 4132 } 4133 NewTL.setSizeExpr(Size); 4134 4135 return Result; 4136 } 4137 4138 template<typename Derived> 4139 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4140 TypeLocBuilder &TLB, 4141 IncompleteArrayTypeLoc TL) { 4142 const IncompleteArrayType *T = TL.getTypePtr(); 4143 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4144 if (ElementType.isNull()) 4145 return QualType(); 4146 4147 QualType Result = TL.getType(); 4148 if (getDerived().AlwaysRebuild() || 4149 ElementType != T->getElementType()) { 4150 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4151 T->getSizeModifier(), 4152 T->getIndexTypeCVRQualifiers(), 4153 TL.getBracketsRange()); 4154 if (Result.isNull()) 4155 return QualType(); 4156 } 4157 4158 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4159 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4160 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4161 NewTL.setSizeExpr(nullptr); 4162 4163 return Result; 4164 } 4165 4166 template<typename Derived> 4167 QualType 4168 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4169 VariableArrayTypeLoc TL) { 4170 const VariableArrayType *T = TL.getTypePtr(); 4171 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4172 if (ElementType.isNull()) 4173 return QualType(); 4174 4175 ExprResult SizeResult 4176 = getDerived().TransformExpr(T->getSizeExpr()); 4177 if (SizeResult.isInvalid()) 4178 return QualType(); 4179 4180 Expr *Size = SizeResult.get(); 4181 4182 QualType Result = TL.getType(); 4183 if (getDerived().AlwaysRebuild() || 4184 ElementType != T->getElementType() || 4185 Size != T->getSizeExpr()) { 4186 Result = getDerived().RebuildVariableArrayType(ElementType, 4187 T->getSizeModifier(), 4188 Size, 4189 T->getIndexTypeCVRQualifiers(), 4190 TL.getBracketsRange()); 4191 if (Result.isNull()) 4192 return QualType(); 4193 } 4194 4195 // We might have constant size array now, but fortunately it has the same 4196 // location layout. 4197 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4198 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4199 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4200 NewTL.setSizeExpr(Size); 4201 4202 return Result; 4203 } 4204 4205 template<typename Derived> 4206 QualType 4207 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4208 DependentSizedArrayTypeLoc TL) { 4209 const DependentSizedArrayType *T = TL.getTypePtr(); 4210 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4211 if (ElementType.isNull()) 4212 return QualType(); 4213 4214 // Array bounds are constant expressions. 4215 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4216 Sema::ConstantEvaluated); 4217 4218 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4219 Expr *origSize = TL.getSizeExpr(); 4220 if (!origSize) origSize = T->getSizeExpr(); 4221 4222 ExprResult sizeResult 4223 = getDerived().TransformExpr(origSize); 4224 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4225 if (sizeResult.isInvalid()) 4226 return QualType(); 4227 4228 Expr *size = sizeResult.get(); 4229 4230 QualType Result = TL.getType(); 4231 if (getDerived().AlwaysRebuild() || 4232 ElementType != T->getElementType() || 4233 size != origSize) { 4234 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4235 T->getSizeModifier(), 4236 size, 4237 T->getIndexTypeCVRQualifiers(), 4238 TL.getBracketsRange()); 4239 if (Result.isNull()) 4240 return QualType(); 4241 } 4242 4243 // We might have any sort of array type now, but fortunately they 4244 // all have the same location layout. 4245 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4246 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4247 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4248 NewTL.setSizeExpr(size); 4249 4250 return Result; 4251 } 4252 4253 template<typename Derived> 4254 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4255 TypeLocBuilder &TLB, 4256 DependentSizedExtVectorTypeLoc TL) { 4257 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4258 4259 // FIXME: ext vector locs should be nested 4260 QualType ElementType = getDerived().TransformType(T->getElementType()); 4261 if (ElementType.isNull()) 4262 return QualType(); 4263 4264 // Vector sizes are constant expressions. 4265 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4266 Sema::ConstantEvaluated); 4267 4268 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4269 Size = SemaRef.ActOnConstantExpression(Size); 4270 if (Size.isInvalid()) 4271 return QualType(); 4272 4273 QualType Result = TL.getType(); 4274 if (getDerived().AlwaysRebuild() || 4275 ElementType != T->getElementType() || 4276 Size.get() != T->getSizeExpr()) { 4277 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4278 Size.get(), 4279 T->getAttributeLoc()); 4280 if (Result.isNull()) 4281 return QualType(); 4282 } 4283 4284 // Result might be dependent or not. 4285 if (isa<DependentSizedExtVectorType>(Result)) { 4286 DependentSizedExtVectorTypeLoc NewTL 4287 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4288 NewTL.setNameLoc(TL.getNameLoc()); 4289 } else { 4290 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4291 NewTL.setNameLoc(TL.getNameLoc()); 4292 } 4293 4294 return Result; 4295 } 4296 4297 template<typename Derived> 4298 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4299 VectorTypeLoc TL) { 4300 const VectorType *T = TL.getTypePtr(); 4301 QualType ElementType = getDerived().TransformType(T->getElementType()); 4302 if (ElementType.isNull()) 4303 return QualType(); 4304 4305 QualType Result = TL.getType(); 4306 if (getDerived().AlwaysRebuild() || 4307 ElementType != T->getElementType()) { 4308 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4309 T->getVectorKind()); 4310 if (Result.isNull()) 4311 return QualType(); 4312 } 4313 4314 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4315 NewTL.setNameLoc(TL.getNameLoc()); 4316 4317 return Result; 4318 } 4319 4320 template<typename Derived> 4321 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4322 ExtVectorTypeLoc TL) { 4323 const VectorType *T = TL.getTypePtr(); 4324 QualType ElementType = getDerived().TransformType(T->getElementType()); 4325 if (ElementType.isNull()) 4326 return QualType(); 4327 4328 QualType Result = TL.getType(); 4329 if (getDerived().AlwaysRebuild() || 4330 ElementType != T->getElementType()) { 4331 Result = getDerived().RebuildExtVectorType(ElementType, 4332 T->getNumElements(), 4333 /*FIXME*/ SourceLocation()); 4334 if (Result.isNull()) 4335 return QualType(); 4336 } 4337 4338 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4339 NewTL.setNameLoc(TL.getNameLoc()); 4340 4341 return Result; 4342 } 4343 4344 template <typename Derived> 4345 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4346 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4347 bool ExpectParameterPack) { 4348 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4349 TypeSourceInfo *NewDI = nullptr; 4350 4351 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4352 // If we're substituting into a pack expansion type and we know the 4353 // length we want to expand to, just substitute for the pattern. 4354 TypeLoc OldTL = OldDI->getTypeLoc(); 4355 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4356 4357 TypeLocBuilder TLB; 4358 TypeLoc NewTL = OldDI->getTypeLoc(); 4359 TLB.reserve(NewTL.getFullDataSize()); 4360 4361 QualType Result = getDerived().TransformType(TLB, 4362 OldExpansionTL.getPatternLoc()); 4363 if (Result.isNull()) 4364 return nullptr; 4365 4366 Result = RebuildPackExpansionType(Result, 4367 OldExpansionTL.getPatternLoc().getSourceRange(), 4368 OldExpansionTL.getEllipsisLoc(), 4369 NumExpansions); 4370 if (Result.isNull()) 4371 return nullptr; 4372 4373 PackExpansionTypeLoc NewExpansionTL 4374 = TLB.push<PackExpansionTypeLoc>(Result); 4375 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4376 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4377 } else 4378 NewDI = getDerived().TransformType(OldDI); 4379 if (!NewDI) 4380 return nullptr; 4381 4382 if (NewDI == OldDI && indexAdjustment == 0) 4383 return OldParm; 4384 4385 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4386 OldParm->getDeclContext(), 4387 OldParm->getInnerLocStart(), 4388 OldParm->getLocation(), 4389 OldParm->getIdentifier(), 4390 NewDI->getType(), 4391 NewDI, 4392 OldParm->getStorageClass(), 4393 /* DefArg */ nullptr); 4394 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4395 OldParm->getFunctionScopeIndex() + indexAdjustment); 4396 return newParm; 4397 } 4398 4399 template<typename Derived> 4400 bool TreeTransform<Derived>:: 4401 TransformFunctionTypeParams(SourceLocation Loc, 4402 ParmVarDecl **Params, unsigned NumParams, 4403 const QualType *ParamTypes, 4404 SmallVectorImpl<QualType> &OutParamTypes, 4405 SmallVectorImpl<ParmVarDecl*> *PVars) { 4406 int indexAdjustment = 0; 4407 4408 for (unsigned i = 0; i != NumParams; ++i) { 4409 if (ParmVarDecl *OldParm = Params[i]) { 4410 assert(OldParm->getFunctionScopeIndex() == i); 4411 4412 Optional<unsigned> NumExpansions; 4413 ParmVarDecl *NewParm = nullptr; 4414 if (OldParm->isParameterPack()) { 4415 // We have a function parameter pack that may need to be expanded. 4416 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4417 4418 // Find the parameter packs that could be expanded. 4419 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4420 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4421 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4422 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4423 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4424 4425 // Determine whether we should expand the parameter packs. 4426 bool ShouldExpand = false; 4427 bool RetainExpansion = false; 4428 Optional<unsigned> OrigNumExpansions = 4429 ExpansionTL.getTypePtr()->getNumExpansions(); 4430 NumExpansions = OrigNumExpansions; 4431 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4432 Pattern.getSourceRange(), 4433 Unexpanded, 4434 ShouldExpand, 4435 RetainExpansion, 4436 NumExpansions)) { 4437 return true; 4438 } 4439 4440 if (ShouldExpand) { 4441 // Expand the function parameter pack into multiple, separate 4442 // parameters. 4443 getDerived().ExpandingFunctionParameterPack(OldParm); 4444 for (unsigned I = 0; I != *NumExpansions; ++I) { 4445 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4446 ParmVarDecl *NewParm 4447 = getDerived().TransformFunctionTypeParam(OldParm, 4448 indexAdjustment++, 4449 OrigNumExpansions, 4450 /*ExpectParameterPack=*/false); 4451 if (!NewParm) 4452 return true; 4453 4454 OutParamTypes.push_back(NewParm->getType()); 4455 if (PVars) 4456 PVars->push_back(NewParm); 4457 } 4458 4459 // If we're supposed to retain a pack expansion, do so by temporarily 4460 // forgetting the partially-substituted parameter pack. 4461 if (RetainExpansion) { 4462 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4463 ParmVarDecl *NewParm 4464 = getDerived().TransformFunctionTypeParam(OldParm, 4465 indexAdjustment++, 4466 OrigNumExpansions, 4467 /*ExpectParameterPack=*/false); 4468 if (!NewParm) 4469 return true; 4470 4471 OutParamTypes.push_back(NewParm->getType()); 4472 if (PVars) 4473 PVars->push_back(NewParm); 4474 } 4475 4476 // The next parameter should have the same adjustment as the 4477 // last thing we pushed, but we post-incremented indexAdjustment 4478 // on every push. Also, if we push nothing, the adjustment should 4479 // go down by one. 4480 indexAdjustment--; 4481 4482 // We're done with the pack expansion. 4483 continue; 4484 } 4485 4486 // We'll substitute the parameter now without expanding the pack 4487 // expansion. 4488 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4489 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 4490 indexAdjustment, 4491 NumExpansions, 4492 /*ExpectParameterPack=*/true); 4493 } else { 4494 NewParm = getDerived().TransformFunctionTypeParam( 4495 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 4496 } 4497 4498 if (!NewParm) 4499 return true; 4500 4501 OutParamTypes.push_back(NewParm->getType()); 4502 if (PVars) 4503 PVars->push_back(NewParm); 4504 continue; 4505 } 4506 4507 // Deal with the possibility that we don't have a parameter 4508 // declaration for this parameter. 4509 QualType OldType = ParamTypes[i]; 4510 bool IsPackExpansion = false; 4511 Optional<unsigned> NumExpansions; 4512 QualType NewType; 4513 if (const PackExpansionType *Expansion 4514 = dyn_cast<PackExpansionType>(OldType)) { 4515 // We have a function parameter pack that may need to be expanded. 4516 QualType Pattern = Expansion->getPattern(); 4517 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4518 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4519 4520 // Determine whether we should expand the parameter packs. 4521 bool ShouldExpand = false; 4522 bool RetainExpansion = false; 4523 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4524 Unexpanded, 4525 ShouldExpand, 4526 RetainExpansion, 4527 NumExpansions)) { 4528 return true; 4529 } 4530 4531 if (ShouldExpand) { 4532 // Expand the function parameter pack into multiple, separate 4533 // parameters. 4534 for (unsigned I = 0; I != *NumExpansions; ++I) { 4535 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4536 QualType NewType = getDerived().TransformType(Pattern); 4537 if (NewType.isNull()) 4538 return true; 4539 4540 OutParamTypes.push_back(NewType); 4541 if (PVars) 4542 PVars->push_back(nullptr); 4543 } 4544 4545 // We're done with the pack expansion. 4546 continue; 4547 } 4548 4549 // If we're supposed to retain a pack expansion, do so by temporarily 4550 // forgetting the partially-substituted parameter pack. 4551 if (RetainExpansion) { 4552 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4553 QualType NewType = getDerived().TransformType(Pattern); 4554 if (NewType.isNull()) 4555 return true; 4556 4557 OutParamTypes.push_back(NewType); 4558 if (PVars) 4559 PVars->push_back(nullptr); 4560 } 4561 4562 // We'll substitute the parameter now without expanding the pack 4563 // expansion. 4564 OldType = Expansion->getPattern(); 4565 IsPackExpansion = true; 4566 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4567 NewType = getDerived().TransformType(OldType); 4568 } else { 4569 NewType = getDerived().TransformType(OldType); 4570 } 4571 4572 if (NewType.isNull()) 4573 return true; 4574 4575 if (IsPackExpansion) 4576 NewType = getSema().Context.getPackExpansionType(NewType, 4577 NumExpansions); 4578 4579 OutParamTypes.push_back(NewType); 4580 if (PVars) 4581 PVars->push_back(nullptr); 4582 } 4583 4584 #ifndef NDEBUG 4585 if (PVars) { 4586 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 4587 if (ParmVarDecl *parm = (*PVars)[i]) 4588 assert(parm->getFunctionScopeIndex() == i); 4589 } 4590 #endif 4591 4592 return false; 4593 } 4594 4595 template<typename Derived> 4596 QualType 4597 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4598 FunctionProtoTypeLoc TL) { 4599 SmallVector<QualType, 4> ExceptionStorage; 4600 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 4601 return getDerived().TransformFunctionProtoType( 4602 TLB, TL, nullptr, 0, 4603 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 4604 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 4605 ExceptionStorage, Changed); 4606 }); 4607 } 4608 4609 template<typename Derived> template<typename Fn> 4610 QualType TreeTransform<Derived>::TransformFunctionProtoType( 4611 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 4612 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 4613 // Transform the parameters and return type. 4614 // 4615 // We are required to instantiate the params and return type in source order. 4616 // When the function has a trailing return type, we instantiate the 4617 // parameters before the return type, since the return type can then refer 4618 // to the parameters themselves (via decltype, sizeof, etc.). 4619 // 4620 SmallVector<QualType, 4> ParamTypes; 4621 SmallVector<ParmVarDecl*, 4> ParamDecls; 4622 const FunctionProtoType *T = TL.getTypePtr(); 4623 4624 QualType ResultType; 4625 4626 if (T->hasTrailingReturn()) { 4627 if (getDerived().TransformFunctionTypeParams( 4628 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(), 4629 TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls)) 4630 return QualType(); 4631 4632 { 4633 // C++11 [expr.prim.general]p3: 4634 // If a declaration declares a member function or member function 4635 // template of a class X, the expression this is a prvalue of type 4636 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 4637 // and the end of the function-definition, member-declarator, or 4638 // declarator. 4639 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 4640 4641 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 4642 if (ResultType.isNull()) 4643 return QualType(); 4644 } 4645 } 4646 else { 4647 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 4648 if (ResultType.isNull()) 4649 return QualType(); 4650 4651 if (getDerived().TransformFunctionTypeParams( 4652 TL.getBeginLoc(), TL.getParmArray(), TL.getNumParams(), 4653 TL.getTypePtr()->param_type_begin(), ParamTypes, &ParamDecls)) 4654 return QualType(); 4655 } 4656 4657 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 4658 4659 bool EPIChanged = false; 4660 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 4661 return QualType(); 4662 4663 // FIXME: Need to transform ConsumedParameters for variadic template 4664 // expansion. 4665 4666 QualType Result = TL.getType(); 4667 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 4668 T->getNumParams() != ParamTypes.size() || 4669 !std::equal(T->param_type_begin(), T->param_type_end(), 4670 ParamTypes.begin()) || EPIChanged) { 4671 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 4672 if (Result.isNull()) 4673 return QualType(); 4674 } 4675 4676 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 4677 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4678 NewTL.setLParenLoc(TL.getLParenLoc()); 4679 NewTL.setRParenLoc(TL.getRParenLoc()); 4680 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4681 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 4682 NewTL.setParam(i, ParamDecls[i]); 4683 4684 return Result; 4685 } 4686 4687 template<typename Derived> 4688 bool TreeTransform<Derived>::TransformExceptionSpec( 4689 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 4690 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 4691 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 4692 4693 // Instantiate a dynamic noexcept expression, if any. 4694 if (ESI.Type == EST_ComputedNoexcept) { 4695 EnterExpressionEvaluationContext Unevaluated(getSema(), 4696 Sema::ConstantEvaluated); 4697 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 4698 if (NoexceptExpr.isInvalid()) 4699 return true; 4700 4701 NoexceptExpr = getSema().CheckBooleanCondition( 4702 NoexceptExpr.get(), NoexceptExpr.get()->getLocStart()); 4703 if (NoexceptExpr.isInvalid()) 4704 return true; 4705 4706 if (!NoexceptExpr.get()->isValueDependent()) { 4707 NoexceptExpr = getSema().VerifyIntegerConstantExpression( 4708 NoexceptExpr.get(), nullptr, 4709 diag::err_noexcept_needs_constant_expression, 4710 /*AllowFold*/false); 4711 if (NoexceptExpr.isInvalid()) 4712 return true; 4713 } 4714 4715 if (ESI.NoexceptExpr != NoexceptExpr.get()) 4716 Changed = true; 4717 ESI.NoexceptExpr = NoexceptExpr.get(); 4718 } 4719 4720 if (ESI.Type != EST_Dynamic) 4721 return false; 4722 4723 // Instantiate a dynamic exception specification's type. 4724 for (QualType T : ESI.Exceptions) { 4725 if (const PackExpansionType *PackExpansion = 4726 T->getAs<PackExpansionType>()) { 4727 Changed = true; 4728 4729 // We have a pack expansion. Instantiate it. 4730 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4731 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 4732 Unexpanded); 4733 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4734 4735 // Determine whether the set of unexpanded parameter packs can and 4736 // should 4737 // be expanded. 4738 bool Expand = false; 4739 bool RetainExpansion = false; 4740 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 4741 // FIXME: Track the location of the ellipsis (and track source location 4742 // information for the types in the exception specification in general). 4743 if (getDerived().TryExpandParameterPacks( 4744 Loc, SourceRange(), Unexpanded, Expand, 4745 RetainExpansion, NumExpansions)) 4746 return true; 4747 4748 if (!Expand) { 4749 // We can't expand this pack expansion into separate arguments yet; 4750 // just substitute into the pattern and create a new pack expansion 4751 // type. 4752 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4753 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 4754 if (U.isNull()) 4755 return true; 4756 4757 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 4758 Exceptions.push_back(U); 4759 continue; 4760 } 4761 4762 // Substitute into the pack expansion pattern for each slice of the 4763 // pack. 4764 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 4765 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 4766 4767 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 4768 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 4769 return true; 4770 4771 Exceptions.push_back(U); 4772 } 4773 } else { 4774 QualType U = getDerived().TransformType(T); 4775 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 4776 return true; 4777 if (T != U) 4778 Changed = true; 4779 4780 Exceptions.push_back(U); 4781 } 4782 } 4783 4784 ESI.Exceptions = Exceptions; 4785 return false; 4786 } 4787 4788 template<typename Derived> 4789 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 4790 TypeLocBuilder &TLB, 4791 FunctionNoProtoTypeLoc TL) { 4792 const FunctionNoProtoType *T = TL.getTypePtr(); 4793 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 4794 if (ResultType.isNull()) 4795 return QualType(); 4796 4797 QualType Result = TL.getType(); 4798 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 4799 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 4800 4801 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 4802 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4803 NewTL.setLParenLoc(TL.getLParenLoc()); 4804 NewTL.setRParenLoc(TL.getRParenLoc()); 4805 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4806 4807 return Result; 4808 } 4809 4810 template<typename Derived> QualType 4811 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 4812 UnresolvedUsingTypeLoc TL) { 4813 const UnresolvedUsingType *T = TL.getTypePtr(); 4814 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 4815 if (!D) 4816 return QualType(); 4817 4818 QualType Result = TL.getType(); 4819 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 4820 Result = getDerived().RebuildUnresolvedUsingType(D); 4821 if (Result.isNull()) 4822 return QualType(); 4823 } 4824 4825 // We might get an arbitrary type spec type back. We should at 4826 // least always get a type spec type, though. 4827 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 4828 NewTL.setNameLoc(TL.getNameLoc()); 4829 4830 return Result; 4831 } 4832 4833 template<typename Derived> 4834 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 4835 TypedefTypeLoc TL) { 4836 const TypedefType *T = TL.getTypePtr(); 4837 TypedefNameDecl *Typedef 4838 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4839 T->getDecl())); 4840 if (!Typedef) 4841 return QualType(); 4842 4843 QualType Result = TL.getType(); 4844 if (getDerived().AlwaysRebuild() || 4845 Typedef != T->getDecl()) { 4846 Result = getDerived().RebuildTypedefType(Typedef); 4847 if (Result.isNull()) 4848 return QualType(); 4849 } 4850 4851 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 4852 NewTL.setNameLoc(TL.getNameLoc()); 4853 4854 return Result; 4855 } 4856 4857 template<typename Derived> 4858 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 4859 TypeOfExprTypeLoc TL) { 4860 // typeof expressions are not potentially evaluated contexts 4861 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 4862 Sema::ReuseLambdaContextDecl); 4863 4864 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 4865 if (E.isInvalid()) 4866 return QualType(); 4867 4868 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 4869 if (E.isInvalid()) 4870 return QualType(); 4871 4872 QualType Result = TL.getType(); 4873 if (getDerived().AlwaysRebuild() || 4874 E.get() != TL.getUnderlyingExpr()) { 4875 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 4876 if (Result.isNull()) 4877 return QualType(); 4878 } 4879 else E.get(); 4880 4881 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 4882 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4883 NewTL.setLParenLoc(TL.getLParenLoc()); 4884 NewTL.setRParenLoc(TL.getRParenLoc()); 4885 4886 return Result; 4887 } 4888 4889 template<typename Derived> 4890 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 4891 TypeOfTypeLoc TL) { 4892 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 4893 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 4894 if (!New_Under_TI) 4895 return QualType(); 4896 4897 QualType Result = TL.getType(); 4898 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 4899 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 4900 if (Result.isNull()) 4901 return QualType(); 4902 } 4903 4904 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 4905 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4906 NewTL.setLParenLoc(TL.getLParenLoc()); 4907 NewTL.setRParenLoc(TL.getRParenLoc()); 4908 NewTL.setUnderlyingTInfo(New_Under_TI); 4909 4910 return Result; 4911 } 4912 4913 template<typename Derived> 4914 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 4915 DecltypeTypeLoc TL) { 4916 const DecltypeType *T = TL.getTypePtr(); 4917 4918 // decltype expressions are not potentially evaluated contexts 4919 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 4920 nullptr, /*IsDecltype=*/ true); 4921 4922 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 4923 if (E.isInvalid()) 4924 return QualType(); 4925 4926 E = getSema().ActOnDecltypeExpression(E.get()); 4927 if (E.isInvalid()) 4928 return QualType(); 4929 4930 QualType Result = TL.getType(); 4931 if (getDerived().AlwaysRebuild() || 4932 E.get() != T->getUnderlyingExpr()) { 4933 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 4934 if (Result.isNull()) 4935 return QualType(); 4936 } 4937 else E.get(); 4938 4939 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 4940 NewTL.setNameLoc(TL.getNameLoc()); 4941 4942 return Result; 4943 } 4944 4945 template<typename Derived> 4946 QualType TreeTransform<Derived>::TransformUnaryTransformType( 4947 TypeLocBuilder &TLB, 4948 UnaryTransformTypeLoc TL) { 4949 QualType Result = TL.getType(); 4950 if (Result->isDependentType()) { 4951 const UnaryTransformType *T = TL.getTypePtr(); 4952 QualType NewBase = 4953 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 4954 Result = getDerived().RebuildUnaryTransformType(NewBase, 4955 T->getUTTKind(), 4956 TL.getKWLoc()); 4957 if (Result.isNull()) 4958 return QualType(); 4959 } 4960 4961 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 4962 NewTL.setKWLoc(TL.getKWLoc()); 4963 NewTL.setParensRange(TL.getParensRange()); 4964 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 4965 return Result; 4966 } 4967 4968 template<typename Derived> 4969 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 4970 AutoTypeLoc TL) { 4971 const AutoType *T = TL.getTypePtr(); 4972 QualType OldDeduced = T->getDeducedType(); 4973 QualType NewDeduced; 4974 if (!OldDeduced.isNull()) { 4975 NewDeduced = getDerived().TransformType(OldDeduced); 4976 if (NewDeduced.isNull()) 4977 return QualType(); 4978 } 4979 4980 QualType Result = TL.getType(); 4981 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 4982 T->isDependentType()) { 4983 Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto()); 4984 if (Result.isNull()) 4985 return QualType(); 4986 } 4987 4988 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 4989 NewTL.setNameLoc(TL.getNameLoc()); 4990 4991 return Result; 4992 } 4993 4994 template<typename Derived> 4995 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 4996 RecordTypeLoc TL) { 4997 const RecordType *T = TL.getTypePtr(); 4998 RecordDecl *Record 4999 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5000 T->getDecl())); 5001 if (!Record) 5002 return QualType(); 5003 5004 QualType Result = TL.getType(); 5005 if (getDerived().AlwaysRebuild() || 5006 Record != T->getDecl()) { 5007 Result = getDerived().RebuildRecordType(Record); 5008 if (Result.isNull()) 5009 return QualType(); 5010 } 5011 5012 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5013 NewTL.setNameLoc(TL.getNameLoc()); 5014 5015 return Result; 5016 } 5017 5018 template<typename Derived> 5019 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5020 EnumTypeLoc TL) { 5021 const EnumType *T = TL.getTypePtr(); 5022 EnumDecl *Enum 5023 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5024 T->getDecl())); 5025 if (!Enum) 5026 return QualType(); 5027 5028 QualType Result = TL.getType(); 5029 if (getDerived().AlwaysRebuild() || 5030 Enum != T->getDecl()) { 5031 Result = getDerived().RebuildEnumType(Enum); 5032 if (Result.isNull()) 5033 return QualType(); 5034 } 5035 5036 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5037 NewTL.setNameLoc(TL.getNameLoc()); 5038 5039 return Result; 5040 } 5041 5042 template<typename Derived> 5043 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5044 TypeLocBuilder &TLB, 5045 InjectedClassNameTypeLoc TL) { 5046 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5047 TL.getTypePtr()->getDecl()); 5048 if (!D) return QualType(); 5049 5050 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5051 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5052 return T; 5053 } 5054 5055 template<typename Derived> 5056 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5057 TypeLocBuilder &TLB, 5058 TemplateTypeParmTypeLoc TL) { 5059 return TransformTypeSpecType(TLB, TL); 5060 } 5061 5062 template<typename Derived> 5063 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5064 TypeLocBuilder &TLB, 5065 SubstTemplateTypeParmTypeLoc TL) { 5066 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5067 5068 // Substitute into the replacement type, which itself might involve something 5069 // that needs to be transformed. This only tends to occur with default 5070 // template arguments of template template parameters. 5071 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5072 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5073 if (Replacement.isNull()) 5074 return QualType(); 5075 5076 // Always canonicalize the replacement type. 5077 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5078 QualType Result 5079 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5080 Replacement); 5081 5082 // Propagate type-source information. 5083 SubstTemplateTypeParmTypeLoc NewTL 5084 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5085 NewTL.setNameLoc(TL.getNameLoc()); 5086 return Result; 5087 5088 } 5089 5090 template<typename Derived> 5091 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5092 TypeLocBuilder &TLB, 5093 SubstTemplateTypeParmPackTypeLoc TL) { 5094 return TransformTypeSpecType(TLB, TL); 5095 } 5096 5097 template<typename Derived> 5098 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5099 TypeLocBuilder &TLB, 5100 TemplateSpecializationTypeLoc TL) { 5101 const TemplateSpecializationType *T = TL.getTypePtr(); 5102 5103 // The nested-name-specifier never matters in a TemplateSpecializationType, 5104 // because we can't have a dependent nested-name-specifier anyway. 5105 CXXScopeSpec SS; 5106 TemplateName Template 5107 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5108 TL.getTemplateNameLoc()); 5109 if (Template.isNull()) 5110 return QualType(); 5111 5112 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5113 } 5114 5115 template<typename Derived> 5116 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5117 AtomicTypeLoc TL) { 5118 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5119 if (ValueType.isNull()) 5120 return QualType(); 5121 5122 QualType Result = TL.getType(); 5123 if (getDerived().AlwaysRebuild() || 5124 ValueType != TL.getValueLoc().getType()) { 5125 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5126 if (Result.isNull()) 5127 return QualType(); 5128 } 5129 5130 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5131 NewTL.setKWLoc(TL.getKWLoc()); 5132 NewTL.setLParenLoc(TL.getLParenLoc()); 5133 NewTL.setRParenLoc(TL.getRParenLoc()); 5134 5135 return Result; 5136 } 5137 5138 /// \brief Simple iterator that traverses the template arguments in a 5139 /// container that provides a \c getArgLoc() member function. 5140 /// 5141 /// This iterator is intended to be used with the iterator form of 5142 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5143 template<typename ArgLocContainer> 5144 class TemplateArgumentLocContainerIterator { 5145 ArgLocContainer *Container; 5146 unsigned Index; 5147 5148 public: 5149 typedef TemplateArgumentLoc value_type; 5150 typedef TemplateArgumentLoc reference; 5151 typedef int difference_type; 5152 typedef std::input_iterator_tag iterator_category; 5153 5154 class pointer { 5155 TemplateArgumentLoc Arg; 5156 5157 public: 5158 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5159 5160 const TemplateArgumentLoc *operator->() const { 5161 return &Arg; 5162 } 5163 }; 5164 5165 5166 TemplateArgumentLocContainerIterator() {} 5167 5168 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5169 unsigned Index) 5170 : Container(&Container), Index(Index) { } 5171 5172 TemplateArgumentLocContainerIterator &operator++() { 5173 ++Index; 5174 return *this; 5175 } 5176 5177 TemplateArgumentLocContainerIterator operator++(int) { 5178 TemplateArgumentLocContainerIterator Old(*this); 5179 ++(*this); 5180 return Old; 5181 } 5182 5183 TemplateArgumentLoc operator*() const { 5184 return Container->getArgLoc(Index); 5185 } 5186 5187 pointer operator->() const { 5188 return pointer(Container->getArgLoc(Index)); 5189 } 5190 5191 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5192 const TemplateArgumentLocContainerIterator &Y) { 5193 return X.Container == Y.Container && X.Index == Y.Index; 5194 } 5195 5196 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5197 const TemplateArgumentLocContainerIterator &Y) { 5198 return !(X == Y); 5199 } 5200 }; 5201 5202 5203 template <typename Derived> 5204 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5205 TypeLocBuilder &TLB, 5206 TemplateSpecializationTypeLoc TL, 5207 TemplateName Template) { 5208 TemplateArgumentListInfo NewTemplateArgs; 5209 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5210 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5211 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5212 ArgIterator; 5213 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5214 ArgIterator(TL, TL.getNumArgs()), 5215 NewTemplateArgs)) 5216 return QualType(); 5217 5218 // FIXME: maybe don't rebuild if all the template arguments are the same. 5219 5220 QualType Result = 5221 getDerived().RebuildTemplateSpecializationType(Template, 5222 TL.getTemplateNameLoc(), 5223 NewTemplateArgs); 5224 5225 if (!Result.isNull()) { 5226 // Specializations of template template parameters are represented as 5227 // TemplateSpecializationTypes, and substitution of type alias templates 5228 // within a dependent context can transform them into 5229 // DependentTemplateSpecializationTypes. 5230 if (isa<DependentTemplateSpecializationType>(Result)) { 5231 DependentTemplateSpecializationTypeLoc NewTL 5232 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5233 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5234 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5235 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5236 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5237 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5238 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5239 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5240 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5241 return Result; 5242 } 5243 5244 TemplateSpecializationTypeLoc NewTL 5245 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5246 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5247 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5248 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5249 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5250 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5251 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5252 } 5253 5254 return Result; 5255 } 5256 5257 template <typename Derived> 5258 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5259 TypeLocBuilder &TLB, 5260 DependentTemplateSpecializationTypeLoc TL, 5261 TemplateName Template, 5262 CXXScopeSpec &SS) { 5263 TemplateArgumentListInfo NewTemplateArgs; 5264 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5265 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5266 typedef TemplateArgumentLocContainerIterator< 5267 DependentTemplateSpecializationTypeLoc> ArgIterator; 5268 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5269 ArgIterator(TL, TL.getNumArgs()), 5270 NewTemplateArgs)) 5271 return QualType(); 5272 5273 // FIXME: maybe don't rebuild if all the template arguments are the same. 5274 5275 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5276 QualType Result 5277 = getSema().Context.getDependentTemplateSpecializationType( 5278 TL.getTypePtr()->getKeyword(), 5279 DTN->getQualifier(), 5280 DTN->getIdentifier(), 5281 NewTemplateArgs); 5282 5283 DependentTemplateSpecializationTypeLoc NewTL 5284 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5285 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5286 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5287 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5288 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5289 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5290 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5291 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5292 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5293 return Result; 5294 } 5295 5296 QualType Result 5297 = getDerived().RebuildTemplateSpecializationType(Template, 5298 TL.getTemplateNameLoc(), 5299 NewTemplateArgs); 5300 5301 if (!Result.isNull()) { 5302 /// FIXME: Wrap this in an elaborated-type-specifier? 5303 TemplateSpecializationTypeLoc NewTL 5304 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5305 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5306 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5307 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5308 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5309 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5310 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5311 } 5312 5313 return Result; 5314 } 5315 5316 template<typename Derived> 5317 QualType 5318 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 5319 ElaboratedTypeLoc TL) { 5320 const ElaboratedType *T = TL.getTypePtr(); 5321 5322 NestedNameSpecifierLoc QualifierLoc; 5323 // NOTE: the qualifier in an ElaboratedType is optional. 5324 if (TL.getQualifierLoc()) { 5325 QualifierLoc 5326 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5327 if (!QualifierLoc) 5328 return QualType(); 5329 } 5330 5331 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 5332 if (NamedT.isNull()) 5333 return QualType(); 5334 5335 // C++0x [dcl.type.elab]p2: 5336 // If the identifier resolves to a typedef-name or the simple-template-id 5337 // resolves to an alias template specialization, the 5338 // elaborated-type-specifier is ill-formed. 5339 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 5340 if (const TemplateSpecializationType *TST = 5341 NamedT->getAs<TemplateSpecializationType>()) { 5342 TemplateName Template = TST->getTemplateName(); 5343 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 5344 Template.getAsTemplateDecl())) { 5345 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 5346 diag::err_tag_reference_non_tag) << 4; 5347 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 5348 } 5349 } 5350 } 5351 5352 QualType Result = TL.getType(); 5353 if (getDerived().AlwaysRebuild() || 5354 QualifierLoc != TL.getQualifierLoc() || 5355 NamedT != T->getNamedType()) { 5356 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 5357 T->getKeyword(), 5358 QualifierLoc, NamedT); 5359 if (Result.isNull()) 5360 return QualType(); 5361 } 5362 5363 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5364 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5365 NewTL.setQualifierLoc(QualifierLoc); 5366 return Result; 5367 } 5368 5369 template<typename Derived> 5370 QualType TreeTransform<Derived>::TransformAttributedType( 5371 TypeLocBuilder &TLB, 5372 AttributedTypeLoc TL) { 5373 const AttributedType *oldType = TL.getTypePtr(); 5374 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 5375 if (modifiedType.isNull()) 5376 return QualType(); 5377 5378 QualType result = TL.getType(); 5379 5380 // FIXME: dependent operand expressions? 5381 if (getDerived().AlwaysRebuild() || 5382 modifiedType != oldType->getModifiedType()) { 5383 // TODO: this is really lame; we should really be rebuilding the 5384 // equivalent type from first principles. 5385 QualType equivalentType 5386 = getDerived().TransformType(oldType->getEquivalentType()); 5387 if (equivalentType.isNull()) 5388 return QualType(); 5389 5390 // Check whether we can add nullability; it is only represented as 5391 // type sugar, and therefore cannot be diagnosed in any other way. 5392 if (auto nullability = oldType->getImmediateNullability()) { 5393 if (!modifiedType->canHaveNullability()) { 5394 SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer) 5395 << static_cast<unsigned>(*nullability) << false << modifiedType; 5396 return QualType(); 5397 } 5398 } 5399 5400 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 5401 modifiedType, 5402 equivalentType); 5403 } 5404 5405 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 5406 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 5407 if (TL.hasAttrOperand()) 5408 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5409 if (TL.hasAttrExprOperand()) 5410 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 5411 else if (TL.hasAttrEnumOperand()) 5412 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 5413 5414 return result; 5415 } 5416 5417 template<typename Derived> 5418 QualType 5419 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 5420 ParenTypeLoc TL) { 5421 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 5422 if (Inner.isNull()) 5423 return QualType(); 5424 5425 QualType Result = TL.getType(); 5426 if (getDerived().AlwaysRebuild() || 5427 Inner != TL.getInnerLoc().getType()) { 5428 Result = getDerived().RebuildParenType(Inner); 5429 if (Result.isNull()) 5430 return QualType(); 5431 } 5432 5433 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 5434 NewTL.setLParenLoc(TL.getLParenLoc()); 5435 NewTL.setRParenLoc(TL.getRParenLoc()); 5436 return Result; 5437 } 5438 5439 template<typename Derived> 5440 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 5441 DependentNameTypeLoc TL) { 5442 const DependentNameType *T = TL.getTypePtr(); 5443 5444 NestedNameSpecifierLoc QualifierLoc 5445 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5446 if (!QualifierLoc) 5447 return QualType(); 5448 5449 QualType Result 5450 = getDerived().RebuildDependentNameType(T->getKeyword(), 5451 TL.getElaboratedKeywordLoc(), 5452 QualifierLoc, 5453 T->getIdentifier(), 5454 TL.getNameLoc()); 5455 if (Result.isNull()) 5456 return QualType(); 5457 5458 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 5459 QualType NamedT = ElabT->getNamedType(); 5460 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 5461 5462 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5463 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5464 NewTL.setQualifierLoc(QualifierLoc); 5465 } else { 5466 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 5467 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5468 NewTL.setQualifierLoc(QualifierLoc); 5469 NewTL.setNameLoc(TL.getNameLoc()); 5470 } 5471 return Result; 5472 } 5473 5474 template<typename Derived> 5475 QualType TreeTransform<Derived>:: 5476 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5477 DependentTemplateSpecializationTypeLoc TL) { 5478 NestedNameSpecifierLoc QualifierLoc; 5479 if (TL.getQualifierLoc()) { 5480 QualifierLoc 5481 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5482 if (!QualifierLoc) 5483 return QualType(); 5484 } 5485 5486 return getDerived() 5487 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 5488 } 5489 5490 template<typename Derived> 5491 QualType TreeTransform<Derived>:: 5492 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5493 DependentTemplateSpecializationTypeLoc TL, 5494 NestedNameSpecifierLoc QualifierLoc) { 5495 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 5496 5497 TemplateArgumentListInfo NewTemplateArgs; 5498 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5499 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5500 5501 typedef TemplateArgumentLocContainerIterator< 5502 DependentTemplateSpecializationTypeLoc> ArgIterator; 5503 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5504 ArgIterator(TL, TL.getNumArgs()), 5505 NewTemplateArgs)) 5506 return QualType(); 5507 5508 QualType Result 5509 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 5510 QualifierLoc, 5511 T->getIdentifier(), 5512 TL.getTemplateNameLoc(), 5513 NewTemplateArgs); 5514 if (Result.isNull()) 5515 return QualType(); 5516 5517 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 5518 QualType NamedT = ElabT->getNamedType(); 5519 5520 // Copy information relevant to the template specialization. 5521 TemplateSpecializationTypeLoc NamedTL 5522 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 5523 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5524 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5525 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 5526 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 5527 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5528 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5529 5530 // Copy information relevant to the elaborated type. 5531 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5532 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5533 NewTL.setQualifierLoc(QualifierLoc); 5534 } else if (isa<DependentTemplateSpecializationType>(Result)) { 5535 DependentTemplateSpecializationTypeLoc SpecTL 5536 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5537 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5538 SpecTL.setQualifierLoc(QualifierLoc); 5539 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5540 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5541 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5542 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5543 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5544 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5545 } else { 5546 TemplateSpecializationTypeLoc SpecTL 5547 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5548 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5549 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5550 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5551 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5552 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5553 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5554 } 5555 return Result; 5556 } 5557 5558 template<typename Derived> 5559 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 5560 PackExpansionTypeLoc TL) { 5561 QualType Pattern 5562 = getDerived().TransformType(TLB, TL.getPatternLoc()); 5563 if (Pattern.isNull()) 5564 return QualType(); 5565 5566 QualType Result = TL.getType(); 5567 if (getDerived().AlwaysRebuild() || 5568 Pattern != TL.getPatternLoc().getType()) { 5569 Result = getDerived().RebuildPackExpansionType(Pattern, 5570 TL.getPatternLoc().getSourceRange(), 5571 TL.getEllipsisLoc(), 5572 TL.getTypePtr()->getNumExpansions()); 5573 if (Result.isNull()) 5574 return QualType(); 5575 } 5576 5577 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 5578 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 5579 return Result; 5580 } 5581 5582 template<typename Derived> 5583 QualType 5584 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 5585 ObjCInterfaceTypeLoc TL) { 5586 // ObjCInterfaceType is never dependent. 5587 TLB.pushFullCopy(TL); 5588 return TL.getType(); 5589 } 5590 5591 template<typename Derived> 5592 QualType 5593 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 5594 ObjCObjectTypeLoc TL) { 5595 // ObjCObjectType is never dependent. 5596 TLB.pushFullCopy(TL); 5597 return TL.getType(); 5598 } 5599 5600 template<typename Derived> 5601 QualType 5602 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 5603 ObjCObjectPointerTypeLoc TL) { 5604 // ObjCObjectPointerType is never dependent. 5605 TLB.pushFullCopy(TL); 5606 return TL.getType(); 5607 } 5608 5609 //===----------------------------------------------------------------------===// 5610 // Statement transformation 5611 //===----------------------------------------------------------------------===// 5612 template<typename Derived> 5613 StmtResult 5614 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 5615 return S; 5616 } 5617 5618 template<typename Derived> 5619 StmtResult 5620 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 5621 return getDerived().TransformCompoundStmt(S, false); 5622 } 5623 5624 template<typename Derived> 5625 StmtResult 5626 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 5627 bool IsStmtExpr) { 5628 Sema::CompoundScopeRAII CompoundScope(getSema()); 5629 5630 bool SubStmtInvalid = false; 5631 bool SubStmtChanged = false; 5632 SmallVector<Stmt*, 8> Statements; 5633 for (auto *B : S->body()) { 5634 StmtResult Result = getDerived().TransformStmt(B); 5635 if (Result.isInvalid()) { 5636 // Immediately fail if this was a DeclStmt, since it's very 5637 // likely that this will cause problems for future statements. 5638 if (isa<DeclStmt>(B)) 5639 return StmtError(); 5640 5641 // Otherwise, just keep processing substatements and fail later. 5642 SubStmtInvalid = true; 5643 continue; 5644 } 5645 5646 SubStmtChanged = SubStmtChanged || Result.get() != B; 5647 Statements.push_back(Result.getAs<Stmt>()); 5648 } 5649 5650 if (SubStmtInvalid) 5651 return StmtError(); 5652 5653 if (!getDerived().AlwaysRebuild() && 5654 !SubStmtChanged) 5655 return S; 5656 5657 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 5658 Statements, 5659 S->getRBracLoc(), 5660 IsStmtExpr); 5661 } 5662 5663 template<typename Derived> 5664 StmtResult 5665 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 5666 ExprResult LHS, RHS; 5667 { 5668 EnterExpressionEvaluationContext Unevaluated(SemaRef, 5669 Sema::ConstantEvaluated); 5670 5671 // Transform the left-hand case value. 5672 LHS = getDerived().TransformExpr(S->getLHS()); 5673 LHS = SemaRef.ActOnConstantExpression(LHS); 5674 if (LHS.isInvalid()) 5675 return StmtError(); 5676 5677 // Transform the right-hand case value (for the GNU case-range extension). 5678 RHS = getDerived().TransformExpr(S->getRHS()); 5679 RHS = SemaRef.ActOnConstantExpression(RHS); 5680 if (RHS.isInvalid()) 5681 return StmtError(); 5682 } 5683 5684 // Build the case statement. 5685 // Case statements are always rebuilt so that they will attached to their 5686 // transformed switch statement. 5687 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 5688 LHS.get(), 5689 S->getEllipsisLoc(), 5690 RHS.get(), 5691 S->getColonLoc()); 5692 if (Case.isInvalid()) 5693 return StmtError(); 5694 5695 // Transform the statement following the case 5696 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5697 if (SubStmt.isInvalid()) 5698 return StmtError(); 5699 5700 // Attach the body to the case statement 5701 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 5702 } 5703 5704 template<typename Derived> 5705 StmtResult 5706 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 5707 // Transform the statement following the default case 5708 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5709 if (SubStmt.isInvalid()) 5710 return StmtError(); 5711 5712 // Default statements are always rebuilt 5713 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 5714 SubStmt.get()); 5715 } 5716 5717 template<typename Derived> 5718 StmtResult 5719 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 5720 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5721 if (SubStmt.isInvalid()) 5722 return StmtError(); 5723 5724 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 5725 S->getDecl()); 5726 if (!LD) 5727 return StmtError(); 5728 5729 5730 // FIXME: Pass the real colon location in. 5731 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 5732 cast<LabelDecl>(LD), SourceLocation(), 5733 SubStmt.get()); 5734 } 5735 5736 template <typename Derived> 5737 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 5738 if (!R) 5739 return R; 5740 5741 switch (R->getKind()) { 5742 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 5743 #define ATTR(X) 5744 #define PRAGMA_SPELLING_ATTR(X) \ 5745 case attr::X: \ 5746 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 5747 #include "clang/Basic/AttrList.inc" 5748 default: 5749 return R; 5750 } 5751 } 5752 5753 template <typename Derived> 5754 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 5755 bool AttrsChanged = false; 5756 SmallVector<const Attr *, 1> Attrs; 5757 5758 // Visit attributes and keep track if any are transformed. 5759 for (const auto *I : S->getAttrs()) { 5760 const Attr *R = getDerived().TransformAttr(I); 5761 AttrsChanged |= (I != R); 5762 Attrs.push_back(R); 5763 } 5764 5765 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5766 if (SubStmt.isInvalid()) 5767 return StmtError(); 5768 5769 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 5770 return S; 5771 5772 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 5773 SubStmt.get()); 5774 } 5775 5776 template<typename Derived> 5777 StmtResult 5778 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 5779 // Transform the condition 5780 ExprResult Cond; 5781 VarDecl *ConditionVar = nullptr; 5782 if (S->getConditionVariable()) { 5783 ConditionVar 5784 = cast_or_null<VarDecl>( 5785 getDerived().TransformDefinition( 5786 S->getConditionVariable()->getLocation(), 5787 S->getConditionVariable())); 5788 if (!ConditionVar) 5789 return StmtError(); 5790 } else { 5791 Cond = getDerived().TransformExpr(S->getCond()); 5792 5793 if (Cond.isInvalid()) 5794 return StmtError(); 5795 5796 // Convert the condition to a boolean value. 5797 if (S->getCond()) { 5798 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, S->getIfLoc(), 5799 Cond.get()); 5800 if (CondE.isInvalid()) 5801 return StmtError(); 5802 5803 Cond = CondE.get(); 5804 } 5805 } 5806 5807 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get())); 5808 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5809 return StmtError(); 5810 5811 // Transform the "then" branch. 5812 StmtResult Then = getDerived().TransformStmt(S->getThen()); 5813 if (Then.isInvalid()) 5814 return StmtError(); 5815 5816 // Transform the "else" branch. 5817 StmtResult Else = getDerived().TransformStmt(S->getElse()); 5818 if (Else.isInvalid()) 5819 return StmtError(); 5820 5821 if (!getDerived().AlwaysRebuild() && 5822 FullCond.get() == S->getCond() && 5823 ConditionVar == S->getConditionVariable() && 5824 Then.get() == S->getThen() && 5825 Else.get() == S->getElse()) 5826 return S; 5827 5828 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 5829 Then.get(), 5830 S->getElseLoc(), Else.get()); 5831 } 5832 5833 template<typename Derived> 5834 StmtResult 5835 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 5836 // Transform the condition. 5837 ExprResult Cond; 5838 VarDecl *ConditionVar = nullptr; 5839 if (S->getConditionVariable()) { 5840 ConditionVar 5841 = cast_or_null<VarDecl>( 5842 getDerived().TransformDefinition( 5843 S->getConditionVariable()->getLocation(), 5844 S->getConditionVariable())); 5845 if (!ConditionVar) 5846 return StmtError(); 5847 } else { 5848 Cond = getDerived().TransformExpr(S->getCond()); 5849 5850 if (Cond.isInvalid()) 5851 return StmtError(); 5852 } 5853 5854 // Rebuild the switch statement. 5855 StmtResult Switch 5856 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 5857 ConditionVar); 5858 if (Switch.isInvalid()) 5859 return StmtError(); 5860 5861 // Transform the body of the switch statement. 5862 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5863 if (Body.isInvalid()) 5864 return StmtError(); 5865 5866 // Complete the switch statement. 5867 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 5868 Body.get()); 5869 } 5870 5871 template<typename Derived> 5872 StmtResult 5873 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 5874 // Transform the condition 5875 ExprResult Cond; 5876 VarDecl *ConditionVar = nullptr; 5877 if (S->getConditionVariable()) { 5878 ConditionVar 5879 = cast_or_null<VarDecl>( 5880 getDerived().TransformDefinition( 5881 S->getConditionVariable()->getLocation(), 5882 S->getConditionVariable())); 5883 if (!ConditionVar) 5884 return StmtError(); 5885 } else { 5886 Cond = getDerived().TransformExpr(S->getCond()); 5887 5888 if (Cond.isInvalid()) 5889 return StmtError(); 5890 5891 if (S->getCond()) { 5892 // Convert the condition to a boolean value. 5893 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, 5894 S->getWhileLoc(), 5895 Cond.get()); 5896 if (CondE.isInvalid()) 5897 return StmtError(); 5898 Cond = CondE; 5899 } 5900 } 5901 5902 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get())); 5903 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5904 return StmtError(); 5905 5906 // Transform the body 5907 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5908 if (Body.isInvalid()) 5909 return StmtError(); 5910 5911 if (!getDerived().AlwaysRebuild() && 5912 FullCond.get() == S->getCond() && 5913 ConditionVar == S->getConditionVariable() && 5914 Body.get() == S->getBody()) 5915 return Owned(S); 5916 5917 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 5918 ConditionVar, Body.get()); 5919 } 5920 5921 template<typename Derived> 5922 StmtResult 5923 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 5924 // Transform the body 5925 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5926 if (Body.isInvalid()) 5927 return StmtError(); 5928 5929 // Transform the condition 5930 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 5931 if (Cond.isInvalid()) 5932 return StmtError(); 5933 5934 if (!getDerived().AlwaysRebuild() && 5935 Cond.get() == S->getCond() && 5936 Body.get() == S->getBody()) 5937 return S; 5938 5939 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 5940 /*FIXME:*/S->getWhileLoc(), Cond.get(), 5941 S->getRParenLoc()); 5942 } 5943 5944 template<typename Derived> 5945 StmtResult 5946 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 5947 // Transform the initialization statement 5948 StmtResult Init = getDerived().TransformStmt(S->getInit()); 5949 if (Init.isInvalid()) 5950 return StmtError(); 5951 5952 // Transform the condition 5953 ExprResult Cond; 5954 VarDecl *ConditionVar = nullptr; 5955 if (S->getConditionVariable()) { 5956 ConditionVar 5957 = cast_or_null<VarDecl>( 5958 getDerived().TransformDefinition( 5959 S->getConditionVariable()->getLocation(), 5960 S->getConditionVariable())); 5961 if (!ConditionVar) 5962 return StmtError(); 5963 } else { 5964 Cond = getDerived().TransformExpr(S->getCond()); 5965 5966 if (Cond.isInvalid()) 5967 return StmtError(); 5968 5969 if (S->getCond()) { 5970 // Convert the condition to a boolean value. 5971 ExprResult CondE = getSema().ActOnBooleanCondition(nullptr, 5972 S->getForLoc(), 5973 Cond.get()); 5974 if (CondE.isInvalid()) 5975 return StmtError(); 5976 5977 Cond = CondE.get(); 5978 } 5979 } 5980 5981 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.get())); 5982 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5983 return StmtError(); 5984 5985 // Transform the increment 5986 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 5987 if (Inc.isInvalid()) 5988 return StmtError(); 5989 5990 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 5991 if (S->getInc() && !FullInc.get()) 5992 return StmtError(); 5993 5994 // Transform the body 5995 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5996 if (Body.isInvalid()) 5997 return StmtError(); 5998 5999 if (!getDerived().AlwaysRebuild() && 6000 Init.get() == S->getInit() && 6001 FullCond.get() == S->getCond() && 6002 Inc.get() == S->getInc() && 6003 Body.get() == S->getBody()) 6004 return S; 6005 6006 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6007 Init.get(), FullCond, ConditionVar, 6008 FullInc, S->getRParenLoc(), Body.get()); 6009 } 6010 6011 template<typename Derived> 6012 StmtResult 6013 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6014 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6015 S->getLabel()); 6016 if (!LD) 6017 return StmtError(); 6018 6019 // Goto statements must always be rebuilt, to resolve the label. 6020 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6021 cast<LabelDecl>(LD)); 6022 } 6023 6024 template<typename Derived> 6025 StmtResult 6026 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6027 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6028 if (Target.isInvalid()) 6029 return StmtError(); 6030 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6031 6032 if (!getDerived().AlwaysRebuild() && 6033 Target.get() == S->getTarget()) 6034 return S; 6035 6036 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6037 Target.get()); 6038 } 6039 6040 template<typename Derived> 6041 StmtResult 6042 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6043 return S; 6044 } 6045 6046 template<typename Derived> 6047 StmtResult 6048 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6049 return S; 6050 } 6051 6052 template<typename Derived> 6053 StmtResult 6054 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6055 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6056 /*NotCopyInit*/false); 6057 if (Result.isInvalid()) 6058 return StmtError(); 6059 6060 // FIXME: We always rebuild the return statement because there is no way 6061 // to tell whether the return type of the function has changed. 6062 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6063 } 6064 6065 template<typename Derived> 6066 StmtResult 6067 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6068 bool DeclChanged = false; 6069 SmallVector<Decl *, 4> Decls; 6070 for (auto *D : S->decls()) { 6071 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6072 if (!Transformed) 6073 return StmtError(); 6074 6075 if (Transformed != D) 6076 DeclChanged = true; 6077 6078 Decls.push_back(Transformed); 6079 } 6080 6081 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6082 return S; 6083 6084 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc()); 6085 } 6086 6087 template<typename Derived> 6088 StmtResult 6089 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6090 6091 SmallVector<Expr*, 8> Constraints; 6092 SmallVector<Expr*, 8> Exprs; 6093 SmallVector<IdentifierInfo *, 4> Names; 6094 6095 ExprResult AsmString; 6096 SmallVector<Expr*, 8> Clobbers; 6097 6098 bool ExprsChanged = false; 6099 6100 // Go through the outputs. 6101 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6102 Names.push_back(S->getOutputIdentifier(I)); 6103 6104 // No need to transform the constraint literal. 6105 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6106 6107 // Transform the output expr. 6108 Expr *OutputExpr = S->getOutputExpr(I); 6109 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6110 if (Result.isInvalid()) 6111 return StmtError(); 6112 6113 ExprsChanged |= Result.get() != OutputExpr; 6114 6115 Exprs.push_back(Result.get()); 6116 } 6117 6118 // Go through the inputs. 6119 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6120 Names.push_back(S->getInputIdentifier(I)); 6121 6122 // No need to transform the constraint literal. 6123 Constraints.push_back(S->getInputConstraintLiteral(I)); 6124 6125 // Transform the input expr. 6126 Expr *InputExpr = S->getInputExpr(I); 6127 ExprResult Result = getDerived().TransformExpr(InputExpr); 6128 if (Result.isInvalid()) 6129 return StmtError(); 6130 6131 ExprsChanged |= Result.get() != InputExpr; 6132 6133 Exprs.push_back(Result.get()); 6134 } 6135 6136 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6137 return S; 6138 6139 // Go through the clobbers. 6140 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6141 Clobbers.push_back(S->getClobberStringLiteral(I)); 6142 6143 // No need to transform the asm string literal. 6144 AsmString = S->getAsmString(); 6145 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6146 S->isVolatile(), S->getNumOutputs(), 6147 S->getNumInputs(), Names.data(), 6148 Constraints, Exprs, AsmString.get(), 6149 Clobbers, S->getRParenLoc()); 6150 } 6151 6152 template<typename Derived> 6153 StmtResult 6154 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6155 ArrayRef<Token> AsmToks = 6156 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6157 6158 bool HadError = false, HadChange = false; 6159 6160 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6161 SmallVector<Expr*, 8> TransformedExprs; 6162 TransformedExprs.reserve(SrcExprs.size()); 6163 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6164 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6165 if (!Result.isUsable()) { 6166 HadError = true; 6167 } else { 6168 HadChange |= (Result.get() != SrcExprs[i]); 6169 TransformedExprs.push_back(Result.get()); 6170 } 6171 } 6172 6173 if (HadError) return StmtError(); 6174 if (!HadChange && !getDerived().AlwaysRebuild()) 6175 return Owned(S); 6176 6177 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6178 AsmToks, S->getAsmString(), 6179 S->getNumOutputs(), S->getNumInputs(), 6180 S->getAllConstraints(), S->getClobbers(), 6181 TransformedExprs, S->getEndLoc()); 6182 } 6183 6184 template<typename Derived> 6185 StmtResult 6186 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 6187 // Transform the body of the @try. 6188 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 6189 if (TryBody.isInvalid()) 6190 return StmtError(); 6191 6192 // Transform the @catch statements (if present). 6193 bool AnyCatchChanged = false; 6194 SmallVector<Stmt*, 8> CatchStmts; 6195 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 6196 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 6197 if (Catch.isInvalid()) 6198 return StmtError(); 6199 if (Catch.get() != S->getCatchStmt(I)) 6200 AnyCatchChanged = true; 6201 CatchStmts.push_back(Catch.get()); 6202 } 6203 6204 // Transform the @finally statement (if present). 6205 StmtResult Finally; 6206 if (S->getFinallyStmt()) { 6207 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 6208 if (Finally.isInvalid()) 6209 return StmtError(); 6210 } 6211 6212 // If nothing changed, just retain this statement. 6213 if (!getDerived().AlwaysRebuild() && 6214 TryBody.get() == S->getTryBody() && 6215 !AnyCatchChanged && 6216 Finally.get() == S->getFinallyStmt()) 6217 return S; 6218 6219 // Build a new statement. 6220 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 6221 CatchStmts, Finally.get()); 6222 } 6223 6224 template<typename Derived> 6225 StmtResult 6226 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 6227 // Transform the @catch parameter, if there is one. 6228 VarDecl *Var = nullptr; 6229 if (VarDecl *FromVar = S->getCatchParamDecl()) { 6230 TypeSourceInfo *TSInfo = nullptr; 6231 if (FromVar->getTypeSourceInfo()) { 6232 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 6233 if (!TSInfo) 6234 return StmtError(); 6235 } 6236 6237 QualType T; 6238 if (TSInfo) 6239 T = TSInfo->getType(); 6240 else { 6241 T = getDerived().TransformType(FromVar->getType()); 6242 if (T.isNull()) 6243 return StmtError(); 6244 } 6245 6246 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 6247 if (!Var) 6248 return StmtError(); 6249 } 6250 6251 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 6252 if (Body.isInvalid()) 6253 return StmtError(); 6254 6255 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 6256 S->getRParenLoc(), 6257 Var, Body.get()); 6258 } 6259 6260 template<typename Derived> 6261 StmtResult 6262 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 6263 // Transform the body. 6264 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 6265 if (Body.isInvalid()) 6266 return StmtError(); 6267 6268 // If nothing changed, just retain this statement. 6269 if (!getDerived().AlwaysRebuild() && 6270 Body.get() == S->getFinallyBody()) 6271 return S; 6272 6273 // Build a new statement. 6274 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 6275 Body.get()); 6276 } 6277 6278 template<typename Derived> 6279 StmtResult 6280 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 6281 ExprResult Operand; 6282 if (S->getThrowExpr()) { 6283 Operand = getDerived().TransformExpr(S->getThrowExpr()); 6284 if (Operand.isInvalid()) 6285 return StmtError(); 6286 } 6287 6288 if (!getDerived().AlwaysRebuild() && 6289 Operand.get() == S->getThrowExpr()) 6290 return S; 6291 6292 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 6293 } 6294 6295 template<typename Derived> 6296 StmtResult 6297 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 6298 ObjCAtSynchronizedStmt *S) { 6299 // Transform the object we are locking. 6300 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 6301 if (Object.isInvalid()) 6302 return StmtError(); 6303 Object = 6304 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 6305 Object.get()); 6306 if (Object.isInvalid()) 6307 return StmtError(); 6308 6309 // Transform the body. 6310 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 6311 if (Body.isInvalid()) 6312 return StmtError(); 6313 6314 // If nothing change, just retain the current statement. 6315 if (!getDerived().AlwaysRebuild() && 6316 Object.get() == S->getSynchExpr() && 6317 Body.get() == S->getSynchBody()) 6318 return S; 6319 6320 // Build a new statement. 6321 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 6322 Object.get(), Body.get()); 6323 } 6324 6325 template<typename Derived> 6326 StmtResult 6327 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 6328 ObjCAutoreleasePoolStmt *S) { 6329 // Transform the body. 6330 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 6331 if (Body.isInvalid()) 6332 return StmtError(); 6333 6334 // If nothing changed, just retain this statement. 6335 if (!getDerived().AlwaysRebuild() && 6336 Body.get() == S->getSubStmt()) 6337 return S; 6338 6339 // Build a new statement. 6340 return getDerived().RebuildObjCAutoreleasePoolStmt( 6341 S->getAtLoc(), Body.get()); 6342 } 6343 6344 template<typename Derived> 6345 StmtResult 6346 TreeTransform<Derived>::TransformObjCForCollectionStmt( 6347 ObjCForCollectionStmt *S) { 6348 // Transform the element statement. 6349 StmtResult Element = getDerived().TransformStmt(S->getElement()); 6350 if (Element.isInvalid()) 6351 return StmtError(); 6352 6353 // Transform the collection expression. 6354 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 6355 if (Collection.isInvalid()) 6356 return StmtError(); 6357 6358 // Transform the body. 6359 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6360 if (Body.isInvalid()) 6361 return StmtError(); 6362 6363 // If nothing changed, just retain this statement. 6364 if (!getDerived().AlwaysRebuild() && 6365 Element.get() == S->getElement() && 6366 Collection.get() == S->getCollection() && 6367 Body.get() == S->getBody()) 6368 return S; 6369 6370 // Build a new statement. 6371 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 6372 Element.get(), 6373 Collection.get(), 6374 S->getRParenLoc(), 6375 Body.get()); 6376 } 6377 6378 template <typename Derived> 6379 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 6380 // Transform the exception declaration, if any. 6381 VarDecl *Var = nullptr; 6382 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 6383 TypeSourceInfo *T = 6384 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 6385 if (!T) 6386 return StmtError(); 6387 6388 Var = getDerived().RebuildExceptionDecl( 6389 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 6390 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 6391 if (!Var || Var->isInvalidDecl()) 6392 return StmtError(); 6393 } 6394 6395 // Transform the actual exception handler. 6396 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 6397 if (Handler.isInvalid()) 6398 return StmtError(); 6399 6400 if (!getDerived().AlwaysRebuild() && !Var && 6401 Handler.get() == S->getHandlerBlock()) 6402 return S; 6403 6404 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 6405 } 6406 6407 template <typename Derived> 6408 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 6409 // Transform the try block itself. 6410 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 6411 if (TryBlock.isInvalid()) 6412 return StmtError(); 6413 6414 // Transform the handlers. 6415 bool HandlerChanged = false; 6416 SmallVector<Stmt *, 8> Handlers; 6417 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 6418 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 6419 if (Handler.isInvalid()) 6420 return StmtError(); 6421 6422 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 6423 Handlers.push_back(Handler.getAs<Stmt>()); 6424 } 6425 6426 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 6427 !HandlerChanged) 6428 return S; 6429 6430 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 6431 Handlers); 6432 } 6433 6434 template<typename Derived> 6435 StmtResult 6436 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 6437 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 6438 if (Range.isInvalid()) 6439 return StmtError(); 6440 6441 StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt()); 6442 if (BeginEnd.isInvalid()) 6443 return StmtError(); 6444 6445 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6446 if (Cond.isInvalid()) 6447 return StmtError(); 6448 if (Cond.get()) 6449 Cond = SemaRef.CheckBooleanCondition(Cond.get(), S->getColonLoc()); 6450 if (Cond.isInvalid()) 6451 return StmtError(); 6452 if (Cond.get()) 6453 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 6454 6455 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6456 if (Inc.isInvalid()) 6457 return StmtError(); 6458 if (Inc.get()) 6459 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 6460 6461 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 6462 if (LoopVar.isInvalid()) 6463 return StmtError(); 6464 6465 StmtResult NewStmt = S; 6466 if (getDerived().AlwaysRebuild() || 6467 Range.get() != S->getRangeStmt() || 6468 BeginEnd.get() != S->getBeginEndStmt() || 6469 Cond.get() != S->getCond() || 6470 Inc.get() != S->getInc() || 6471 LoopVar.get() != S->getLoopVarStmt()) { 6472 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6473 S->getColonLoc(), Range.get(), 6474 BeginEnd.get(), Cond.get(), 6475 Inc.get(), LoopVar.get(), 6476 S->getRParenLoc()); 6477 if (NewStmt.isInvalid()) 6478 return StmtError(); 6479 } 6480 6481 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6482 if (Body.isInvalid()) 6483 return StmtError(); 6484 6485 // Body has changed but we didn't rebuild the for-range statement. Rebuild 6486 // it now so we have a new statement to attach the body to. 6487 if (Body.get() != S->getBody() && NewStmt.get() == S) { 6488 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6489 S->getColonLoc(), Range.get(), 6490 BeginEnd.get(), Cond.get(), 6491 Inc.get(), LoopVar.get(), 6492 S->getRParenLoc()); 6493 if (NewStmt.isInvalid()) 6494 return StmtError(); 6495 } 6496 6497 if (NewStmt.get() == S) 6498 return S; 6499 6500 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 6501 } 6502 6503 template<typename Derived> 6504 StmtResult 6505 TreeTransform<Derived>::TransformMSDependentExistsStmt( 6506 MSDependentExistsStmt *S) { 6507 // Transform the nested-name-specifier, if any. 6508 NestedNameSpecifierLoc QualifierLoc; 6509 if (S->getQualifierLoc()) { 6510 QualifierLoc 6511 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 6512 if (!QualifierLoc) 6513 return StmtError(); 6514 } 6515 6516 // Transform the declaration name. 6517 DeclarationNameInfo NameInfo = S->getNameInfo(); 6518 if (NameInfo.getName()) { 6519 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6520 if (!NameInfo.getName()) 6521 return StmtError(); 6522 } 6523 6524 // Check whether anything changed. 6525 if (!getDerived().AlwaysRebuild() && 6526 QualifierLoc == S->getQualifierLoc() && 6527 NameInfo.getName() == S->getNameInfo().getName()) 6528 return S; 6529 6530 // Determine whether this name exists, if we can. 6531 CXXScopeSpec SS; 6532 SS.Adopt(QualifierLoc); 6533 bool Dependent = false; 6534 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 6535 case Sema::IER_Exists: 6536 if (S->isIfExists()) 6537 break; 6538 6539 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6540 6541 case Sema::IER_DoesNotExist: 6542 if (S->isIfNotExists()) 6543 break; 6544 6545 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6546 6547 case Sema::IER_Dependent: 6548 Dependent = true; 6549 break; 6550 6551 case Sema::IER_Error: 6552 return StmtError(); 6553 } 6554 6555 // We need to continue with the instantiation, so do so now. 6556 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 6557 if (SubStmt.isInvalid()) 6558 return StmtError(); 6559 6560 // If we have resolved the name, just transform to the substatement. 6561 if (!Dependent) 6562 return SubStmt; 6563 6564 // The name is still dependent, so build a dependent expression again. 6565 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 6566 S->isIfExists(), 6567 QualifierLoc, 6568 NameInfo, 6569 SubStmt.get()); 6570 } 6571 6572 template<typename Derived> 6573 ExprResult 6574 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 6575 NestedNameSpecifierLoc QualifierLoc; 6576 if (E->getQualifierLoc()) { 6577 QualifierLoc 6578 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6579 if (!QualifierLoc) 6580 return ExprError(); 6581 } 6582 6583 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 6584 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 6585 if (!PD) 6586 return ExprError(); 6587 6588 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 6589 if (Base.isInvalid()) 6590 return ExprError(); 6591 6592 return new (SemaRef.getASTContext()) 6593 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 6594 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 6595 QualifierLoc, E->getMemberLoc()); 6596 } 6597 6598 template <typename Derived> 6599 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 6600 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 6601 if (TryBlock.isInvalid()) 6602 return StmtError(); 6603 6604 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 6605 if (Handler.isInvalid()) 6606 return StmtError(); 6607 6608 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 6609 Handler.get() == S->getHandler()) 6610 return S; 6611 6612 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 6613 TryBlock.get(), Handler.get()); 6614 } 6615 6616 template <typename Derived> 6617 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 6618 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 6619 if (Block.isInvalid()) 6620 return StmtError(); 6621 6622 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 6623 } 6624 6625 template <typename Derived> 6626 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 6627 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 6628 if (FilterExpr.isInvalid()) 6629 return StmtError(); 6630 6631 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 6632 if (Block.isInvalid()) 6633 return StmtError(); 6634 6635 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 6636 Block.get()); 6637 } 6638 6639 template <typename Derived> 6640 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 6641 if (isa<SEHFinallyStmt>(Handler)) 6642 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 6643 else 6644 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 6645 } 6646 6647 template<typename Derived> 6648 StmtResult 6649 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 6650 return S; 6651 } 6652 6653 //===----------------------------------------------------------------------===// 6654 // OpenMP directive transformation 6655 //===----------------------------------------------------------------------===// 6656 template <typename Derived> 6657 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 6658 OMPExecutableDirective *D) { 6659 6660 // Transform the clauses 6661 llvm::SmallVector<OMPClause *, 16> TClauses; 6662 ArrayRef<OMPClause *> Clauses = D->clauses(); 6663 TClauses.reserve(Clauses.size()); 6664 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 6665 I != E; ++I) { 6666 if (*I) { 6667 OMPClause *Clause = getDerived().TransformOMPClause(*I); 6668 if (Clause) 6669 TClauses.push_back(Clause); 6670 } else { 6671 TClauses.push_back(nullptr); 6672 } 6673 } 6674 StmtResult AssociatedStmt; 6675 if (D->hasAssociatedStmt()) { 6676 if (!D->getAssociatedStmt()) { 6677 return StmtError(); 6678 } 6679 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 6680 /*CurScope=*/nullptr); 6681 StmtResult Body; 6682 { 6683 Sema::CompoundScopeRAII CompoundScope(getSema()); 6684 Body = getDerived().TransformStmt( 6685 cast<CapturedStmt>(D->getAssociatedStmt())->getCapturedStmt()); 6686 } 6687 AssociatedStmt = 6688 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 6689 if (AssociatedStmt.isInvalid()) { 6690 return StmtError(); 6691 } 6692 } 6693 if (TClauses.size() != Clauses.size()) { 6694 return StmtError(); 6695 } 6696 6697 // Transform directive name for 'omp critical' directive. 6698 DeclarationNameInfo DirName; 6699 if (D->getDirectiveKind() == OMPD_critical) { 6700 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 6701 DirName = getDerived().TransformDeclarationNameInfo(DirName); 6702 } 6703 6704 return getDerived().RebuildOMPExecutableDirective( 6705 D->getDirectiveKind(), DirName, TClauses, AssociatedStmt.get(), 6706 D->getLocStart(), D->getLocEnd()); 6707 } 6708 6709 template <typename Derived> 6710 StmtResult 6711 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 6712 DeclarationNameInfo DirName; 6713 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 6714 D->getLocStart()); 6715 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6716 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6717 return Res; 6718 } 6719 6720 template <typename Derived> 6721 StmtResult 6722 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 6723 DeclarationNameInfo DirName; 6724 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 6725 D->getLocStart()); 6726 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6727 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6728 return Res; 6729 } 6730 6731 template <typename Derived> 6732 StmtResult 6733 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 6734 DeclarationNameInfo DirName; 6735 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 6736 D->getLocStart()); 6737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6739 return Res; 6740 } 6741 6742 template <typename Derived> 6743 StmtResult 6744 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 6745 DeclarationNameInfo DirName; 6746 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 6747 D->getLocStart()); 6748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6750 return Res; 6751 } 6752 6753 template <typename Derived> 6754 StmtResult 6755 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 6756 DeclarationNameInfo DirName; 6757 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 6758 D->getLocStart()); 6759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6761 return Res; 6762 } 6763 6764 template <typename Derived> 6765 StmtResult 6766 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 6767 DeclarationNameInfo DirName; 6768 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 6769 D->getLocStart()); 6770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6772 return Res; 6773 } 6774 6775 template <typename Derived> 6776 StmtResult 6777 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 6778 DeclarationNameInfo DirName; 6779 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 6780 D->getLocStart()); 6781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6783 return Res; 6784 } 6785 6786 template <typename Derived> 6787 StmtResult 6788 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 6789 DeclarationNameInfo DirName; 6790 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 6791 D->getLocStart()); 6792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6794 return Res; 6795 } 6796 6797 template <typename Derived> 6798 StmtResult 6799 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 6800 getDerived().getSema().StartOpenMPDSABlock( 6801 OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart()); 6802 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6803 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6804 return Res; 6805 } 6806 6807 template <typename Derived> 6808 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 6809 OMPParallelForDirective *D) { 6810 DeclarationNameInfo DirName; 6811 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 6812 nullptr, D->getLocStart()); 6813 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6814 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6815 return Res; 6816 } 6817 6818 template <typename Derived> 6819 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 6820 OMPParallelForSimdDirective *D) { 6821 DeclarationNameInfo DirName; 6822 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 6823 nullptr, D->getLocStart()); 6824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6826 return Res; 6827 } 6828 6829 template <typename Derived> 6830 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 6831 OMPParallelSectionsDirective *D) { 6832 DeclarationNameInfo DirName; 6833 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 6834 nullptr, D->getLocStart()); 6835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6837 return Res; 6838 } 6839 6840 template <typename Derived> 6841 StmtResult 6842 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 6843 DeclarationNameInfo DirName; 6844 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 6845 D->getLocStart()); 6846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6848 return Res; 6849 } 6850 6851 template <typename Derived> 6852 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 6853 OMPTaskyieldDirective *D) { 6854 DeclarationNameInfo DirName; 6855 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 6856 D->getLocStart()); 6857 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6858 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6859 return Res; 6860 } 6861 6862 template <typename Derived> 6863 StmtResult 6864 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 6865 DeclarationNameInfo DirName; 6866 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 6867 D->getLocStart()); 6868 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6869 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6870 return Res; 6871 } 6872 6873 template <typename Derived> 6874 StmtResult 6875 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 6876 DeclarationNameInfo DirName; 6877 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 6878 D->getLocStart()); 6879 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6880 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6881 return Res; 6882 } 6883 6884 template <typename Derived> 6885 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 6886 OMPTaskgroupDirective *D) { 6887 DeclarationNameInfo DirName; 6888 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 6889 D->getLocStart()); 6890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6892 return Res; 6893 } 6894 6895 template <typename Derived> 6896 StmtResult 6897 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 6898 DeclarationNameInfo DirName; 6899 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 6900 D->getLocStart()); 6901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6903 return Res; 6904 } 6905 6906 template <typename Derived> 6907 StmtResult 6908 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 6909 DeclarationNameInfo DirName; 6910 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 6911 D->getLocStart()); 6912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6914 return Res; 6915 } 6916 6917 template <typename Derived> 6918 StmtResult 6919 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 6920 DeclarationNameInfo DirName; 6921 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 6922 D->getLocStart()); 6923 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6925 return Res; 6926 } 6927 6928 template <typename Derived> 6929 StmtResult 6930 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 6931 DeclarationNameInfo DirName; 6932 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 6933 D->getLocStart()); 6934 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6935 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6936 return Res; 6937 } 6938 6939 template <typename Derived> 6940 StmtResult 6941 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 6942 DeclarationNameInfo DirName; 6943 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 6944 D->getLocStart()); 6945 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 6946 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 6947 return Res; 6948 } 6949 6950 //===----------------------------------------------------------------------===// 6951 // OpenMP clause transformation 6952 //===----------------------------------------------------------------------===// 6953 template <typename Derived> 6954 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 6955 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 6956 if (Cond.isInvalid()) 6957 return nullptr; 6958 return getDerived().RebuildOMPIfClause(Cond.get(), C->getLocStart(), 6959 C->getLParenLoc(), C->getLocEnd()); 6960 } 6961 6962 template <typename Derived> 6963 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 6964 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 6965 if (Cond.isInvalid()) 6966 return nullptr; 6967 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(), 6968 C->getLParenLoc(), C->getLocEnd()); 6969 } 6970 6971 template <typename Derived> 6972 OMPClause * 6973 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 6974 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 6975 if (NumThreads.isInvalid()) 6976 return nullptr; 6977 return getDerived().RebuildOMPNumThreadsClause( 6978 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 6979 } 6980 6981 template <typename Derived> 6982 OMPClause * 6983 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 6984 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 6985 if (E.isInvalid()) 6986 return nullptr; 6987 return getDerived().RebuildOMPSafelenClause( 6988 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 6989 } 6990 6991 template <typename Derived> 6992 OMPClause * 6993 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 6994 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 6995 if (E.isInvalid()) 6996 return 0; 6997 return getDerived().RebuildOMPCollapseClause( 6998 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 6999 } 7000 7001 template <typename Derived> 7002 OMPClause * 7003 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 7004 return getDerived().RebuildOMPDefaultClause( 7005 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(), 7006 C->getLParenLoc(), C->getLocEnd()); 7007 } 7008 7009 template <typename Derived> 7010 OMPClause * 7011 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 7012 return getDerived().RebuildOMPProcBindClause( 7013 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(), 7014 C->getLParenLoc(), C->getLocEnd()); 7015 } 7016 7017 template <typename Derived> 7018 OMPClause * 7019 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 7020 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 7021 if (E.isInvalid()) 7022 return nullptr; 7023 return getDerived().RebuildOMPScheduleClause( 7024 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 7025 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 7026 } 7027 7028 template <typename Derived> 7029 OMPClause * 7030 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 7031 // No need to rebuild this clause, no template-dependent parameters. 7032 return C; 7033 } 7034 7035 template <typename Derived> 7036 OMPClause * 7037 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 7038 // No need to rebuild this clause, no template-dependent parameters. 7039 return C; 7040 } 7041 7042 template <typename Derived> 7043 OMPClause * 7044 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 7045 // No need to rebuild this clause, no template-dependent parameters. 7046 return C; 7047 } 7048 7049 template <typename Derived> 7050 OMPClause * 7051 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 7052 // No need to rebuild this clause, no template-dependent parameters. 7053 return C; 7054 } 7055 7056 template <typename Derived> 7057 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 7058 // No need to rebuild this clause, no template-dependent parameters. 7059 return C; 7060 } 7061 7062 template <typename Derived> 7063 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 7064 // No need to rebuild this clause, no template-dependent parameters. 7065 return C; 7066 } 7067 7068 template <typename Derived> 7069 OMPClause * 7070 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 7071 // No need to rebuild this clause, no template-dependent parameters. 7072 return C; 7073 } 7074 7075 template <typename Derived> 7076 OMPClause * 7077 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 7078 // No need to rebuild this clause, no template-dependent parameters. 7079 return C; 7080 } 7081 7082 template <typename Derived> 7083 OMPClause * 7084 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 7085 // No need to rebuild this clause, no template-dependent parameters. 7086 return C; 7087 } 7088 7089 template <typename Derived> 7090 OMPClause * 7091 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 7092 llvm::SmallVector<Expr *, 16> Vars; 7093 Vars.reserve(C->varlist_size()); 7094 for (auto *VE : C->varlists()) { 7095 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7096 if (EVar.isInvalid()) 7097 return nullptr; 7098 Vars.push_back(EVar.get()); 7099 } 7100 return getDerived().RebuildOMPPrivateClause( 7101 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7102 } 7103 7104 template <typename Derived> 7105 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 7106 OMPFirstprivateClause *C) { 7107 llvm::SmallVector<Expr *, 16> Vars; 7108 Vars.reserve(C->varlist_size()); 7109 for (auto *VE : C->varlists()) { 7110 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7111 if (EVar.isInvalid()) 7112 return nullptr; 7113 Vars.push_back(EVar.get()); 7114 } 7115 return getDerived().RebuildOMPFirstprivateClause( 7116 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7117 } 7118 7119 template <typename Derived> 7120 OMPClause * 7121 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 7122 llvm::SmallVector<Expr *, 16> Vars; 7123 Vars.reserve(C->varlist_size()); 7124 for (auto *VE : C->varlists()) { 7125 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7126 if (EVar.isInvalid()) 7127 return nullptr; 7128 Vars.push_back(EVar.get()); 7129 } 7130 return getDerived().RebuildOMPLastprivateClause( 7131 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7132 } 7133 7134 template <typename Derived> 7135 OMPClause * 7136 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 7137 llvm::SmallVector<Expr *, 16> Vars; 7138 Vars.reserve(C->varlist_size()); 7139 for (auto *VE : C->varlists()) { 7140 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7141 if (EVar.isInvalid()) 7142 return nullptr; 7143 Vars.push_back(EVar.get()); 7144 } 7145 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(), 7146 C->getLParenLoc(), C->getLocEnd()); 7147 } 7148 7149 template <typename Derived> 7150 OMPClause * 7151 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 7152 llvm::SmallVector<Expr *, 16> Vars; 7153 Vars.reserve(C->varlist_size()); 7154 for (auto *VE : C->varlists()) { 7155 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7156 if (EVar.isInvalid()) 7157 return nullptr; 7158 Vars.push_back(EVar.get()); 7159 } 7160 CXXScopeSpec ReductionIdScopeSpec; 7161 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 7162 7163 DeclarationNameInfo NameInfo = C->getNameInfo(); 7164 if (NameInfo.getName()) { 7165 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7166 if (!NameInfo.getName()) 7167 return nullptr; 7168 } 7169 return getDerived().RebuildOMPReductionClause( 7170 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 7171 C->getLocEnd(), ReductionIdScopeSpec, NameInfo); 7172 } 7173 7174 template <typename Derived> 7175 OMPClause * 7176 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 7177 llvm::SmallVector<Expr *, 16> Vars; 7178 Vars.reserve(C->varlist_size()); 7179 for (auto *VE : C->varlists()) { 7180 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7181 if (EVar.isInvalid()) 7182 return nullptr; 7183 Vars.push_back(EVar.get()); 7184 } 7185 ExprResult Step = getDerived().TransformExpr(C->getStep()); 7186 if (Step.isInvalid()) 7187 return nullptr; 7188 return getDerived().RebuildOMPLinearClause(Vars, Step.get(), C->getLocStart(), 7189 C->getLParenLoc(), 7190 C->getColonLoc(), C->getLocEnd()); 7191 } 7192 7193 template <typename Derived> 7194 OMPClause * 7195 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 7196 llvm::SmallVector<Expr *, 16> Vars; 7197 Vars.reserve(C->varlist_size()); 7198 for (auto *VE : C->varlists()) { 7199 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7200 if (EVar.isInvalid()) 7201 return nullptr; 7202 Vars.push_back(EVar.get()); 7203 } 7204 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 7205 if (Alignment.isInvalid()) 7206 return nullptr; 7207 return getDerived().RebuildOMPAlignedClause( 7208 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(), 7209 C->getColonLoc(), C->getLocEnd()); 7210 } 7211 7212 template <typename Derived> 7213 OMPClause * 7214 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 7215 llvm::SmallVector<Expr *, 16> Vars; 7216 Vars.reserve(C->varlist_size()); 7217 for (auto *VE : C->varlists()) { 7218 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7219 if (EVar.isInvalid()) 7220 return nullptr; 7221 Vars.push_back(EVar.get()); 7222 } 7223 return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(), 7224 C->getLParenLoc(), C->getLocEnd()); 7225 } 7226 7227 template <typename Derived> 7228 OMPClause * 7229 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 7230 llvm::SmallVector<Expr *, 16> Vars; 7231 Vars.reserve(C->varlist_size()); 7232 for (auto *VE : C->varlists()) { 7233 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7234 if (EVar.isInvalid()) 7235 return nullptr; 7236 Vars.push_back(EVar.get()); 7237 } 7238 return getDerived().RebuildOMPCopyprivateClause( 7239 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 7240 } 7241 7242 template <typename Derived> 7243 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 7244 llvm::SmallVector<Expr *, 16> Vars; 7245 Vars.reserve(C->varlist_size()); 7246 for (auto *VE : C->varlists()) { 7247 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 7248 if (EVar.isInvalid()) 7249 return nullptr; 7250 Vars.push_back(EVar.get()); 7251 } 7252 return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(), 7253 C->getLParenLoc(), C->getLocEnd()); 7254 } 7255 7256 //===----------------------------------------------------------------------===// 7257 // Expression transformation 7258 //===----------------------------------------------------------------------===// 7259 template<typename Derived> 7260 ExprResult 7261 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 7262 if (!E->isTypeDependent()) 7263 return E; 7264 7265 return getDerived().RebuildPredefinedExpr(E->getLocation(), 7266 E->getIdentType()); 7267 } 7268 7269 template<typename Derived> 7270 ExprResult 7271 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 7272 NestedNameSpecifierLoc QualifierLoc; 7273 if (E->getQualifierLoc()) { 7274 QualifierLoc 7275 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7276 if (!QualifierLoc) 7277 return ExprError(); 7278 } 7279 7280 ValueDecl *ND 7281 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 7282 E->getDecl())); 7283 if (!ND) 7284 return ExprError(); 7285 7286 DeclarationNameInfo NameInfo = E->getNameInfo(); 7287 if (NameInfo.getName()) { 7288 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7289 if (!NameInfo.getName()) 7290 return ExprError(); 7291 } 7292 7293 if (!getDerived().AlwaysRebuild() && 7294 QualifierLoc == E->getQualifierLoc() && 7295 ND == E->getDecl() && 7296 NameInfo.getName() == E->getDecl()->getDeclName() && 7297 !E->hasExplicitTemplateArgs()) { 7298 7299 // Mark it referenced in the new context regardless. 7300 // FIXME: this is a bit instantiation-specific. 7301 SemaRef.MarkDeclRefReferenced(E); 7302 7303 return E; 7304 } 7305 7306 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 7307 if (E->hasExplicitTemplateArgs()) { 7308 TemplateArgs = &TransArgs; 7309 TransArgs.setLAngleLoc(E->getLAngleLoc()); 7310 TransArgs.setRAngleLoc(E->getRAngleLoc()); 7311 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7312 E->getNumTemplateArgs(), 7313 TransArgs)) 7314 return ExprError(); 7315 } 7316 7317 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 7318 TemplateArgs); 7319 } 7320 7321 template<typename Derived> 7322 ExprResult 7323 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 7324 return E; 7325 } 7326 7327 template<typename Derived> 7328 ExprResult 7329 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 7330 return E; 7331 } 7332 7333 template<typename Derived> 7334 ExprResult 7335 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 7336 return E; 7337 } 7338 7339 template<typename Derived> 7340 ExprResult 7341 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 7342 return E; 7343 } 7344 7345 template<typename Derived> 7346 ExprResult 7347 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 7348 return E; 7349 } 7350 7351 template<typename Derived> 7352 ExprResult 7353 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 7354 if (FunctionDecl *FD = E->getDirectCallee()) 7355 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 7356 return SemaRef.MaybeBindToTemporary(E); 7357 } 7358 7359 template<typename Derived> 7360 ExprResult 7361 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 7362 ExprResult ControllingExpr = 7363 getDerived().TransformExpr(E->getControllingExpr()); 7364 if (ControllingExpr.isInvalid()) 7365 return ExprError(); 7366 7367 SmallVector<Expr *, 4> AssocExprs; 7368 SmallVector<TypeSourceInfo *, 4> AssocTypes; 7369 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 7370 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 7371 if (TS) { 7372 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 7373 if (!AssocType) 7374 return ExprError(); 7375 AssocTypes.push_back(AssocType); 7376 } else { 7377 AssocTypes.push_back(nullptr); 7378 } 7379 7380 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 7381 if (AssocExpr.isInvalid()) 7382 return ExprError(); 7383 AssocExprs.push_back(AssocExpr.get()); 7384 } 7385 7386 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 7387 E->getDefaultLoc(), 7388 E->getRParenLoc(), 7389 ControllingExpr.get(), 7390 AssocTypes, 7391 AssocExprs); 7392 } 7393 7394 template<typename Derived> 7395 ExprResult 7396 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 7397 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 7398 if (SubExpr.isInvalid()) 7399 return ExprError(); 7400 7401 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 7402 return E; 7403 7404 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 7405 E->getRParen()); 7406 } 7407 7408 /// \brief The operand of a unary address-of operator has special rules: it's 7409 /// allowed to refer to a non-static member of a class even if there's no 'this' 7410 /// object available. 7411 template<typename Derived> 7412 ExprResult 7413 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 7414 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 7415 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 7416 else 7417 return getDerived().TransformExpr(E); 7418 } 7419 7420 template<typename Derived> 7421 ExprResult 7422 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 7423 ExprResult SubExpr; 7424 if (E->getOpcode() == UO_AddrOf) 7425 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 7426 else 7427 SubExpr = TransformExpr(E->getSubExpr()); 7428 if (SubExpr.isInvalid()) 7429 return ExprError(); 7430 7431 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 7432 return E; 7433 7434 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 7435 E->getOpcode(), 7436 SubExpr.get()); 7437 } 7438 7439 template<typename Derived> 7440 ExprResult 7441 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 7442 // Transform the type. 7443 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 7444 if (!Type) 7445 return ExprError(); 7446 7447 // Transform all of the components into components similar to what the 7448 // parser uses. 7449 // FIXME: It would be slightly more efficient in the non-dependent case to 7450 // just map FieldDecls, rather than requiring the rebuilder to look for 7451 // the fields again. However, __builtin_offsetof is rare enough in 7452 // template code that we don't care. 7453 bool ExprChanged = false; 7454 typedef Sema::OffsetOfComponent Component; 7455 typedef OffsetOfExpr::OffsetOfNode Node; 7456 SmallVector<Component, 4> Components; 7457 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 7458 const Node &ON = E->getComponent(I); 7459 Component Comp; 7460 Comp.isBrackets = true; 7461 Comp.LocStart = ON.getSourceRange().getBegin(); 7462 Comp.LocEnd = ON.getSourceRange().getEnd(); 7463 switch (ON.getKind()) { 7464 case Node::Array: { 7465 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 7466 ExprResult Index = getDerived().TransformExpr(FromIndex); 7467 if (Index.isInvalid()) 7468 return ExprError(); 7469 7470 ExprChanged = ExprChanged || Index.get() != FromIndex; 7471 Comp.isBrackets = true; 7472 Comp.U.E = Index.get(); 7473 break; 7474 } 7475 7476 case Node::Field: 7477 case Node::Identifier: 7478 Comp.isBrackets = false; 7479 Comp.U.IdentInfo = ON.getFieldName(); 7480 if (!Comp.U.IdentInfo) 7481 continue; 7482 7483 break; 7484 7485 case Node::Base: 7486 // Will be recomputed during the rebuild. 7487 continue; 7488 } 7489 7490 Components.push_back(Comp); 7491 } 7492 7493 // If nothing changed, retain the existing expression. 7494 if (!getDerived().AlwaysRebuild() && 7495 Type == E->getTypeSourceInfo() && 7496 !ExprChanged) 7497 return E; 7498 7499 // Build a new offsetof expression. 7500 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 7501 Components.data(), Components.size(), 7502 E->getRParenLoc()); 7503 } 7504 7505 template<typename Derived> 7506 ExprResult 7507 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 7508 assert(getDerived().AlreadyTransformed(E->getType()) && 7509 "opaque value expression requires transformation"); 7510 return E; 7511 } 7512 7513 template<typename Derived> 7514 ExprResult 7515 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 7516 return E; 7517 } 7518 7519 template<typename Derived> 7520 ExprResult 7521 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 7522 // Rebuild the syntactic form. The original syntactic form has 7523 // opaque-value expressions in it, so strip those away and rebuild 7524 // the result. This is a really awful way of doing this, but the 7525 // better solution (rebuilding the semantic expressions and 7526 // rebinding OVEs as necessary) doesn't work; we'd need 7527 // TreeTransform to not strip away implicit conversions. 7528 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 7529 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 7530 if (result.isInvalid()) return ExprError(); 7531 7532 // If that gives us a pseudo-object result back, the pseudo-object 7533 // expression must have been an lvalue-to-rvalue conversion which we 7534 // should reapply. 7535 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 7536 result = SemaRef.checkPseudoObjectRValue(result.get()); 7537 7538 return result; 7539 } 7540 7541 template<typename Derived> 7542 ExprResult 7543 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 7544 UnaryExprOrTypeTraitExpr *E) { 7545 if (E->isArgumentType()) { 7546 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 7547 7548 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 7549 if (!NewT) 7550 return ExprError(); 7551 7552 if (!getDerived().AlwaysRebuild() && OldT == NewT) 7553 return E; 7554 7555 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 7556 E->getKind(), 7557 E->getSourceRange()); 7558 } 7559 7560 // C++0x [expr.sizeof]p1: 7561 // The operand is either an expression, which is an unevaluated operand 7562 // [...] 7563 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 7564 Sema::ReuseLambdaContextDecl); 7565 7566 // Try to recover if we have something like sizeof(T::X) where X is a type. 7567 // Notably, there must be *exactly* one set of parens if X is a type. 7568 TypeSourceInfo *RecoveryTSI = nullptr; 7569 ExprResult SubExpr; 7570 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 7571 if (auto *DRE = 7572 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 7573 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 7574 PE, DRE, false, &RecoveryTSI); 7575 else 7576 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 7577 7578 if (RecoveryTSI) { 7579 return getDerived().RebuildUnaryExprOrTypeTrait( 7580 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 7581 } else if (SubExpr.isInvalid()) 7582 return ExprError(); 7583 7584 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 7585 return E; 7586 7587 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 7588 E->getOperatorLoc(), 7589 E->getKind(), 7590 E->getSourceRange()); 7591 } 7592 7593 template<typename Derived> 7594 ExprResult 7595 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 7596 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 7597 if (LHS.isInvalid()) 7598 return ExprError(); 7599 7600 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 7601 if (RHS.isInvalid()) 7602 return ExprError(); 7603 7604 7605 if (!getDerived().AlwaysRebuild() && 7606 LHS.get() == E->getLHS() && 7607 RHS.get() == E->getRHS()) 7608 return E; 7609 7610 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 7611 /*FIXME:*/E->getLHS()->getLocStart(), 7612 RHS.get(), 7613 E->getRBracketLoc()); 7614 } 7615 7616 template<typename Derived> 7617 ExprResult 7618 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 7619 // Transform the callee. 7620 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 7621 if (Callee.isInvalid()) 7622 return ExprError(); 7623 7624 // Transform arguments. 7625 bool ArgChanged = false; 7626 SmallVector<Expr*, 8> Args; 7627 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 7628 &ArgChanged)) 7629 return ExprError(); 7630 7631 if (!getDerived().AlwaysRebuild() && 7632 Callee.get() == E->getCallee() && 7633 !ArgChanged) 7634 return SemaRef.MaybeBindToTemporary(E); 7635 7636 // FIXME: Wrong source location information for the '('. 7637 SourceLocation FakeLParenLoc 7638 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 7639 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 7640 Args, 7641 E->getRParenLoc()); 7642 } 7643 7644 template<typename Derived> 7645 ExprResult 7646 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 7647 ExprResult Base = getDerived().TransformExpr(E->getBase()); 7648 if (Base.isInvalid()) 7649 return ExprError(); 7650 7651 NestedNameSpecifierLoc QualifierLoc; 7652 if (E->hasQualifier()) { 7653 QualifierLoc 7654 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7655 7656 if (!QualifierLoc) 7657 return ExprError(); 7658 } 7659 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 7660 7661 ValueDecl *Member 7662 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 7663 E->getMemberDecl())); 7664 if (!Member) 7665 return ExprError(); 7666 7667 NamedDecl *FoundDecl = E->getFoundDecl(); 7668 if (FoundDecl == E->getMemberDecl()) { 7669 FoundDecl = Member; 7670 } else { 7671 FoundDecl = cast_or_null<NamedDecl>( 7672 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 7673 if (!FoundDecl) 7674 return ExprError(); 7675 } 7676 7677 if (!getDerived().AlwaysRebuild() && 7678 Base.get() == E->getBase() && 7679 QualifierLoc == E->getQualifierLoc() && 7680 Member == E->getMemberDecl() && 7681 FoundDecl == E->getFoundDecl() && 7682 !E->hasExplicitTemplateArgs()) { 7683 7684 // Mark it referenced in the new context regardless. 7685 // FIXME: this is a bit instantiation-specific. 7686 SemaRef.MarkMemberReferenced(E); 7687 7688 return E; 7689 } 7690 7691 TemplateArgumentListInfo TransArgs; 7692 if (E->hasExplicitTemplateArgs()) { 7693 TransArgs.setLAngleLoc(E->getLAngleLoc()); 7694 TransArgs.setRAngleLoc(E->getRAngleLoc()); 7695 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 7696 E->getNumTemplateArgs(), 7697 TransArgs)) 7698 return ExprError(); 7699 } 7700 7701 // FIXME: Bogus source location for the operator 7702 SourceLocation FakeOperatorLoc = 7703 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 7704 7705 // FIXME: to do this check properly, we will need to preserve the 7706 // first-qualifier-in-scope here, just in case we had a dependent 7707 // base (and therefore couldn't do the check) and a 7708 // nested-name-qualifier (and therefore could do the lookup). 7709 NamedDecl *FirstQualifierInScope = nullptr; 7710 7711 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 7712 E->isArrow(), 7713 QualifierLoc, 7714 TemplateKWLoc, 7715 E->getMemberNameInfo(), 7716 Member, 7717 FoundDecl, 7718 (E->hasExplicitTemplateArgs() 7719 ? &TransArgs : nullptr), 7720 FirstQualifierInScope); 7721 } 7722 7723 template<typename Derived> 7724 ExprResult 7725 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 7726 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 7727 if (LHS.isInvalid()) 7728 return ExprError(); 7729 7730 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 7731 if (RHS.isInvalid()) 7732 return ExprError(); 7733 7734 if (!getDerived().AlwaysRebuild() && 7735 LHS.get() == E->getLHS() && 7736 RHS.get() == E->getRHS()) 7737 return E; 7738 7739 Sema::FPContractStateRAII FPContractState(getSema()); 7740 getSema().FPFeatures.fp_contract = E->isFPContractable(); 7741 7742 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 7743 LHS.get(), RHS.get()); 7744 } 7745 7746 template<typename Derived> 7747 ExprResult 7748 TreeTransform<Derived>::TransformCompoundAssignOperator( 7749 CompoundAssignOperator *E) { 7750 return getDerived().TransformBinaryOperator(E); 7751 } 7752 7753 template<typename Derived> 7754 ExprResult TreeTransform<Derived>:: 7755 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 7756 // Just rebuild the common and RHS expressions and see whether we 7757 // get any changes. 7758 7759 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 7760 if (commonExpr.isInvalid()) 7761 return ExprError(); 7762 7763 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 7764 if (rhs.isInvalid()) 7765 return ExprError(); 7766 7767 if (!getDerived().AlwaysRebuild() && 7768 commonExpr.get() == e->getCommon() && 7769 rhs.get() == e->getFalseExpr()) 7770 return e; 7771 7772 return getDerived().RebuildConditionalOperator(commonExpr.get(), 7773 e->getQuestionLoc(), 7774 nullptr, 7775 e->getColonLoc(), 7776 rhs.get()); 7777 } 7778 7779 template<typename Derived> 7780 ExprResult 7781 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 7782 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 7783 if (Cond.isInvalid()) 7784 return ExprError(); 7785 7786 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 7787 if (LHS.isInvalid()) 7788 return ExprError(); 7789 7790 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 7791 if (RHS.isInvalid()) 7792 return ExprError(); 7793 7794 if (!getDerived().AlwaysRebuild() && 7795 Cond.get() == E->getCond() && 7796 LHS.get() == E->getLHS() && 7797 RHS.get() == E->getRHS()) 7798 return E; 7799 7800 return getDerived().RebuildConditionalOperator(Cond.get(), 7801 E->getQuestionLoc(), 7802 LHS.get(), 7803 E->getColonLoc(), 7804 RHS.get()); 7805 } 7806 7807 template<typename Derived> 7808 ExprResult 7809 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 7810 // Implicit casts are eliminated during transformation, since they 7811 // will be recomputed by semantic analysis after transformation. 7812 return getDerived().TransformExpr(E->getSubExprAsWritten()); 7813 } 7814 7815 template<typename Derived> 7816 ExprResult 7817 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 7818 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 7819 if (!Type) 7820 return ExprError(); 7821 7822 ExprResult SubExpr 7823 = getDerived().TransformExpr(E->getSubExprAsWritten()); 7824 if (SubExpr.isInvalid()) 7825 return ExprError(); 7826 7827 if (!getDerived().AlwaysRebuild() && 7828 Type == E->getTypeInfoAsWritten() && 7829 SubExpr.get() == E->getSubExpr()) 7830 return E; 7831 7832 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 7833 Type, 7834 E->getRParenLoc(), 7835 SubExpr.get()); 7836 } 7837 7838 template<typename Derived> 7839 ExprResult 7840 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 7841 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 7842 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 7843 if (!NewT) 7844 return ExprError(); 7845 7846 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 7847 if (Init.isInvalid()) 7848 return ExprError(); 7849 7850 if (!getDerived().AlwaysRebuild() && 7851 OldT == NewT && 7852 Init.get() == E->getInitializer()) 7853 return SemaRef.MaybeBindToTemporary(E); 7854 7855 // Note: the expression type doesn't necessarily match the 7856 // type-as-written, but that's okay, because it should always be 7857 // derivable from the initializer. 7858 7859 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 7860 /*FIXME:*/E->getInitializer()->getLocEnd(), 7861 Init.get()); 7862 } 7863 7864 template<typename Derived> 7865 ExprResult 7866 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 7867 ExprResult Base = getDerived().TransformExpr(E->getBase()); 7868 if (Base.isInvalid()) 7869 return ExprError(); 7870 7871 if (!getDerived().AlwaysRebuild() && 7872 Base.get() == E->getBase()) 7873 return E; 7874 7875 // FIXME: Bad source location 7876 SourceLocation FakeOperatorLoc = 7877 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 7878 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 7879 E->getAccessorLoc(), 7880 E->getAccessor()); 7881 } 7882 7883 template<typename Derived> 7884 ExprResult 7885 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 7886 if (InitListExpr *Syntactic = E->getSyntacticForm()) 7887 E = Syntactic; 7888 7889 bool InitChanged = false; 7890 7891 SmallVector<Expr*, 4> Inits; 7892 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 7893 Inits, &InitChanged)) 7894 return ExprError(); 7895 7896 if (!getDerived().AlwaysRebuild() && !InitChanged) { 7897 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 7898 // in some cases. We can't reuse it in general, because the syntactic and 7899 // semantic forms are linked, and we can't know that semantic form will 7900 // match even if the syntactic form does. 7901 } 7902 7903 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 7904 E->getRBraceLoc(), E->getType()); 7905 } 7906 7907 template<typename Derived> 7908 ExprResult 7909 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 7910 Designation Desig; 7911 7912 // transform the initializer value 7913 ExprResult Init = getDerived().TransformExpr(E->getInit()); 7914 if (Init.isInvalid()) 7915 return ExprError(); 7916 7917 // transform the designators. 7918 SmallVector<Expr*, 4> ArrayExprs; 7919 bool ExprChanged = false; 7920 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 7921 DEnd = E->designators_end(); 7922 D != DEnd; ++D) { 7923 if (D->isFieldDesignator()) { 7924 Desig.AddDesignator(Designator::getField(D->getFieldName(), 7925 D->getDotLoc(), 7926 D->getFieldLoc())); 7927 continue; 7928 } 7929 7930 if (D->isArrayDesignator()) { 7931 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 7932 if (Index.isInvalid()) 7933 return ExprError(); 7934 7935 Desig.AddDesignator(Designator::getArray(Index.get(), 7936 D->getLBracketLoc())); 7937 7938 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 7939 ArrayExprs.push_back(Index.get()); 7940 continue; 7941 } 7942 7943 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 7944 ExprResult Start 7945 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 7946 if (Start.isInvalid()) 7947 return ExprError(); 7948 7949 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 7950 if (End.isInvalid()) 7951 return ExprError(); 7952 7953 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 7954 End.get(), 7955 D->getLBracketLoc(), 7956 D->getEllipsisLoc())); 7957 7958 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 7959 End.get() != E->getArrayRangeEnd(*D); 7960 7961 ArrayExprs.push_back(Start.get()); 7962 ArrayExprs.push_back(End.get()); 7963 } 7964 7965 if (!getDerived().AlwaysRebuild() && 7966 Init.get() == E->getInit() && 7967 !ExprChanged) 7968 return E; 7969 7970 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 7971 E->getEqualOrColonLoc(), 7972 E->usesGNUSyntax(), Init.get()); 7973 } 7974 7975 // Seems that if TransformInitListExpr() only works on the syntactic form of an 7976 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 7977 template<typename Derived> 7978 ExprResult 7979 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 7980 DesignatedInitUpdateExpr *E) { 7981 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 7982 "initializer"); 7983 return ExprError(); 7984 } 7985 7986 template<typename Derived> 7987 ExprResult 7988 TreeTransform<Derived>::TransformNoInitExpr( 7989 NoInitExpr *E) { 7990 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 7991 return ExprError(); 7992 } 7993 7994 template<typename Derived> 7995 ExprResult 7996 TreeTransform<Derived>::TransformImplicitValueInitExpr( 7997 ImplicitValueInitExpr *E) { 7998 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 7999 8000 // FIXME: Will we ever have proper type location here? Will we actually 8001 // need to transform the type? 8002 QualType T = getDerived().TransformType(E->getType()); 8003 if (T.isNull()) 8004 return ExprError(); 8005 8006 if (!getDerived().AlwaysRebuild() && 8007 T == E->getType()) 8008 return E; 8009 8010 return getDerived().RebuildImplicitValueInitExpr(T); 8011 } 8012 8013 template<typename Derived> 8014 ExprResult 8015 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 8016 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 8017 if (!TInfo) 8018 return ExprError(); 8019 8020 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8021 if (SubExpr.isInvalid()) 8022 return ExprError(); 8023 8024 if (!getDerived().AlwaysRebuild() && 8025 TInfo == E->getWrittenTypeInfo() && 8026 SubExpr.get() == E->getSubExpr()) 8027 return E; 8028 8029 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 8030 TInfo, E->getRParenLoc()); 8031 } 8032 8033 template<typename Derived> 8034 ExprResult 8035 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 8036 bool ArgumentChanged = false; 8037 SmallVector<Expr*, 4> Inits; 8038 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 8039 &ArgumentChanged)) 8040 return ExprError(); 8041 8042 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 8043 Inits, 8044 E->getRParenLoc()); 8045 } 8046 8047 /// \brief Transform an address-of-label expression. 8048 /// 8049 /// By default, the transformation of an address-of-label expression always 8050 /// rebuilds the expression, so that the label identifier can be resolved to 8051 /// the corresponding label statement by semantic analysis. 8052 template<typename Derived> 8053 ExprResult 8054 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 8055 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 8056 E->getLabel()); 8057 if (!LD) 8058 return ExprError(); 8059 8060 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 8061 cast<LabelDecl>(LD)); 8062 } 8063 8064 template<typename Derived> 8065 ExprResult 8066 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 8067 SemaRef.ActOnStartStmtExpr(); 8068 StmtResult SubStmt 8069 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 8070 if (SubStmt.isInvalid()) { 8071 SemaRef.ActOnStmtExprError(); 8072 return ExprError(); 8073 } 8074 8075 if (!getDerived().AlwaysRebuild() && 8076 SubStmt.get() == E->getSubStmt()) { 8077 // Calling this an 'error' is unintuitive, but it does the right thing. 8078 SemaRef.ActOnStmtExprError(); 8079 return SemaRef.MaybeBindToTemporary(E); 8080 } 8081 8082 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 8083 SubStmt.get(), 8084 E->getRParenLoc()); 8085 } 8086 8087 template<typename Derived> 8088 ExprResult 8089 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 8090 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 8091 if (Cond.isInvalid()) 8092 return ExprError(); 8093 8094 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8095 if (LHS.isInvalid()) 8096 return ExprError(); 8097 8098 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8099 if (RHS.isInvalid()) 8100 return ExprError(); 8101 8102 if (!getDerived().AlwaysRebuild() && 8103 Cond.get() == E->getCond() && 8104 LHS.get() == E->getLHS() && 8105 RHS.get() == E->getRHS()) 8106 return E; 8107 8108 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 8109 Cond.get(), LHS.get(), RHS.get(), 8110 E->getRParenLoc()); 8111 } 8112 8113 template<typename Derived> 8114 ExprResult 8115 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 8116 return E; 8117 } 8118 8119 template<typename Derived> 8120 ExprResult 8121 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 8122 switch (E->getOperator()) { 8123 case OO_New: 8124 case OO_Delete: 8125 case OO_Array_New: 8126 case OO_Array_Delete: 8127 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 8128 8129 case OO_Call: { 8130 // This is a call to an object's operator(). 8131 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 8132 8133 // Transform the object itself. 8134 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 8135 if (Object.isInvalid()) 8136 return ExprError(); 8137 8138 // FIXME: Poor location information 8139 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 8140 static_cast<Expr *>(Object.get())->getLocEnd()); 8141 8142 // Transform the call arguments. 8143 SmallVector<Expr*, 8> Args; 8144 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 8145 Args)) 8146 return ExprError(); 8147 8148 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 8149 Args, 8150 E->getLocEnd()); 8151 } 8152 8153 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 8154 case OO_##Name: 8155 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 8156 #include "clang/Basic/OperatorKinds.def" 8157 case OO_Subscript: 8158 // Handled below. 8159 break; 8160 8161 case OO_Conditional: 8162 llvm_unreachable("conditional operator is not actually overloadable"); 8163 8164 case OO_None: 8165 case NUM_OVERLOADED_OPERATORS: 8166 llvm_unreachable("not an overloaded operator?"); 8167 } 8168 8169 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 8170 if (Callee.isInvalid()) 8171 return ExprError(); 8172 8173 ExprResult First; 8174 if (E->getOperator() == OO_Amp) 8175 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 8176 else 8177 First = getDerived().TransformExpr(E->getArg(0)); 8178 if (First.isInvalid()) 8179 return ExprError(); 8180 8181 ExprResult Second; 8182 if (E->getNumArgs() == 2) { 8183 Second = getDerived().TransformExpr(E->getArg(1)); 8184 if (Second.isInvalid()) 8185 return ExprError(); 8186 } 8187 8188 if (!getDerived().AlwaysRebuild() && 8189 Callee.get() == E->getCallee() && 8190 First.get() == E->getArg(0) && 8191 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 8192 return SemaRef.MaybeBindToTemporary(E); 8193 8194 Sema::FPContractStateRAII FPContractState(getSema()); 8195 getSema().FPFeatures.fp_contract = E->isFPContractable(); 8196 8197 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 8198 E->getOperatorLoc(), 8199 Callee.get(), 8200 First.get(), 8201 Second.get()); 8202 } 8203 8204 template<typename Derived> 8205 ExprResult 8206 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 8207 return getDerived().TransformCallExpr(E); 8208 } 8209 8210 template<typename Derived> 8211 ExprResult 8212 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 8213 // Transform the callee. 8214 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 8215 if (Callee.isInvalid()) 8216 return ExprError(); 8217 8218 // Transform exec config. 8219 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 8220 if (EC.isInvalid()) 8221 return ExprError(); 8222 8223 // Transform arguments. 8224 bool ArgChanged = false; 8225 SmallVector<Expr*, 8> Args; 8226 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 8227 &ArgChanged)) 8228 return ExprError(); 8229 8230 if (!getDerived().AlwaysRebuild() && 8231 Callee.get() == E->getCallee() && 8232 !ArgChanged) 8233 return SemaRef.MaybeBindToTemporary(E); 8234 8235 // FIXME: Wrong source location information for the '('. 8236 SourceLocation FakeLParenLoc 8237 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 8238 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 8239 Args, 8240 E->getRParenLoc(), EC.get()); 8241 } 8242 8243 template<typename Derived> 8244 ExprResult 8245 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 8246 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 8247 if (!Type) 8248 return ExprError(); 8249 8250 ExprResult SubExpr 8251 = getDerived().TransformExpr(E->getSubExprAsWritten()); 8252 if (SubExpr.isInvalid()) 8253 return ExprError(); 8254 8255 if (!getDerived().AlwaysRebuild() && 8256 Type == E->getTypeInfoAsWritten() && 8257 SubExpr.get() == E->getSubExpr()) 8258 return E; 8259 return getDerived().RebuildCXXNamedCastExpr( 8260 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 8261 Type, E->getAngleBrackets().getEnd(), 8262 // FIXME. this should be '(' location 8263 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 8264 } 8265 8266 template<typename Derived> 8267 ExprResult 8268 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 8269 return getDerived().TransformCXXNamedCastExpr(E); 8270 } 8271 8272 template<typename Derived> 8273 ExprResult 8274 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 8275 return getDerived().TransformCXXNamedCastExpr(E); 8276 } 8277 8278 template<typename Derived> 8279 ExprResult 8280 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 8281 CXXReinterpretCastExpr *E) { 8282 return getDerived().TransformCXXNamedCastExpr(E); 8283 } 8284 8285 template<typename Derived> 8286 ExprResult 8287 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 8288 return getDerived().TransformCXXNamedCastExpr(E); 8289 } 8290 8291 template<typename Derived> 8292 ExprResult 8293 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 8294 CXXFunctionalCastExpr *E) { 8295 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 8296 if (!Type) 8297 return ExprError(); 8298 8299 ExprResult SubExpr 8300 = getDerived().TransformExpr(E->getSubExprAsWritten()); 8301 if (SubExpr.isInvalid()) 8302 return ExprError(); 8303 8304 if (!getDerived().AlwaysRebuild() && 8305 Type == E->getTypeInfoAsWritten() && 8306 SubExpr.get() == E->getSubExpr()) 8307 return E; 8308 8309 return getDerived().RebuildCXXFunctionalCastExpr(Type, 8310 E->getLParenLoc(), 8311 SubExpr.get(), 8312 E->getRParenLoc()); 8313 } 8314 8315 template<typename Derived> 8316 ExprResult 8317 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 8318 if (E->isTypeOperand()) { 8319 TypeSourceInfo *TInfo 8320 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 8321 if (!TInfo) 8322 return ExprError(); 8323 8324 if (!getDerived().AlwaysRebuild() && 8325 TInfo == E->getTypeOperandSourceInfo()) 8326 return E; 8327 8328 return getDerived().RebuildCXXTypeidExpr(E->getType(), 8329 E->getLocStart(), 8330 TInfo, 8331 E->getLocEnd()); 8332 } 8333 8334 // We don't know whether the subexpression is potentially evaluated until 8335 // after we perform semantic analysis. We speculatively assume it is 8336 // unevaluated; it will get fixed later if the subexpression is in fact 8337 // potentially evaluated. 8338 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 8339 Sema::ReuseLambdaContextDecl); 8340 8341 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 8342 if (SubExpr.isInvalid()) 8343 return ExprError(); 8344 8345 if (!getDerived().AlwaysRebuild() && 8346 SubExpr.get() == E->getExprOperand()) 8347 return E; 8348 8349 return getDerived().RebuildCXXTypeidExpr(E->getType(), 8350 E->getLocStart(), 8351 SubExpr.get(), 8352 E->getLocEnd()); 8353 } 8354 8355 template<typename Derived> 8356 ExprResult 8357 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 8358 if (E->isTypeOperand()) { 8359 TypeSourceInfo *TInfo 8360 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 8361 if (!TInfo) 8362 return ExprError(); 8363 8364 if (!getDerived().AlwaysRebuild() && 8365 TInfo == E->getTypeOperandSourceInfo()) 8366 return E; 8367 8368 return getDerived().RebuildCXXUuidofExpr(E->getType(), 8369 E->getLocStart(), 8370 TInfo, 8371 E->getLocEnd()); 8372 } 8373 8374 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8375 8376 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 8377 if (SubExpr.isInvalid()) 8378 return ExprError(); 8379 8380 if (!getDerived().AlwaysRebuild() && 8381 SubExpr.get() == E->getExprOperand()) 8382 return E; 8383 8384 return getDerived().RebuildCXXUuidofExpr(E->getType(), 8385 E->getLocStart(), 8386 SubExpr.get(), 8387 E->getLocEnd()); 8388 } 8389 8390 template<typename Derived> 8391 ExprResult 8392 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 8393 return E; 8394 } 8395 8396 template<typename Derived> 8397 ExprResult 8398 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 8399 CXXNullPtrLiteralExpr *E) { 8400 return E; 8401 } 8402 8403 template<typename Derived> 8404 ExprResult 8405 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 8406 QualType T = getSema().getCurrentThisType(); 8407 8408 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 8409 // Make sure that we capture 'this'. 8410 getSema().CheckCXXThisCapture(E->getLocStart()); 8411 return E; 8412 } 8413 8414 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 8415 } 8416 8417 template<typename Derived> 8418 ExprResult 8419 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 8420 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8421 if (SubExpr.isInvalid()) 8422 return ExprError(); 8423 8424 if (!getDerived().AlwaysRebuild() && 8425 SubExpr.get() == E->getSubExpr()) 8426 return E; 8427 8428 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 8429 E->isThrownVariableInScope()); 8430 } 8431 8432 template<typename Derived> 8433 ExprResult 8434 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 8435 ParmVarDecl *Param 8436 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 8437 E->getParam())); 8438 if (!Param) 8439 return ExprError(); 8440 8441 if (!getDerived().AlwaysRebuild() && 8442 Param == E->getParam()) 8443 return E; 8444 8445 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 8446 } 8447 8448 template<typename Derived> 8449 ExprResult 8450 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 8451 FieldDecl *Field 8452 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 8453 E->getField())); 8454 if (!Field) 8455 return ExprError(); 8456 8457 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 8458 return E; 8459 8460 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 8461 } 8462 8463 template<typename Derived> 8464 ExprResult 8465 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 8466 CXXScalarValueInitExpr *E) { 8467 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 8468 if (!T) 8469 return ExprError(); 8470 8471 if (!getDerived().AlwaysRebuild() && 8472 T == E->getTypeSourceInfo()) 8473 return E; 8474 8475 return getDerived().RebuildCXXScalarValueInitExpr(T, 8476 /*FIXME:*/T->getTypeLoc().getEndLoc(), 8477 E->getRParenLoc()); 8478 } 8479 8480 template<typename Derived> 8481 ExprResult 8482 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 8483 // Transform the type that we're allocating 8484 TypeSourceInfo *AllocTypeInfo 8485 = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 8486 if (!AllocTypeInfo) 8487 return ExprError(); 8488 8489 // Transform the size of the array we're allocating (if any). 8490 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 8491 if (ArraySize.isInvalid()) 8492 return ExprError(); 8493 8494 // Transform the placement arguments (if any). 8495 bool ArgumentChanged = false; 8496 SmallVector<Expr*, 8> PlacementArgs; 8497 if (getDerived().TransformExprs(E->getPlacementArgs(), 8498 E->getNumPlacementArgs(), true, 8499 PlacementArgs, &ArgumentChanged)) 8500 return ExprError(); 8501 8502 // Transform the initializer (if any). 8503 Expr *OldInit = E->getInitializer(); 8504 ExprResult NewInit; 8505 if (OldInit) 8506 NewInit = getDerived().TransformInitializer(OldInit, true); 8507 if (NewInit.isInvalid()) 8508 return ExprError(); 8509 8510 // Transform new operator and delete operator. 8511 FunctionDecl *OperatorNew = nullptr; 8512 if (E->getOperatorNew()) { 8513 OperatorNew = cast_or_null<FunctionDecl>( 8514 getDerived().TransformDecl(E->getLocStart(), 8515 E->getOperatorNew())); 8516 if (!OperatorNew) 8517 return ExprError(); 8518 } 8519 8520 FunctionDecl *OperatorDelete = nullptr; 8521 if (E->getOperatorDelete()) { 8522 OperatorDelete = cast_or_null<FunctionDecl>( 8523 getDerived().TransformDecl(E->getLocStart(), 8524 E->getOperatorDelete())); 8525 if (!OperatorDelete) 8526 return ExprError(); 8527 } 8528 8529 if (!getDerived().AlwaysRebuild() && 8530 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 8531 ArraySize.get() == E->getArraySize() && 8532 NewInit.get() == OldInit && 8533 OperatorNew == E->getOperatorNew() && 8534 OperatorDelete == E->getOperatorDelete() && 8535 !ArgumentChanged) { 8536 // Mark any declarations we need as referenced. 8537 // FIXME: instantiation-specific. 8538 if (OperatorNew) 8539 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 8540 if (OperatorDelete) 8541 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 8542 8543 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 8544 QualType ElementType 8545 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 8546 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 8547 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 8548 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 8549 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 8550 } 8551 } 8552 } 8553 8554 return E; 8555 } 8556 8557 QualType AllocType = AllocTypeInfo->getType(); 8558 if (!ArraySize.get()) { 8559 // If no array size was specified, but the new expression was 8560 // instantiated with an array type (e.g., "new T" where T is 8561 // instantiated with "int[4]"), extract the outer bound from the 8562 // array type as our array size. We do this with constant and 8563 // dependently-sized array types. 8564 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 8565 if (!ArrayT) { 8566 // Do nothing 8567 } else if (const ConstantArrayType *ConsArrayT 8568 = dyn_cast<ConstantArrayType>(ArrayT)) { 8569 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 8570 SemaRef.Context.getSizeType(), 8571 /*FIXME:*/ E->getLocStart()); 8572 AllocType = ConsArrayT->getElementType(); 8573 } else if (const DependentSizedArrayType *DepArrayT 8574 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 8575 if (DepArrayT->getSizeExpr()) { 8576 ArraySize = DepArrayT->getSizeExpr(); 8577 AllocType = DepArrayT->getElementType(); 8578 } 8579 } 8580 } 8581 8582 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 8583 E->isGlobalNew(), 8584 /*FIXME:*/E->getLocStart(), 8585 PlacementArgs, 8586 /*FIXME:*/E->getLocStart(), 8587 E->getTypeIdParens(), 8588 AllocType, 8589 AllocTypeInfo, 8590 ArraySize.get(), 8591 E->getDirectInitRange(), 8592 NewInit.get()); 8593 } 8594 8595 template<typename Derived> 8596 ExprResult 8597 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 8598 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 8599 if (Operand.isInvalid()) 8600 return ExprError(); 8601 8602 // Transform the delete operator, if known. 8603 FunctionDecl *OperatorDelete = nullptr; 8604 if (E->getOperatorDelete()) { 8605 OperatorDelete = cast_or_null<FunctionDecl>( 8606 getDerived().TransformDecl(E->getLocStart(), 8607 E->getOperatorDelete())); 8608 if (!OperatorDelete) 8609 return ExprError(); 8610 } 8611 8612 if (!getDerived().AlwaysRebuild() && 8613 Operand.get() == E->getArgument() && 8614 OperatorDelete == E->getOperatorDelete()) { 8615 // Mark any declarations we need as referenced. 8616 // FIXME: instantiation-specific. 8617 if (OperatorDelete) 8618 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 8619 8620 if (!E->getArgument()->isTypeDependent()) { 8621 QualType Destroyed = SemaRef.Context.getBaseElementType( 8622 E->getDestroyedType()); 8623 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 8624 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 8625 SemaRef.MarkFunctionReferenced(E->getLocStart(), 8626 SemaRef.LookupDestructor(Record)); 8627 } 8628 } 8629 8630 return E; 8631 } 8632 8633 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 8634 E->isGlobalDelete(), 8635 E->isArrayForm(), 8636 Operand.get()); 8637 } 8638 8639 template<typename Derived> 8640 ExprResult 8641 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 8642 CXXPseudoDestructorExpr *E) { 8643 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8644 if (Base.isInvalid()) 8645 return ExprError(); 8646 8647 ParsedType ObjectTypePtr; 8648 bool MayBePseudoDestructor = false; 8649 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 8650 E->getOperatorLoc(), 8651 E->isArrow()? tok::arrow : tok::period, 8652 ObjectTypePtr, 8653 MayBePseudoDestructor); 8654 if (Base.isInvalid()) 8655 return ExprError(); 8656 8657 QualType ObjectType = ObjectTypePtr.get(); 8658 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 8659 if (QualifierLoc) { 8660 QualifierLoc 8661 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 8662 if (!QualifierLoc) 8663 return ExprError(); 8664 } 8665 CXXScopeSpec SS; 8666 SS.Adopt(QualifierLoc); 8667 8668 PseudoDestructorTypeStorage Destroyed; 8669 if (E->getDestroyedTypeInfo()) { 8670 TypeSourceInfo *DestroyedTypeInfo 8671 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 8672 ObjectType, nullptr, SS); 8673 if (!DestroyedTypeInfo) 8674 return ExprError(); 8675 Destroyed = DestroyedTypeInfo; 8676 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 8677 // We aren't likely to be able to resolve the identifier down to a type 8678 // now anyway, so just retain the identifier. 8679 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 8680 E->getDestroyedTypeLoc()); 8681 } else { 8682 // Look for a destructor known with the given name. 8683 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 8684 *E->getDestroyedTypeIdentifier(), 8685 E->getDestroyedTypeLoc(), 8686 /*Scope=*/nullptr, 8687 SS, ObjectTypePtr, 8688 false); 8689 if (!T) 8690 return ExprError(); 8691 8692 Destroyed 8693 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 8694 E->getDestroyedTypeLoc()); 8695 } 8696 8697 TypeSourceInfo *ScopeTypeInfo = nullptr; 8698 if (E->getScopeTypeInfo()) { 8699 CXXScopeSpec EmptySS; 8700 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 8701 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 8702 if (!ScopeTypeInfo) 8703 return ExprError(); 8704 } 8705 8706 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 8707 E->getOperatorLoc(), 8708 E->isArrow(), 8709 SS, 8710 ScopeTypeInfo, 8711 E->getColonColonLoc(), 8712 E->getTildeLoc(), 8713 Destroyed); 8714 } 8715 8716 template<typename Derived> 8717 ExprResult 8718 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 8719 UnresolvedLookupExpr *Old) { 8720 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 8721 Sema::LookupOrdinaryName); 8722 8723 // Transform all the decls. 8724 for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 8725 E = Old->decls_end(); I != E; ++I) { 8726 NamedDecl *InstD = static_cast<NamedDecl*>( 8727 getDerived().TransformDecl(Old->getNameLoc(), 8728 *I)); 8729 if (!InstD) { 8730 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 8731 // This can happen because of dependent hiding. 8732 if (isa<UsingShadowDecl>(*I)) 8733 continue; 8734 else { 8735 R.clear(); 8736 return ExprError(); 8737 } 8738 } 8739 8740 // Expand using declarations. 8741 if (isa<UsingDecl>(InstD)) { 8742 UsingDecl *UD = cast<UsingDecl>(InstD); 8743 for (auto *I : UD->shadows()) 8744 R.addDecl(I); 8745 continue; 8746 } 8747 8748 R.addDecl(InstD); 8749 } 8750 8751 // Resolve a kind, but don't do any further analysis. If it's 8752 // ambiguous, the callee needs to deal with it. 8753 R.resolveKind(); 8754 8755 // Rebuild the nested-name qualifier, if present. 8756 CXXScopeSpec SS; 8757 if (Old->getQualifierLoc()) { 8758 NestedNameSpecifierLoc QualifierLoc 8759 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 8760 if (!QualifierLoc) 8761 return ExprError(); 8762 8763 SS.Adopt(QualifierLoc); 8764 } 8765 8766 if (Old->getNamingClass()) { 8767 CXXRecordDecl *NamingClass 8768 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 8769 Old->getNameLoc(), 8770 Old->getNamingClass())); 8771 if (!NamingClass) { 8772 R.clear(); 8773 return ExprError(); 8774 } 8775 8776 R.setNamingClass(NamingClass); 8777 } 8778 8779 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 8780 8781 // If we have neither explicit template arguments, nor the template keyword, 8782 // it's a normal declaration name. 8783 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) 8784 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 8785 8786 // If we have template arguments, rebuild them, then rebuild the 8787 // templateid expression. 8788 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 8789 if (Old->hasExplicitTemplateArgs() && 8790 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 8791 Old->getNumTemplateArgs(), 8792 TransArgs)) { 8793 R.clear(); 8794 return ExprError(); 8795 } 8796 8797 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 8798 Old->requiresADL(), &TransArgs); 8799 } 8800 8801 template<typename Derived> 8802 ExprResult 8803 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 8804 bool ArgChanged = false; 8805 SmallVector<TypeSourceInfo *, 4> Args; 8806 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 8807 TypeSourceInfo *From = E->getArg(I); 8808 TypeLoc FromTL = From->getTypeLoc(); 8809 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 8810 TypeLocBuilder TLB; 8811 TLB.reserve(FromTL.getFullDataSize()); 8812 QualType To = getDerived().TransformType(TLB, FromTL); 8813 if (To.isNull()) 8814 return ExprError(); 8815 8816 if (To == From->getType()) 8817 Args.push_back(From); 8818 else { 8819 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 8820 ArgChanged = true; 8821 } 8822 continue; 8823 } 8824 8825 ArgChanged = true; 8826 8827 // We have a pack expansion. Instantiate it. 8828 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 8829 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 8830 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 8831 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 8832 8833 // Determine whether the set of unexpanded parameter packs can and should 8834 // be expanded. 8835 bool Expand = true; 8836 bool RetainExpansion = false; 8837 Optional<unsigned> OrigNumExpansions = 8838 ExpansionTL.getTypePtr()->getNumExpansions(); 8839 Optional<unsigned> NumExpansions = OrigNumExpansions; 8840 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 8841 PatternTL.getSourceRange(), 8842 Unexpanded, 8843 Expand, RetainExpansion, 8844 NumExpansions)) 8845 return ExprError(); 8846 8847 if (!Expand) { 8848 // The transform has determined that we should perform a simple 8849 // transformation on the pack expansion, producing another pack 8850 // expansion. 8851 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 8852 8853 TypeLocBuilder TLB; 8854 TLB.reserve(From->getTypeLoc().getFullDataSize()); 8855 8856 QualType To = getDerived().TransformType(TLB, PatternTL); 8857 if (To.isNull()) 8858 return ExprError(); 8859 8860 To = getDerived().RebuildPackExpansionType(To, 8861 PatternTL.getSourceRange(), 8862 ExpansionTL.getEllipsisLoc(), 8863 NumExpansions); 8864 if (To.isNull()) 8865 return ExprError(); 8866 8867 PackExpansionTypeLoc ToExpansionTL 8868 = TLB.push<PackExpansionTypeLoc>(To); 8869 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 8870 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 8871 continue; 8872 } 8873 8874 // Expand the pack expansion by substituting for each argument in the 8875 // pack(s). 8876 for (unsigned I = 0; I != *NumExpansions; ++I) { 8877 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 8878 TypeLocBuilder TLB; 8879 TLB.reserve(PatternTL.getFullDataSize()); 8880 QualType To = getDerived().TransformType(TLB, PatternTL); 8881 if (To.isNull()) 8882 return ExprError(); 8883 8884 if (To->containsUnexpandedParameterPack()) { 8885 To = getDerived().RebuildPackExpansionType(To, 8886 PatternTL.getSourceRange(), 8887 ExpansionTL.getEllipsisLoc(), 8888 NumExpansions); 8889 if (To.isNull()) 8890 return ExprError(); 8891 8892 PackExpansionTypeLoc ToExpansionTL 8893 = TLB.push<PackExpansionTypeLoc>(To); 8894 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 8895 } 8896 8897 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 8898 } 8899 8900 if (!RetainExpansion) 8901 continue; 8902 8903 // If we're supposed to retain a pack expansion, do so by temporarily 8904 // forgetting the partially-substituted parameter pack. 8905 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 8906 8907 TypeLocBuilder TLB; 8908 TLB.reserve(From->getTypeLoc().getFullDataSize()); 8909 8910 QualType To = getDerived().TransformType(TLB, PatternTL); 8911 if (To.isNull()) 8912 return ExprError(); 8913 8914 To = getDerived().RebuildPackExpansionType(To, 8915 PatternTL.getSourceRange(), 8916 ExpansionTL.getEllipsisLoc(), 8917 NumExpansions); 8918 if (To.isNull()) 8919 return ExprError(); 8920 8921 PackExpansionTypeLoc ToExpansionTL 8922 = TLB.push<PackExpansionTypeLoc>(To); 8923 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 8924 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 8925 } 8926 8927 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8928 return E; 8929 8930 return getDerived().RebuildTypeTrait(E->getTrait(), 8931 E->getLocStart(), 8932 Args, 8933 E->getLocEnd()); 8934 } 8935 8936 template<typename Derived> 8937 ExprResult 8938 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 8939 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 8940 if (!T) 8941 return ExprError(); 8942 8943 if (!getDerived().AlwaysRebuild() && 8944 T == E->getQueriedTypeSourceInfo()) 8945 return E; 8946 8947 ExprResult SubExpr; 8948 { 8949 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8950 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 8951 if (SubExpr.isInvalid()) 8952 return ExprError(); 8953 8954 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 8955 return E; 8956 } 8957 8958 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 8959 E->getLocStart(), 8960 T, 8961 SubExpr.get(), 8962 E->getLocEnd()); 8963 } 8964 8965 template<typename Derived> 8966 ExprResult 8967 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 8968 ExprResult SubExpr; 8969 { 8970 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8971 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 8972 if (SubExpr.isInvalid()) 8973 return ExprError(); 8974 8975 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 8976 return E; 8977 } 8978 8979 return getDerived().RebuildExpressionTrait( 8980 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 8981 } 8982 8983 template <typename Derived> 8984 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 8985 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 8986 TypeSourceInfo **RecoveryTSI) { 8987 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 8988 DRE, AddrTaken, RecoveryTSI); 8989 8990 // Propagate both errors and recovered types, which return ExprEmpty. 8991 if (!NewDRE.isUsable()) 8992 return NewDRE; 8993 8994 // We got an expr, wrap it up in parens. 8995 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 8996 return PE; 8997 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 8998 PE->getRParen()); 8999 } 9000 9001 template <typename Derived> 9002 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 9003 DependentScopeDeclRefExpr *E) { 9004 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 9005 nullptr); 9006 } 9007 9008 template<typename Derived> 9009 ExprResult 9010 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 9011 DependentScopeDeclRefExpr *E, 9012 bool IsAddressOfOperand, 9013 TypeSourceInfo **RecoveryTSI) { 9014 assert(E->getQualifierLoc()); 9015 NestedNameSpecifierLoc QualifierLoc 9016 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9017 if (!QualifierLoc) 9018 return ExprError(); 9019 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9020 9021 // TODO: If this is a conversion-function-id, verify that the 9022 // destination type name (if present) resolves the same way after 9023 // instantiation as it did in the local scope. 9024 9025 DeclarationNameInfo NameInfo 9026 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 9027 if (!NameInfo.getName()) 9028 return ExprError(); 9029 9030 if (!E->hasExplicitTemplateArgs()) { 9031 if (!getDerived().AlwaysRebuild() && 9032 QualifierLoc == E->getQualifierLoc() && 9033 // Note: it is sufficient to compare the Name component of NameInfo: 9034 // if name has not changed, DNLoc has not changed either. 9035 NameInfo.getName() == E->getDeclName()) 9036 return E; 9037 9038 return getDerived().RebuildDependentScopeDeclRefExpr( 9039 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 9040 IsAddressOfOperand, RecoveryTSI); 9041 } 9042 9043 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 9044 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9045 E->getNumTemplateArgs(), 9046 TransArgs)) 9047 return ExprError(); 9048 9049 return getDerived().RebuildDependentScopeDeclRefExpr( 9050 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 9051 RecoveryTSI); 9052 } 9053 9054 template<typename Derived> 9055 ExprResult 9056 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 9057 // CXXConstructExprs other than for list-initialization and 9058 // CXXTemporaryObjectExpr are always implicit, so when we have 9059 // a 1-argument construction we just transform that argument. 9060 if ((E->getNumArgs() == 1 || 9061 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 9062 (!getDerived().DropCallArgument(E->getArg(0))) && 9063 !E->isListInitialization()) 9064 return getDerived().TransformExpr(E->getArg(0)); 9065 9066 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 9067 9068 QualType T = getDerived().TransformType(E->getType()); 9069 if (T.isNull()) 9070 return ExprError(); 9071 9072 CXXConstructorDecl *Constructor 9073 = cast_or_null<CXXConstructorDecl>( 9074 getDerived().TransformDecl(E->getLocStart(), 9075 E->getConstructor())); 9076 if (!Constructor) 9077 return ExprError(); 9078 9079 bool ArgumentChanged = false; 9080 SmallVector<Expr*, 8> Args; 9081 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9082 &ArgumentChanged)) 9083 return ExprError(); 9084 9085 if (!getDerived().AlwaysRebuild() && 9086 T == E->getType() && 9087 Constructor == E->getConstructor() && 9088 !ArgumentChanged) { 9089 // Mark the constructor as referenced. 9090 // FIXME: Instantiation-specific 9091 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 9092 return E; 9093 } 9094 9095 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 9096 Constructor, E->isElidable(), 9097 Args, 9098 E->hadMultipleCandidates(), 9099 E->isListInitialization(), 9100 E->isStdInitListInitialization(), 9101 E->requiresZeroInitialization(), 9102 E->getConstructionKind(), 9103 E->getParenOrBraceRange()); 9104 } 9105 9106 /// \brief Transform a C++ temporary-binding expression. 9107 /// 9108 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 9109 /// transform the subexpression and return that. 9110 template<typename Derived> 9111 ExprResult 9112 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 9113 return getDerived().TransformExpr(E->getSubExpr()); 9114 } 9115 9116 /// \brief Transform a C++ expression that contains cleanups that should 9117 /// be run after the expression is evaluated. 9118 /// 9119 /// Since ExprWithCleanups nodes are implicitly generated, we 9120 /// just transform the subexpression and return that. 9121 template<typename Derived> 9122 ExprResult 9123 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 9124 return getDerived().TransformExpr(E->getSubExpr()); 9125 } 9126 9127 template<typename Derived> 9128 ExprResult 9129 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 9130 CXXTemporaryObjectExpr *E) { 9131 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9132 if (!T) 9133 return ExprError(); 9134 9135 CXXConstructorDecl *Constructor 9136 = cast_or_null<CXXConstructorDecl>( 9137 getDerived().TransformDecl(E->getLocStart(), 9138 E->getConstructor())); 9139 if (!Constructor) 9140 return ExprError(); 9141 9142 bool ArgumentChanged = false; 9143 SmallVector<Expr*, 8> Args; 9144 Args.reserve(E->getNumArgs()); 9145 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9146 &ArgumentChanged)) 9147 return ExprError(); 9148 9149 if (!getDerived().AlwaysRebuild() && 9150 T == E->getTypeSourceInfo() && 9151 Constructor == E->getConstructor() && 9152 !ArgumentChanged) { 9153 // FIXME: Instantiation-specific 9154 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 9155 return SemaRef.MaybeBindToTemporary(E); 9156 } 9157 9158 // FIXME: Pass in E->isListInitialization(). 9159 return getDerived().RebuildCXXTemporaryObjectExpr(T, 9160 /*FIXME:*/T->getTypeLoc().getEndLoc(), 9161 Args, 9162 E->getLocEnd()); 9163 } 9164 9165 template<typename Derived> 9166 ExprResult 9167 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 9168 // Transform any init-capture expressions before entering the scope of the 9169 // lambda body, because they are not semantically within that scope. 9170 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 9171 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 9172 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 9173 E->explicit_capture_begin()); 9174 for (LambdaExpr::capture_iterator C = E->capture_begin(), 9175 CEnd = E->capture_end(); 9176 C != CEnd; ++C) { 9177 if (!E->isInitCapture(C)) 9178 continue; 9179 EnterExpressionEvaluationContext EEEC(getSema(), 9180 Sema::PotentiallyEvaluated); 9181 ExprResult NewExprInitResult = getDerived().TransformInitializer( 9182 C->getCapturedVar()->getInit(), 9183 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 9184 9185 if (NewExprInitResult.isInvalid()) 9186 return ExprError(); 9187 Expr *NewExprInit = NewExprInitResult.get(); 9188 9189 VarDecl *OldVD = C->getCapturedVar(); 9190 QualType NewInitCaptureType = 9191 getSema().performLambdaInitCaptureInitialization(C->getLocation(), 9192 OldVD->getType()->isReferenceType(), OldVD->getIdentifier(), 9193 NewExprInit); 9194 NewExprInitResult = NewExprInit; 9195 InitCaptureExprsAndTypes[C - E->capture_begin()] = 9196 std::make_pair(NewExprInitResult, NewInitCaptureType); 9197 } 9198 9199 // Transform the template parameters, and add them to the current 9200 // instantiation scope. The null case is handled correctly. 9201 auto TPL = getDerived().TransformTemplateParameterList( 9202 E->getTemplateParameterList()); 9203 9204 // Transform the type of the original lambda's call operator. 9205 // The transformation MUST be done in the CurrentInstantiationScope since 9206 // it introduces a mapping of the original to the newly created 9207 // transformed parameters. 9208 TypeSourceInfo *NewCallOpTSI = nullptr; 9209 { 9210 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 9211 FunctionProtoTypeLoc OldCallOpFPTL = 9212 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 9213 9214 TypeLocBuilder NewCallOpTLBuilder; 9215 SmallVector<QualType, 4> ExceptionStorage; 9216 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 9217 QualType NewCallOpType = TransformFunctionProtoType( 9218 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 9219 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 9220 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 9221 ExceptionStorage, Changed); 9222 }); 9223 if (NewCallOpType.isNull()) 9224 return ExprError(); 9225 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 9226 NewCallOpType); 9227 } 9228 9229 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 9230 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 9231 LSI->GLTemplateParameterList = TPL; 9232 9233 // Create the local class that will describe the lambda. 9234 CXXRecordDecl *Class 9235 = getSema().createLambdaClosureType(E->getIntroducerRange(), 9236 NewCallOpTSI, 9237 /*KnownDependent=*/false, 9238 E->getCaptureDefault()); 9239 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 9240 9241 // Build the call operator. 9242 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 9243 Class, E->getIntroducerRange(), NewCallOpTSI, 9244 E->getCallOperator()->getLocEnd(), 9245 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams()); 9246 LSI->CallOperator = NewCallOperator; 9247 9248 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 9249 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 9250 9251 // Introduce the context of the call operator. 9252 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 9253 /*NewThisContext*/false); 9254 9255 // Enter the scope of the lambda. 9256 getSema().buildLambdaScope(LSI, NewCallOperator, 9257 E->getIntroducerRange(), 9258 E->getCaptureDefault(), 9259 E->getCaptureDefaultLoc(), 9260 E->hasExplicitParameters(), 9261 E->hasExplicitResultType(), 9262 E->isMutable()); 9263 9264 bool Invalid = false; 9265 9266 // Transform captures. 9267 bool FinishedExplicitCaptures = false; 9268 for (LambdaExpr::capture_iterator C = E->capture_begin(), 9269 CEnd = E->capture_end(); 9270 C != CEnd; ++C) { 9271 // When we hit the first implicit capture, tell Sema that we've finished 9272 // the list of explicit captures. 9273 if (!FinishedExplicitCaptures && C->isImplicit()) { 9274 getSema().finishLambdaExplicitCaptures(LSI); 9275 FinishedExplicitCaptures = true; 9276 } 9277 9278 // Capturing 'this' is trivial. 9279 if (C->capturesThis()) { 9280 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit()); 9281 continue; 9282 } 9283 // Captured expression will be recaptured during captured variables 9284 // rebuilding. 9285 if (C->capturesVLAType()) 9286 continue; 9287 9288 // Rebuild init-captures, including the implied field declaration. 9289 if (E->isInitCapture(C)) { 9290 InitCaptureInfoTy InitExprTypePair = 9291 InitCaptureExprsAndTypes[C - E->capture_begin()]; 9292 ExprResult Init = InitExprTypePair.first; 9293 QualType InitQualType = InitExprTypePair.second; 9294 if (Init.isInvalid() || InitQualType.isNull()) { 9295 Invalid = true; 9296 continue; 9297 } 9298 VarDecl *OldVD = C->getCapturedVar(); 9299 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 9300 OldVD->getLocation(), InitExprTypePair.second, 9301 OldVD->getIdentifier(), Init.get()); 9302 if (!NewVD) 9303 Invalid = true; 9304 else { 9305 getDerived().transformedLocalDecl(OldVD, NewVD); 9306 } 9307 getSema().buildInitCaptureField(LSI, NewVD); 9308 continue; 9309 } 9310 9311 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 9312 9313 // Determine the capture kind for Sema. 9314 Sema::TryCaptureKind Kind 9315 = C->isImplicit()? Sema::TryCapture_Implicit 9316 : C->getCaptureKind() == LCK_ByCopy 9317 ? Sema::TryCapture_ExplicitByVal 9318 : Sema::TryCapture_ExplicitByRef; 9319 SourceLocation EllipsisLoc; 9320 if (C->isPackExpansion()) { 9321 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 9322 bool ShouldExpand = false; 9323 bool RetainExpansion = false; 9324 Optional<unsigned> NumExpansions; 9325 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 9326 C->getLocation(), 9327 Unexpanded, 9328 ShouldExpand, RetainExpansion, 9329 NumExpansions)) { 9330 Invalid = true; 9331 continue; 9332 } 9333 9334 if (ShouldExpand) { 9335 // The transform has determined that we should perform an expansion; 9336 // transform and capture each of the arguments. 9337 // expansion of the pattern. Do so. 9338 VarDecl *Pack = C->getCapturedVar(); 9339 for (unsigned I = 0; I != *NumExpansions; ++I) { 9340 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 9341 VarDecl *CapturedVar 9342 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 9343 Pack)); 9344 if (!CapturedVar) { 9345 Invalid = true; 9346 continue; 9347 } 9348 9349 // Capture the transformed variable. 9350 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 9351 } 9352 9353 // FIXME: Retain a pack expansion if RetainExpansion is true. 9354 9355 continue; 9356 } 9357 9358 EllipsisLoc = C->getEllipsisLoc(); 9359 } 9360 9361 // Transform the captured variable. 9362 VarDecl *CapturedVar 9363 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 9364 C->getCapturedVar())); 9365 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 9366 Invalid = true; 9367 continue; 9368 } 9369 9370 // Capture the transformed variable. 9371 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 9372 } 9373 if (!FinishedExplicitCaptures) 9374 getSema().finishLambdaExplicitCaptures(LSI); 9375 9376 // Enter a new evaluation context to insulate the lambda from any 9377 // cleanups from the enclosing full-expression. 9378 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 9379 9380 // Instantiate the body of the lambda expression. 9381 StmtResult Body = 9382 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 9383 9384 // ActOnLambda* will pop the function scope for us. 9385 FuncScopeCleanup.disable(); 9386 9387 if (Body.isInvalid()) { 9388 SavedContext.pop(); 9389 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 9390 /*IsInstantiation=*/true); 9391 return ExprError(); 9392 } 9393 9394 // Copy the LSI before ActOnFinishFunctionBody removes it. 9395 // FIXME: This is dumb. Store the lambda information somewhere that outlives 9396 // the call operator. 9397 auto LSICopy = *LSI; 9398 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 9399 /*IsInstantiation*/ true); 9400 SavedContext.pop(); 9401 9402 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 9403 &LSICopy); 9404 } 9405 9406 template<typename Derived> 9407 ExprResult 9408 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 9409 CXXUnresolvedConstructExpr *E) { 9410 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9411 if (!T) 9412 return ExprError(); 9413 9414 bool ArgumentChanged = false; 9415 SmallVector<Expr*, 8> Args; 9416 Args.reserve(E->arg_size()); 9417 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 9418 &ArgumentChanged)) 9419 return ExprError(); 9420 9421 if (!getDerived().AlwaysRebuild() && 9422 T == E->getTypeSourceInfo() && 9423 !ArgumentChanged) 9424 return E; 9425 9426 // FIXME: we're faking the locations of the commas 9427 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 9428 E->getLParenLoc(), 9429 Args, 9430 E->getRParenLoc()); 9431 } 9432 9433 template<typename Derived> 9434 ExprResult 9435 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 9436 CXXDependentScopeMemberExpr *E) { 9437 // Transform the base of the expression. 9438 ExprResult Base((Expr*) nullptr); 9439 Expr *OldBase; 9440 QualType BaseType; 9441 QualType ObjectType; 9442 if (!E->isImplicitAccess()) { 9443 OldBase = E->getBase(); 9444 Base = getDerived().TransformExpr(OldBase); 9445 if (Base.isInvalid()) 9446 return ExprError(); 9447 9448 // Start the member reference and compute the object's type. 9449 ParsedType ObjectTy; 9450 bool MayBePseudoDestructor = false; 9451 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 9452 E->getOperatorLoc(), 9453 E->isArrow()? tok::arrow : tok::period, 9454 ObjectTy, 9455 MayBePseudoDestructor); 9456 if (Base.isInvalid()) 9457 return ExprError(); 9458 9459 ObjectType = ObjectTy.get(); 9460 BaseType = ((Expr*) Base.get())->getType(); 9461 } else { 9462 OldBase = nullptr; 9463 BaseType = getDerived().TransformType(E->getBaseType()); 9464 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 9465 } 9466 9467 // Transform the first part of the nested-name-specifier that qualifies 9468 // the member name. 9469 NamedDecl *FirstQualifierInScope 9470 = getDerived().TransformFirstQualifierInScope( 9471 E->getFirstQualifierFoundInScope(), 9472 E->getQualifierLoc().getBeginLoc()); 9473 9474 NestedNameSpecifierLoc QualifierLoc; 9475 if (E->getQualifier()) { 9476 QualifierLoc 9477 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 9478 ObjectType, 9479 FirstQualifierInScope); 9480 if (!QualifierLoc) 9481 return ExprError(); 9482 } 9483 9484 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9485 9486 // TODO: If this is a conversion-function-id, verify that the 9487 // destination type name (if present) resolves the same way after 9488 // instantiation as it did in the local scope. 9489 9490 DeclarationNameInfo NameInfo 9491 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 9492 if (!NameInfo.getName()) 9493 return ExprError(); 9494 9495 if (!E->hasExplicitTemplateArgs()) { 9496 // This is a reference to a member without an explicitly-specified 9497 // template argument list. Optimize for this common case. 9498 if (!getDerived().AlwaysRebuild() && 9499 Base.get() == OldBase && 9500 BaseType == E->getBaseType() && 9501 QualifierLoc == E->getQualifierLoc() && 9502 NameInfo.getName() == E->getMember() && 9503 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 9504 return E; 9505 9506 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 9507 BaseType, 9508 E->isArrow(), 9509 E->getOperatorLoc(), 9510 QualifierLoc, 9511 TemplateKWLoc, 9512 FirstQualifierInScope, 9513 NameInfo, 9514 /*TemplateArgs*/nullptr); 9515 } 9516 9517 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 9518 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9519 E->getNumTemplateArgs(), 9520 TransArgs)) 9521 return ExprError(); 9522 9523 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 9524 BaseType, 9525 E->isArrow(), 9526 E->getOperatorLoc(), 9527 QualifierLoc, 9528 TemplateKWLoc, 9529 FirstQualifierInScope, 9530 NameInfo, 9531 &TransArgs); 9532 } 9533 9534 template<typename Derived> 9535 ExprResult 9536 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 9537 // Transform the base of the expression. 9538 ExprResult Base((Expr*) nullptr); 9539 QualType BaseType; 9540 if (!Old->isImplicitAccess()) { 9541 Base = getDerived().TransformExpr(Old->getBase()); 9542 if (Base.isInvalid()) 9543 return ExprError(); 9544 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 9545 Old->isArrow()); 9546 if (Base.isInvalid()) 9547 return ExprError(); 9548 BaseType = Base.get()->getType(); 9549 } else { 9550 BaseType = getDerived().TransformType(Old->getBaseType()); 9551 } 9552 9553 NestedNameSpecifierLoc QualifierLoc; 9554 if (Old->getQualifierLoc()) { 9555 QualifierLoc 9556 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 9557 if (!QualifierLoc) 9558 return ExprError(); 9559 } 9560 9561 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 9562 9563 LookupResult R(SemaRef, Old->getMemberNameInfo(), 9564 Sema::LookupOrdinaryName); 9565 9566 // Transform all the decls. 9567 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 9568 E = Old->decls_end(); I != E; ++I) { 9569 NamedDecl *InstD = static_cast<NamedDecl*>( 9570 getDerived().TransformDecl(Old->getMemberLoc(), 9571 *I)); 9572 if (!InstD) { 9573 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 9574 // This can happen because of dependent hiding. 9575 if (isa<UsingShadowDecl>(*I)) 9576 continue; 9577 else { 9578 R.clear(); 9579 return ExprError(); 9580 } 9581 } 9582 9583 // Expand using declarations. 9584 if (isa<UsingDecl>(InstD)) { 9585 UsingDecl *UD = cast<UsingDecl>(InstD); 9586 for (auto *I : UD->shadows()) 9587 R.addDecl(I); 9588 continue; 9589 } 9590 9591 R.addDecl(InstD); 9592 } 9593 9594 R.resolveKind(); 9595 9596 // Determine the naming class. 9597 if (Old->getNamingClass()) { 9598 CXXRecordDecl *NamingClass 9599 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 9600 Old->getMemberLoc(), 9601 Old->getNamingClass())); 9602 if (!NamingClass) 9603 return ExprError(); 9604 9605 R.setNamingClass(NamingClass); 9606 } 9607 9608 TemplateArgumentListInfo TransArgs; 9609 if (Old->hasExplicitTemplateArgs()) { 9610 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 9611 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 9612 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 9613 Old->getNumTemplateArgs(), 9614 TransArgs)) 9615 return ExprError(); 9616 } 9617 9618 // FIXME: to do this check properly, we will need to preserve the 9619 // first-qualifier-in-scope here, just in case we had a dependent 9620 // base (and therefore couldn't do the check) and a 9621 // nested-name-qualifier (and therefore could do the lookup). 9622 NamedDecl *FirstQualifierInScope = nullptr; 9623 9624 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 9625 BaseType, 9626 Old->getOperatorLoc(), 9627 Old->isArrow(), 9628 QualifierLoc, 9629 TemplateKWLoc, 9630 FirstQualifierInScope, 9631 R, 9632 (Old->hasExplicitTemplateArgs() 9633 ? &TransArgs : nullptr)); 9634 } 9635 9636 template<typename Derived> 9637 ExprResult 9638 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 9639 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 9640 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 9641 if (SubExpr.isInvalid()) 9642 return ExprError(); 9643 9644 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 9645 return E; 9646 9647 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 9648 } 9649 9650 template<typename Derived> 9651 ExprResult 9652 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 9653 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 9654 if (Pattern.isInvalid()) 9655 return ExprError(); 9656 9657 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 9658 return E; 9659 9660 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 9661 E->getNumExpansions()); 9662 } 9663 9664 template<typename Derived> 9665 ExprResult 9666 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 9667 // If E is not value-dependent, then nothing will change when we transform it. 9668 // Note: This is an instantiation-centric view. 9669 if (!E->isValueDependent()) 9670 return E; 9671 9672 // Note: None of the implementations of TryExpandParameterPacks can ever 9673 // produce a diagnostic when given only a single unexpanded parameter pack, 9674 // so 9675 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 9676 bool ShouldExpand = false; 9677 bool RetainExpansion = false; 9678 Optional<unsigned> NumExpansions; 9679 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 9680 Unexpanded, 9681 ShouldExpand, RetainExpansion, 9682 NumExpansions)) 9683 return ExprError(); 9684 9685 if (RetainExpansion) 9686 return E; 9687 9688 NamedDecl *Pack = E->getPack(); 9689 if (!ShouldExpand) { 9690 Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(), 9691 Pack)); 9692 if (!Pack) 9693 return ExprError(); 9694 } 9695 9696 9697 // We now know the length of the parameter pack, so build a new expression 9698 // that stores that length. 9699 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 9700 E->getPackLoc(), E->getRParenLoc(), 9701 NumExpansions); 9702 } 9703 9704 template<typename Derived> 9705 ExprResult 9706 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 9707 SubstNonTypeTemplateParmPackExpr *E) { 9708 // Default behavior is to do nothing with this transformation. 9709 return E; 9710 } 9711 9712 template<typename Derived> 9713 ExprResult 9714 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 9715 SubstNonTypeTemplateParmExpr *E) { 9716 // Default behavior is to do nothing with this transformation. 9717 return E; 9718 } 9719 9720 template<typename Derived> 9721 ExprResult 9722 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 9723 // Default behavior is to do nothing with this transformation. 9724 return E; 9725 } 9726 9727 template<typename Derived> 9728 ExprResult 9729 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 9730 MaterializeTemporaryExpr *E) { 9731 return getDerived().TransformExpr(E->GetTemporaryExpr()); 9732 } 9733 9734 template<typename Derived> 9735 ExprResult 9736 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 9737 Expr *Pattern = E->getPattern(); 9738 9739 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 9740 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 9741 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 9742 9743 // Determine whether the set of unexpanded parameter packs can and should 9744 // be expanded. 9745 bool Expand = true; 9746 bool RetainExpansion = false; 9747 Optional<unsigned> NumExpansions; 9748 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 9749 Pattern->getSourceRange(), 9750 Unexpanded, 9751 Expand, RetainExpansion, 9752 NumExpansions)) 9753 return true; 9754 9755 if (!Expand) { 9756 // Do not expand any packs here, just transform and rebuild a fold 9757 // expression. 9758 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 9759 9760 ExprResult LHS = 9761 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 9762 if (LHS.isInvalid()) 9763 return true; 9764 9765 ExprResult RHS = 9766 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 9767 if (RHS.isInvalid()) 9768 return true; 9769 9770 if (!getDerived().AlwaysRebuild() && 9771 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 9772 return E; 9773 9774 return getDerived().RebuildCXXFoldExpr( 9775 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 9776 RHS.get(), E->getLocEnd()); 9777 } 9778 9779 // The transform has determined that we should perform an elementwise 9780 // expansion of the pattern. Do so. 9781 ExprResult Result = getDerived().TransformExpr(E->getInit()); 9782 if (Result.isInvalid()) 9783 return true; 9784 bool LeftFold = E->isLeftFold(); 9785 9786 // If we're retaining an expansion for a right fold, it is the innermost 9787 // component and takes the init (if any). 9788 if (!LeftFold && RetainExpansion) { 9789 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 9790 9791 ExprResult Out = getDerived().TransformExpr(Pattern); 9792 if (Out.isInvalid()) 9793 return true; 9794 9795 Result = getDerived().RebuildCXXFoldExpr( 9796 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 9797 Result.get(), E->getLocEnd()); 9798 if (Result.isInvalid()) 9799 return true; 9800 } 9801 9802 for (unsigned I = 0; I != *NumExpansions; ++I) { 9803 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 9804 getSema(), LeftFold ? I : *NumExpansions - I - 1); 9805 ExprResult Out = getDerived().TransformExpr(Pattern); 9806 if (Out.isInvalid()) 9807 return true; 9808 9809 if (Out.get()->containsUnexpandedParameterPack()) { 9810 // We still have a pack; retain a pack expansion for this slice. 9811 Result = getDerived().RebuildCXXFoldExpr( 9812 E->getLocStart(), 9813 LeftFold ? Result.get() : Out.get(), 9814 E->getOperator(), E->getEllipsisLoc(), 9815 LeftFold ? Out.get() : Result.get(), 9816 E->getLocEnd()); 9817 } else if (Result.isUsable()) { 9818 // We've got down to a single element; build a binary operator. 9819 Result = getDerived().RebuildBinaryOperator( 9820 E->getEllipsisLoc(), E->getOperator(), 9821 LeftFold ? Result.get() : Out.get(), 9822 LeftFold ? Out.get() : Result.get()); 9823 } else 9824 Result = Out; 9825 9826 if (Result.isInvalid()) 9827 return true; 9828 } 9829 9830 // If we're retaining an expansion for a left fold, it is the outermost 9831 // component and takes the complete expansion so far as its init (if any). 9832 if (LeftFold && RetainExpansion) { 9833 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 9834 9835 ExprResult Out = getDerived().TransformExpr(Pattern); 9836 if (Out.isInvalid()) 9837 return true; 9838 9839 Result = getDerived().RebuildCXXFoldExpr( 9840 E->getLocStart(), Result.get(), 9841 E->getOperator(), E->getEllipsisLoc(), 9842 Out.get(), E->getLocEnd()); 9843 if (Result.isInvalid()) 9844 return true; 9845 } 9846 9847 // If we had no init and an empty pack, and we're not retaining an expansion, 9848 // then produce a fallback value or error. 9849 if (Result.isUnset()) 9850 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 9851 E->getOperator()); 9852 9853 return Result; 9854 } 9855 9856 template<typename Derived> 9857 ExprResult 9858 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 9859 CXXStdInitializerListExpr *E) { 9860 return getDerived().TransformExpr(E->getSubExpr()); 9861 } 9862 9863 template<typename Derived> 9864 ExprResult 9865 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 9866 return SemaRef.MaybeBindToTemporary(E); 9867 } 9868 9869 template<typename Derived> 9870 ExprResult 9871 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 9872 return E; 9873 } 9874 9875 template<typename Derived> 9876 ExprResult 9877 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 9878 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9879 if (SubExpr.isInvalid()) 9880 return ExprError(); 9881 9882 if (!getDerived().AlwaysRebuild() && 9883 SubExpr.get() == E->getSubExpr()) 9884 return E; 9885 9886 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 9887 } 9888 9889 template<typename Derived> 9890 ExprResult 9891 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 9892 // Transform each of the elements. 9893 SmallVector<Expr *, 8> Elements; 9894 bool ArgChanged = false; 9895 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 9896 /*IsCall=*/false, Elements, &ArgChanged)) 9897 return ExprError(); 9898 9899 if (!getDerived().AlwaysRebuild() && !ArgChanged) 9900 return SemaRef.MaybeBindToTemporary(E); 9901 9902 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 9903 Elements.data(), 9904 Elements.size()); 9905 } 9906 9907 template<typename Derived> 9908 ExprResult 9909 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 9910 ObjCDictionaryLiteral *E) { 9911 // Transform each of the elements. 9912 SmallVector<ObjCDictionaryElement, 8> Elements; 9913 bool ArgChanged = false; 9914 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 9915 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 9916 9917 if (OrigElement.isPackExpansion()) { 9918 // This key/value element is a pack expansion. 9919 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 9920 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 9921 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 9922 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 9923 9924 // Determine whether the set of unexpanded parameter packs can 9925 // and should be expanded. 9926 bool Expand = true; 9927 bool RetainExpansion = false; 9928 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 9929 Optional<unsigned> NumExpansions = OrigNumExpansions; 9930 SourceRange PatternRange(OrigElement.Key->getLocStart(), 9931 OrigElement.Value->getLocEnd()); 9932 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 9933 PatternRange, 9934 Unexpanded, 9935 Expand, RetainExpansion, 9936 NumExpansions)) 9937 return ExprError(); 9938 9939 if (!Expand) { 9940 // The transform has determined that we should perform a simple 9941 // transformation on the pack expansion, producing another pack 9942 // expansion. 9943 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 9944 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 9945 if (Key.isInvalid()) 9946 return ExprError(); 9947 9948 if (Key.get() != OrigElement.Key) 9949 ArgChanged = true; 9950 9951 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 9952 if (Value.isInvalid()) 9953 return ExprError(); 9954 9955 if (Value.get() != OrigElement.Value) 9956 ArgChanged = true; 9957 9958 ObjCDictionaryElement Expansion = { 9959 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 9960 }; 9961 Elements.push_back(Expansion); 9962 continue; 9963 } 9964 9965 // Record right away that the argument was changed. This needs 9966 // to happen even if the array expands to nothing. 9967 ArgChanged = true; 9968 9969 // The transform has determined that we should perform an elementwise 9970 // expansion of the pattern. Do so. 9971 for (unsigned I = 0; I != *NumExpansions; ++I) { 9972 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 9973 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 9974 if (Key.isInvalid()) 9975 return ExprError(); 9976 9977 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 9978 if (Value.isInvalid()) 9979 return ExprError(); 9980 9981 ObjCDictionaryElement Element = { 9982 Key.get(), Value.get(), SourceLocation(), NumExpansions 9983 }; 9984 9985 // If any unexpanded parameter packs remain, we still have a 9986 // pack expansion. 9987 // FIXME: Can this really happen? 9988 if (Key.get()->containsUnexpandedParameterPack() || 9989 Value.get()->containsUnexpandedParameterPack()) 9990 Element.EllipsisLoc = OrigElement.EllipsisLoc; 9991 9992 Elements.push_back(Element); 9993 } 9994 9995 // FIXME: Retain a pack expansion if RetainExpansion is true. 9996 9997 // We've finished with this pack expansion. 9998 continue; 9999 } 10000 10001 // Transform and check key. 10002 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 10003 if (Key.isInvalid()) 10004 return ExprError(); 10005 10006 if (Key.get() != OrigElement.Key) 10007 ArgChanged = true; 10008 10009 // Transform and check value. 10010 ExprResult Value 10011 = getDerived().TransformExpr(OrigElement.Value); 10012 if (Value.isInvalid()) 10013 return ExprError(); 10014 10015 if (Value.get() != OrigElement.Value) 10016 ArgChanged = true; 10017 10018 ObjCDictionaryElement Element = { 10019 Key.get(), Value.get(), SourceLocation(), None 10020 }; 10021 Elements.push_back(Element); 10022 } 10023 10024 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10025 return SemaRef.MaybeBindToTemporary(E); 10026 10027 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 10028 Elements.data(), 10029 Elements.size()); 10030 } 10031 10032 template<typename Derived> 10033 ExprResult 10034 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 10035 TypeSourceInfo *EncodedTypeInfo 10036 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 10037 if (!EncodedTypeInfo) 10038 return ExprError(); 10039 10040 if (!getDerived().AlwaysRebuild() && 10041 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 10042 return E; 10043 10044 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 10045 EncodedTypeInfo, 10046 E->getRParenLoc()); 10047 } 10048 10049 template<typename Derived> 10050 ExprResult TreeTransform<Derived>:: 10051 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 10052 // This is a kind of implicit conversion, and it needs to get dropped 10053 // and recomputed for the same general reasons that ImplicitCastExprs 10054 // do, as well a more specific one: this expression is only valid when 10055 // it appears *immediately* as an argument expression. 10056 return getDerived().TransformExpr(E->getSubExpr()); 10057 } 10058 10059 template<typename Derived> 10060 ExprResult TreeTransform<Derived>:: 10061 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 10062 TypeSourceInfo *TSInfo 10063 = getDerived().TransformType(E->getTypeInfoAsWritten()); 10064 if (!TSInfo) 10065 return ExprError(); 10066 10067 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 10068 if (Result.isInvalid()) 10069 return ExprError(); 10070 10071 if (!getDerived().AlwaysRebuild() && 10072 TSInfo == E->getTypeInfoAsWritten() && 10073 Result.get() == E->getSubExpr()) 10074 return E; 10075 10076 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 10077 E->getBridgeKeywordLoc(), TSInfo, 10078 Result.get()); 10079 } 10080 10081 template<typename Derived> 10082 ExprResult 10083 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 10084 // Transform arguments. 10085 bool ArgChanged = false; 10086 SmallVector<Expr*, 8> Args; 10087 Args.reserve(E->getNumArgs()); 10088 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 10089 &ArgChanged)) 10090 return ExprError(); 10091 10092 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 10093 // Class message: transform the receiver type. 10094 TypeSourceInfo *ReceiverTypeInfo 10095 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 10096 if (!ReceiverTypeInfo) 10097 return ExprError(); 10098 10099 // If nothing changed, just retain the existing message send. 10100 if (!getDerived().AlwaysRebuild() && 10101 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 10102 return SemaRef.MaybeBindToTemporary(E); 10103 10104 // Build a new class message send. 10105 SmallVector<SourceLocation, 16> SelLocs; 10106 E->getSelectorLocs(SelLocs); 10107 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 10108 E->getSelector(), 10109 SelLocs, 10110 E->getMethodDecl(), 10111 E->getLeftLoc(), 10112 Args, 10113 E->getRightLoc()); 10114 } 10115 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 10116 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 10117 // Build a new class message send to 'super'. 10118 SmallVector<SourceLocation, 16> SelLocs; 10119 E->getSelectorLocs(SelLocs); 10120 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 10121 E->getSelector(), 10122 SelLocs, 10123 E->getMethodDecl(), 10124 E->getLeftLoc(), 10125 Args, 10126 E->getRightLoc()); 10127 } 10128 10129 // Instance message: transform the receiver 10130 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 10131 "Only class and instance messages may be instantiated"); 10132 ExprResult Receiver 10133 = getDerived().TransformExpr(E->getInstanceReceiver()); 10134 if (Receiver.isInvalid()) 10135 return ExprError(); 10136 10137 // If nothing changed, just retain the existing message send. 10138 if (!getDerived().AlwaysRebuild() && 10139 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 10140 return SemaRef.MaybeBindToTemporary(E); 10141 10142 // Build a new instance message send. 10143 SmallVector<SourceLocation, 16> SelLocs; 10144 E->getSelectorLocs(SelLocs); 10145 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 10146 E->getSelector(), 10147 SelLocs, 10148 E->getMethodDecl(), 10149 E->getLeftLoc(), 10150 Args, 10151 E->getRightLoc()); 10152 } 10153 10154 template<typename Derived> 10155 ExprResult 10156 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 10157 return E; 10158 } 10159 10160 template<typename Derived> 10161 ExprResult 10162 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 10163 return E; 10164 } 10165 10166 template<typename Derived> 10167 ExprResult 10168 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 10169 // Transform the base expression. 10170 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10171 if (Base.isInvalid()) 10172 return ExprError(); 10173 10174 // We don't need to transform the ivar; it will never change. 10175 10176 // If nothing changed, just retain the existing expression. 10177 if (!getDerived().AlwaysRebuild() && 10178 Base.get() == E->getBase()) 10179 return E; 10180 10181 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 10182 E->getLocation(), 10183 E->isArrow(), E->isFreeIvar()); 10184 } 10185 10186 template<typename Derived> 10187 ExprResult 10188 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 10189 // 'super' and types never change. Property never changes. Just 10190 // retain the existing expression. 10191 if (!E->isObjectReceiver()) 10192 return E; 10193 10194 // Transform the base expression. 10195 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10196 if (Base.isInvalid()) 10197 return ExprError(); 10198 10199 // We don't need to transform the property; it will never change. 10200 10201 // If nothing changed, just retain the existing expression. 10202 if (!getDerived().AlwaysRebuild() && 10203 Base.get() == E->getBase()) 10204 return E; 10205 10206 if (E->isExplicitProperty()) 10207 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 10208 E->getExplicitProperty(), 10209 E->getLocation()); 10210 10211 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 10212 SemaRef.Context.PseudoObjectTy, 10213 E->getImplicitPropertyGetter(), 10214 E->getImplicitPropertySetter(), 10215 E->getLocation()); 10216 } 10217 10218 template<typename Derived> 10219 ExprResult 10220 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 10221 // Transform the base expression. 10222 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 10223 if (Base.isInvalid()) 10224 return ExprError(); 10225 10226 // Transform the key expression. 10227 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 10228 if (Key.isInvalid()) 10229 return ExprError(); 10230 10231 // If nothing changed, just retain the existing expression. 10232 if (!getDerived().AlwaysRebuild() && 10233 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 10234 return E; 10235 10236 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 10237 Base.get(), Key.get(), 10238 E->getAtIndexMethodDecl(), 10239 E->setAtIndexMethodDecl()); 10240 } 10241 10242 template<typename Derived> 10243 ExprResult 10244 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 10245 // Transform the base expression. 10246 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10247 if (Base.isInvalid()) 10248 return ExprError(); 10249 10250 // If nothing changed, just retain the existing expression. 10251 if (!getDerived().AlwaysRebuild() && 10252 Base.get() == E->getBase()) 10253 return E; 10254 10255 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 10256 E->getOpLoc(), 10257 E->isArrow()); 10258 } 10259 10260 template<typename Derived> 10261 ExprResult 10262 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 10263 bool ArgumentChanged = false; 10264 SmallVector<Expr*, 8> SubExprs; 10265 SubExprs.reserve(E->getNumSubExprs()); 10266 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 10267 SubExprs, &ArgumentChanged)) 10268 return ExprError(); 10269 10270 if (!getDerived().AlwaysRebuild() && 10271 !ArgumentChanged) 10272 return E; 10273 10274 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 10275 SubExprs, 10276 E->getRParenLoc()); 10277 } 10278 10279 template<typename Derived> 10280 ExprResult 10281 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 10282 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 10283 if (SrcExpr.isInvalid()) 10284 return ExprError(); 10285 10286 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10287 if (!Type) 10288 return ExprError(); 10289 10290 if (!getDerived().AlwaysRebuild() && 10291 Type == E->getTypeSourceInfo() && 10292 SrcExpr.get() == E->getSrcExpr()) 10293 return E; 10294 10295 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 10296 SrcExpr.get(), Type, 10297 E->getRParenLoc()); 10298 } 10299 10300 template<typename Derived> 10301 ExprResult 10302 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 10303 BlockDecl *oldBlock = E->getBlockDecl(); 10304 10305 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 10306 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 10307 10308 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 10309 blockScope->TheDecl->setBlockMissingReturnType( 10310 oldBlock->blockMissingReturnType()); 10311 10312 SmallVector<ParmVarDecl*, 4> params; 10313 SmallVector<QualType, 4> paramTypes; 10314 10315 // Parameter substitution. 10316 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 10317 oldBlock->param_begin(), 10318 oldBlock->param_size(), 10319 nullptr, paramTypes, ¶ms)) { 10320 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 10321 return ExprError(); 10322 } 10323 10324 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 10325 QualType exprResultType = 10326 getDerived().TransformType(exprFunctionType->getReturnType()); 10327 10328 QualType functionType = 10329 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, 10330 exprFunctionType->getExtProtoInfo()); 10331 blockScope->FunctionType = functionType; 10332 10333 // Set the parameters on the block decl. 10334 if (!params.empty()) 10335 blockScope->TheDecl->setParams(params); 10336 10337 if (!oldBlock->blockMissingReturnType()) { 10338 blockScope->HasImplicitReturnType = false; 10339 blockScope->ReturnType = exprResultType; 10340 } 10341 10342 // Transform the body 10343 StmtResult body = getDerived().TransformStmt(E->getBody()); 10344 if (body.isInvalid()) { 10345 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 10346 return ExprError(); 10347 } 10348 10349 #ifndef NDEBUG 10350 // In builds with assertions, make sure that we captured everything we 10351 // captured before. 10352 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 10353 for (const auto &I : oldBlock->captures()) { 10354 VarDecl *oldCapture = I.getVariable(); 10355 10356 // Ignore parameter packs. 10357 if (isa<ParmVarDecl>(oldCapture) && 10358 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 10359 continue; 10360 10361 VarDecl *newCapture = 10362 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 10363 oldCapture)); 10364 assert(blockScope->CaptureMap.count(newCapture)); 10365 } 10366 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 10367 } 10368 #endif 10369 10370 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 10371 /*Scope=*/nullptr); 10372 } 10373 10374 template<typename Derived> 10375 ExprResult 10376 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 10377 llvm_unreachable("Cannot transform asType expressions yet"); 10378 } 10379 10380 template<typename Derived> 10381 ExprResult 10382 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 10383 QualType RetTy = getDerived().TransformType(E->getType()); 10384 bool ArgumentChanged = false; 10385 SmallVector<Expr*, 8> SubExprs; 10386 SubExprs.reserve(E->getNumSubExprs()); 10387 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 10388 SubExprs, &ArgumentChanged)) 10389 return ExprError(); 10390 10391 if (!getDerived().AlwaysRebuild() && 10392 !ArgumentChanged) 10393 return E; 10394 10395 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 10396 RetTy, E->getOp(), E->getRParenLoc()); 10397 } 10398 10399 //===----------------------------------------------------------------------===// 10400 // Type reconstruction 10401 //===----------------------------------------------------------------------===// 10402 10403 template<typename Derived> 10404 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 10405 SourceLocation Star) { 10406 return SemaRef.BuildPointerType(PointeeType, Star, 10407 getDerived().getBaseEntity()); 10408 } 10409 10410 template<typename Derived> 10411 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 10412 SourceLocation Star) { 10413 return SemaRef.BuildBlockPointerType(PointeeType, Star, 10414 getDerived().getBaseEntity()); 10415 } 10416 10417 template<typename Derived> 10418 QualType 10419 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 10420 bool WrittenAsLValue, 10421 SourceLocation Sigil) { 10422 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 10423 Sigil, getDerived().getBaseEntity()); 10424 } 10425 10426 template<typename Derived> 10427 QualType 10428 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 10429 QualType ClassType, 10430 SourceLocation Sigil) { 10431 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 10432 getDerived().getBaseEntity()); 10433 } 10434 10435 template<typename Derived> 10436 QualType 10437 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 10438 ArrayType::ArraySizeModifier SizeMod, 10439 const llvm::APInt *Size, 10440 Expr *SizeExpr, 10441 unsigned IndexTypeQuals, 10442 SourceRange BracketsRange) { 10443 if (SizeExpr || !Size) 10444 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 10445 IndexTypeQuals, BracketsRange, 10446 getDerived().getBaseEntity()); 10447 10448 QualType Types[] = { 10449 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 10450 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 10451 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 10452 }; 10453 const unsigned NumTypes = llvm::array_lengthof(Types); 10454 QualType SizeType; 10455 for (unsigned I = 0; I != NumTypes; ++I) 10456 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 10457 SizeType = Types[I]; 10458 break; 10459 } 10460 10461 // Note that we can return a VariableArrayType here in the case where 10462 // the element type was a dependent VariableArrayType. 10463 IntegerLiteral *ArraySize 10464 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 10465 /*FIXME*/BracketsRange.getBegin()); 10466 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 10467 IndexTypeQuals, BracketsRange, 10468 getDerived().getBaseEntity()); 10469 } 10470 10471 template<typename Derived> 10472 QualType 10473 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 10474 ArrayType::ArraySizeModifier SizeMod, 10475 const llvm::APInt &Size, 10476 unsigned IndexTypeQuals, 10477 SourceRange BracketsRange) { 10478 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 10479 IndexTypeQuals, BracketsRange); 10480 } 10481 10482 template<typename Derived> 10483 QualType 10484 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 10485 ArrayType::ArraySizeModifier SizeMod, 10486 unsigned IndexTypeQuals, 10487 SourceRange BracketsRange) { 10488 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 10489 IndexTypeQuals, BracketsRange); 10490 } 10491 10492 template<typename Derived> 10493 QualType 10494 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 10495 ArrayType::ArraySizeModifier SizeMod, 10496 Expr *SizeExpr, 10497 unsigned IndexTypeQuals, 10498 SourceRange BracketsRange) { 10499 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 10500 SizeExpr, 10501 IndexTypeQuals, BracketsRange); 10502 } 10503 10504 template<typename Derived> 10505 QualType 10506 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 10507 ArrayType::ArraySizeModifier SizeMod, 10508 Expr *SizeExpr, 10509 unsigned IndexTypeQuals, 10510 SourceRange BracketsRange) { 10511 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 10512 SizeExpr, 10513 IndexTypeQuals, BracketsRange); 10514 } 10515 10516 template<typename Derived> 10517 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 10518 unsigned NumElements, 10519 VectorType::VectorKind VecKind) { 10520 // FIXME: semantic checking! 10521 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 10522 } 10523 10524 template<typename Derived> 10525 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 10526 unsigned NumElements, 10527 SourceLocation AttributeLoc) { 10528 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 10529 NumElements, true); 10530 IntegerLiteral *VectorSize 10531 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 10532 AttributeLoc); 10533 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 10534 } 10535 10536 template<typename Derived> 10537 QualType 10538 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 10539 Expr *SizeExpr, 10540 SourceLocation AttributeLoc) { 10541 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 10542 } 10543 10544 template<typename Derived> 10545 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 10546 QualType T, 10547 MutableArrayRef<QualType> ParamTypes, 10548 const FunctionProtoType::ExtProtoInfo &EPI) { 10549 return SemaRef.BuildFunctionType(T, ParamTypes, 10550 getDerived().getBaseLocation(), 10551 getDerived().getBaseEntity(), 10552 EPI); 10553 } 10554 10555 template<typename Derived> 10556 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 10557 return SemaRef.Context.getFunctionNoProtoType(T); 10558 } 10559 10560 template<typename Derived> 10561 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 10562 assert(D && "no decl found"); 10563 if (D->isInvalidDecl()) return QualType(); 10564 10565 // FIXME: Doesn't account for ObjCInterfaceDecl! 10566 TypeDecl *Ty; 10567 if (isa<UsingDecl>(D)) { 10568 UsingDecl *Using = cast<UsingDecl>(D); 10569 assert(Using->hasTypename() && 10570 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 10571 10572 // A valid resolved using typename decl points to exactly one type decl. 10573 assert(++Using->shadow_begin() == Using->shadow_end()); 10574 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 10575 10576 } else { 10577 assert(isa<UnresolvedUsingTypenameDecl>(D) && 10578 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 10579 Ty = cast<UnresolvedUsingTypenameDecl>(D); 10580 } 10581 10582 return SemaRef.Context.getTypeDeclType(Ty); 10583 } 10584 10585 template<typename Derived> 10586 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 10587 SourceLocation Loc) { 10588 return SemaRef.BuildTypeofExprType(E, Loc); 10589 } 10590 10591 template<typename Derived> 10592 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 10593 return SemaRef.Context.getTypeOfType(Underlying); 10594 } 10595 10596 template<typename Derived> 10597 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 10598 SourceLocation Loc) { 10599 return SemaRef.BuildDecltypeType(E, Loc); 10600 } 10601 10602 template<typename Derived> 10603 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 10604 UnaryTransformType::UTTKind UKind, 10605 SourceLocation Loc) { 10606 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 10607 } 10608 10609 template<typename Derived> 10610 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 10611 TemplateName Template, 10612 SourceLocation TemplateNameLoc, 10613 TemplateArgumentListInfo &TemplateArgs) { 10614 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 10615 } 10616 10617 template<typename Derived> 10618 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 10619 SourceLocation KWLoc) { 10620 return SemaRef.BuildAtomicType(ValueType, KWLoc); 10621 } 10622 10623 template<typename Derived> 10624 TemplateName 10625 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 10626 bool TemplateKW, 10627 TemplateDecl *Template) { 10628 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 10629 Template); 10630 } 10631 10632 template<typename Derived> 10633 TemplateName 10634 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 10635 const IdentifierInfo &Name, 10636 SourceLocation NameLoc, 10637 QualType ObjectType, 10638 NamedDecl *FirstQualifierInScope) { 10639 UnqualifiedId TemplateName; 10640 TemplateName.setIdentifier(&Name, NameLoc); 10641 Sema::TemplateTy Template; 10642 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 10643 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 10644 SS, TemplateKWLoc, TemplateName, 10645 ParsedType::make(ObjectType), 10646 /*EnteringContext=*/false, 10647 Template); 10648 return Template.get(); 10649 } 10650 10651 template<typename Derived> 10652 TemplateName 10653 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 10654 OverloadedOperatorKind Operator, 10655 SourceLocation NameLoc, 10656 QualType ObjectType) { 10657 UnqualifiedId Name; 10658 // FIXME: Bogus location information. 10659 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 10660 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 10661 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 10662 Sema::TemplateTy Template; 10663 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 10664 SS, TemplateKWLoc, Name, 10665 ParsedType::make(ObjectType), 10666 /*EnteringContext=*/false, 10667 Template); 10668 return Template.get(); 10669 } 10670 10671 template<typename Derived> 10672 ExprResult 10673 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 10674 SourceLocation OpLoc, 10675 Expr *OrigCallee, 10676 Expr *First, 10677 Expr *Second) { 10678 Expr *Callee = OrigCallee->IgnoreParenCasts(); 10679 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 10680 10681 if (First->getObjectKind() == OK_ObjCProperty) { 10682 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 10683 if (BinaryOperator::isAssignmentOp(Opc)) 10684 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 10685 First, Second); 10686 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 10687 if (Result.isInvalid()) 10688 return ExprError(); 10689 First = Result.get(); 10690 } 10691 10692 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 10693 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 10694 if (Result.isInvalid()) 10695 return ExprError(); 10696 Second = Result.get(); 10697 } 10698 10699 // Determine whether this should be a builtin operation. 10700 if (Op == OO_Subscript) { 10701 if (!First->getType()->isOverloadableType() && 10702 !Second->getType()->isOverloadableType()) 10703 return getSema().CreateBuiltinArraySubscriptExpr(First, 10704 Callee->getLocStart(), 10705 Second, OpLoc); 10706 } else if (Op == OO_Arrow) { 10707 // -> is never a builtin operation. 10708 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 10709 } else if (Second == nullptr || isPostIncDec) { 10710 if (!First->getType()->isOverloadableType()) { 10711 // The argument is not of overloadable type, so try to create a 10712 // built-in unary operation. 10713 UnaryOperatorKind Opc 10714 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 10715 10716 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 10717 } 10718 } else { 10719 if (!First->getType()->isOverloadableType() && 10720 !Second->getType()->isOverloadableType()) { 10721 // Neither of the arguments is an overloadable type, so try to 10722 // create a built-in binary operation. 10723 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 10724 ExprResult Result 10725 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 10726 if (Result.isInvalid()) 10727 return ExprError(); 10728 10729 return Result; 10730 } 10731 } 10732 10733 // Compute the transformed set of functions (and function templates) to be 10734 // used during overload resolution. 10735 UnresolvedSet<16> Functions; 10736 10737 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 10738 assert(ULE->requiresADL()); 10739 Functions.append(ULE->decls_begin(), ULE->decls_end()); 10740 } else { 10741 // If we've resolved this to a particular non-member function, just call 10742 // that function. If we resolved it to a member function, 10743 // CreateOverloaded* will find that function for us. 10744 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 10745 if (!isa<CXXMethodDecl>(ND)) 10746 Functions.addDecl(ND); 10747 } 10748 10749 // Add any functions found via argument-dependent lookup. 10750 Expr *Args[2] = { First, Second }; 10751 unsigned NumArgs = 1 + (Second != nullptr); 10752 10753 // Create the overloaded operator invocation for unary operators. 10754 if (NumArgs == 1 || isPostIncDec) { 10755 UnaryOperatorKind Opc 10756 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 10757 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 10758 } 10759 10760 if (Op == OO_Subscript) { 10761 SourceLocation LBrace; 10762 SourceLocation RBrace; 10763 10764 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 10765 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 10766 LBrace = SourceLocation::getFromRawEncoding( 10767 NameLoc.CXXOperatorName.BeginOpNameLoc); 10768 RBrace = SourceLocation::getFromRawEncoding( 10769 NameLoc.CXXOperatorName.EndOpNameLoc); 10770 } else { 10771 LBrace = Callee->getLocStart(); 10772 RBrace = OpLoc; 10773 } 10774 10775 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 10776 First, Second); 10777 } 10778 10779 // Create the overloaded operator invocation for binary operators. 10780 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 10781 ExprResult Result 10782 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 10783 if (Result.isInvalid()) 10784 return ExprError(); 10785 10786 return Result; 10787 } 10788 10789 template<typename Derived> 10790 ExprResult 10791 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 10792 SourceLocation OperatorLoc, 10793 bool isArrow, 10794 CXXScopeSpec &SS, 10795 TypeSourceInfo *ScopeType, 10796 SourceLocation CCLoc, 10797 SourceLocation TildeLoc, 10798 PseudoDestructorTypeStorage Destroyed) { 10799 QualType BaseType = Base->getType(); 10800 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 10801 (!isArrow && !BaseType->getAs<RecordType>()) || 10802 (isArrow && BaseType->getAs<PointerType>() && 10803 !BaseType->getAs<PointerType>()->getPointeeType() 10804 ->template getAs<RecordType>())){ 10805 // This pseudo-destructor expression is still a pseudo-destructor. 10806 return SemaRef.BuildPseudoDestructorExpr( 10807 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 10808 CCLoc, TildeLoc, Destroyed); 10809 } 10810 10811 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 10812 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 10813 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 10814 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 10815 NameInfo.setNamedTypeInfo(DestroyedType); 10816 10817 // The scope type is now known to be a valid nested name specifier 10818 // component. Tack it on to the end of the nested name specifier. 10819 if (ScopeType) { 10820 if (!ScopeType->getType()->getAs<TagType>()) { 10821 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 10822 diag::err_expected_class_or_namespace) 10823 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 10824 return ExprError(); 10825 } 10826 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 10827 CCLoc); 10828 } 10829 10830 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 10831 return getSema().BuildMemberReferenceExpr(Base, BaseType, 10832 OperatorLoc, isArrow, 10833 SS, TemplateKWLoc, 10834 /*FIXME: FirstQualifier*/ nullptr, 10835 NameInfo, 10836 /*TemplateArgs*/ nullptr); 10837 } 10838 10839 template<typename Derived> 10840 StmtResult 10841 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 10842 SourceLocation Loc = S->getLocStart(); 10843 CapturedDecl *CD = S->getCapturedDecl(); 10844 unsigned NumParams = CD->getNumParams(); 10845 unsigned ContextParamPos = CD->getContextParamPosition(); 10846 SmallVector<Sema::CapturedParamNameType, 4> Params; 10847 for (unsigned I = 0; I < NumParams; ++I) { 10848 if (I != ContextParamPos) { 10849 Params.push_back( 10850 std::make_pair( 10851 CD->getParam(I)->getName(), 10852 getDerived().TransformType(CD->getParam(I)->getType()))); 10853 } else { 10854 Params.push_back(std::make_pair(StringRef(), QualType())); 10855 } 10856 } 10857 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 10858 S->getCapturedRegionKind(), Params); 10859 StmtResult Body; 10860 { 10861 Sema::CompoundScopeRAII CompoundScope(getSema()); 10862 Body = getDerived().TransformStmt(S->getCapturedStmt()); 10863 } 10864 10865 if (Body.isInvalid()) { 10866 getSema().ActOnCapturedRegionError(); 10867 return StmtError(); 10868 } 10869 10870 return getSema().ActOnCapturedRegionEnd(Body.get()); 10871 } 10872 10873 } // end namespace clang 10874 10875 #endif 10876