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