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