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