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