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