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