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