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