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 "CoroutineStmtBuilder.h" 18 #include "TypeLocBuilder.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclObjC.h" 21 #include "clang/AST/DeclTemplate.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/Stmt.h" 27 #include "clang/AST/StmtCXX.h" 28 #include "clang/AST/StmtObjC.h" 29 #include "clang/AST/StmtOpenMP.h" 30 #include "clang/Sema/Designator.h" 31 #include "clang/Sema/Lookup.h" 32 #include "clang/Sema/Ownership.h" 33 #include "clang/Sema/ParsedTemplate.h" 34 #include "clang/Sema/ScopeInfo.h" 35 #include "clang/Sema/SemaDiagnostic.h" 36 #include "clang/Sema/SemaInternal.h" 37 #include "llvm/ADT/ArrayRef.h" 38 #include "llvm/Support/ErrorHandling.h" 39 #include <algorithm> 40 41 namespace clang { 42 using namespace sema; 43 44 /// A semantic tree transformation that allows one to transform one 45 /// abstract syntax tree into another. 46 /// 47 /// A new tree transformation is defined by creating a new subclass \c X of 48 /// \c TreeTransform<X> and then overriding certain operations to provide 49 /// behavior specific to that transformation. For example, template 50 /// instantiation is implemented as a tree transformation where the 51 /// transformation of TemplateTypeParmType nodes involves substituting the 52 /// template arguments for their corresponding template parameters; a similar 53 /// transformation is performed for non-type template parameters and 54 /// template template parameters. 55 /// 56 /// This tree-transformation template uses static polymorphism to allow 57 /// subclasses to customize any of its operations. Thus, a subclass can 58 /// override any of the transformation or rebuild operators by providing an 59 /// operation with the same signature as the default implementation. The 60 /// overriding function should not be virtual. 61 /// 62 /// Semantic tree transformations are split into two stages, either of which 63 /// can be replaced by a subclass. The "transform" step transforms an AST node 64 /// or the parts of an AST node using the various transformation functions, 65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 66 /// node of the appropriate kind from the pieces. The default transformation 67 /// routines recursively transform the operands to composite AST nodes (e.g., 68 /// the pointee type of a PointerType node) and, if any of those operand nodes 69 /// were changed by the transformation, invokes the rebuild operation to create 70 /// a new AST node. 71 /// 72 /// Subclasses can customize the transformation at various levels. The 73 /// most coarse-grained transformations involve replacing TransformType(), 74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 76 /// new implementations. 77 /// 78 /// For more fine-grained transformations, subclasses can replace any of the 79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 81 /// replacing TransformTemplateTypeParmType() allows template instantiation 82 /// to substitute template arguments for their corresponding template 83 /// parameters. Additionally, subclasses can override the \c RebuildXXX 84 /// functions to control how AST nodes are rebuilt when their operands change. 85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 87 /// be able to use more efficient rebuild steps. 88 /// 89 /// There are a handful of other functions that can be overridden, allowing one 90 /// to avoid traversing nodes that don't need any transformation 91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 92 /// operands have not changed (\c AlwaysRebuild()), and customize the 93 /// default locations and entity names used for type-checking 94 /// (\c getBaseLocation(), \c getBaseEntity()). 95 template<typename Derived> 96 class TreeTransform { 97 /// Private RAII object that helps us forget and then re-remember 98 /// the template argument corresponding to a partially-substituted parameter 99 /// pack. 100 class ForgetPartiallySubstitutedPackRAII { 101 Derived &Self; 102 TemplateArgument Old; 103 104 public: 105 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 106 Old = Self.ForgetPartiallySubstitutedPack(); 107 } 108 109 ~ForgetPartiallySubstitutedPackRAII() { 110 Self.RememberPartiallySubstitutedPack(Old); 111 } 112 }; 113 114 protected: 115 Sema &SemaRef; 116 117 /// The set of local declarations that have been transformed, for 118 /// cases where we are forced to build new declarations within the transformer 119 /// rather than in the subclass (e.g., lambda closure types). 120 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 121 122 public: 123 /// Initializes a new tree transformer. 124 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 125 126 /// Retrieves a reference to the derived class. 127 Derived &getDerived() { return static_cast<Derived&>(*this); } 128 129 /// Retrieves a reference to the derived class. 130 const Derived &getDerived() const { 131 return static_cast<const Derived&>(*this); 132 } 133 134 static inline ExprResult Owned(Expr *E) { return E; } 135 static inline StmtResult Owned(Stmt *S) { return S; } 136 137 /// Retrieves a reference to the semantic analysis object used for 138 /// this tree transform. 139 Sema &getSema() const { return SemaRef; } 140 141 /// Whether the transformation should always rebuild AST nodes, even 142 /// if none of the children have changed. 143 /// 144 /// Subclasses may override this function to specify when the transformation 145 /// should rebuild all AST nodes. 146 /// 147 /// We must always rebuild all AST nodes when performing variadic template 148 /// pack expansion, in order to avoid violating the AST invariant that each 149 /// statement node appears at most once in its containing declaration. 150 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 151 152 /// Returns the location of the entity being transformed, if that 153 /// information was not available elsewhere in the AST. 154 /// 155 /// By default, returns no source-location information. Subclasses can 156 /// provide an alternative implementation that provides better location 157 /// information. 158 SourceLocation getBaseLocation() { return SourceLocation(); } 159 160 /// Returns the name of the entity being transformed, if that 161 /// information was not available elsewhere in the AST. 162 /// 163 /// By default, returns an empty name. Subclasses can provide an alternative 164 /// implementation with a more precise name. 165 DeclarationName getBaseEntity() { return DeclarationName(); } 166 167 /// Sets the "base" location and entity when that 168 /// information is known based on another transformation. 169 /// 170 /// By default, the source location and entity are ignored. Subclasses can 171 /// override this function to provide a customized implementation. 172 void setBase(SourceLocation Loc, DeclarationName Entity) { } 173 174 /// RAII object that temporarily sets the base location and entity 175 /// used for reporting diagnostics in types. 176 class TemporaryBase { 177 TreeTransform &Self; 178 SourceLocation OldLocation; 179 DeclarationName OldEntity; 180 181 public: 182 TemporaryBase(TreeTransform &Self, SourceLocation Location, 183 DeclarationName Entity) : Self(Self) { 184 OldLocation = Self.getDerived().getBaseLocation(); 185 OldEntity = Self.getDerived().getBaseEntity(); 186 187 if (Location.isValid()) 188 Self.getDerived().setBase(Location, Entity); 189 } 190 191 ~TemporaryBase() { 192 Self.getDerived().setBase(OldLocation, OldEntity); 193 } 194 }; 195 196 /// Determine whether the given type \p T has already been 197 /// transformed. 198 /// 199 /// Subclasses can provide an alternative implementation of this routine 200 /// to short-circuit evaluation when it is known that a given type will 201 /// not change. For example, template instantiation need not traverse 202 /// non-dependent types. 203 bool AlreadyTransformed(QualType T) { 204 return T.isNull(); 205 } 206 207 /// Determine whether the given call argument should be dropped, e.g., 208 /// because it is a default argument. 209 /// 210 /// Subclasses can provide an alternative implementation of this routine to 211 /// determine which kinds of call arguments get dropped. By default, 212 /// CXXDefaultArgument nodes are dropped (prior to transformation). 213 bool DropCallArgument(Expr *E) { 214 return E->isDefaultArgument(); 215 } 216 217 /// Determine whether we should expand a pack expansion with the 218 /// given set of parameter packs into separate arguments by repeatedly 219 /// transforming the pattern. 220 /// 221 /// By default, the transformer never tries to expand pack expansions. 222 /// Subclasses can override this routine to provide different behavior. 223 /// 224 /// \param EllipsisLoc The location of the ellipsis that identifies the 225 /// pack expansion. 226 /// 227 /// \param PatternRange The source range that covers the entire pattern of 228 /// the pack expansion. 229 /// 230 /// \param Unexpanded The set of unexpanded parameter packs within the 231 /// pattern. 232 /// 233 /// \param ShouldExpand Will be set to \c true if the transformer should 234 /// expand the corresponding pack expansions into separate arguments. When 235 /// set, \c NumExpansions must also be set. 236 /// 237 /// \param RetainExpansion Whether the caller should add an unexpanded 238 /// pack expansion after all of the expanded arguments. This is used 239 /// when extending explicitly-specified template argument packs per 240 /// C++0x [temp.arg.explicit]p9. 241 /// 242 /// \param NumExpansions The number of separate arguments that will be in 243 /// the expanded form of the corresponding pack expansion. This is both an 244 /// input and an output parameter, which can be set by the caller if the 245 /// number of expansions is known a priori (e.g., due to a prior substitution) 246 /// and will be set by the callee when the number of expansions is known. 247 /// The callee must set this value when \c ShouldExpand is \c true; it may 248 /// set this value in other cases. 249 /// 250 /// \returns true if an error occurred (e.g., because the parameter packs 251 /// are to be instantiated with arguments of different lengths), false 252 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 253 /// must be set. 254 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 255 SourceRange PatternRange, 256 ArrayRef<UnexpandedParameterPack> Unexpanded, 257 bool &ShouldExpand, 258 bool &RetainExpansion, 259 Optional<unsigned> &NumExpansions) { 260 ShouldExpand = false; 261 return false; 262 } 263 264 /// "Forget" about the partially-substituted pack template argument, 265 /// when performing an instantiation that must preserve the parameter pack 266 /// use. 267 /// 268 /// This routine is meant to be overridden by the template instantiator. 269 TemplateArgument ForgetPartiallySubstitutedPack() { 270 return TemplateArgument(); 271 } 272 273 /// "Remember" the partially-substituted pack template argument 274 /// after performing an instantiation that must preserve the parameter pack 275 /// use. 276 /// 277 /// This routine is meant to be overridden by the template instantiator. 278 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 279 280 /// Note to the derived class when a function parameter pack is 281 /// being expanded. 282 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 283 284 /// Transforms the given type into another type. 285 /// 286 /// By default, this routine transforms a type by creating a 287 /// TypeSourceInfo for it and delegating to the appropriate 288 /// function. This is expensive, but we don't mind, because 289 /// this method is deprecated anyway; all users should be 290 /// switched to storing TypeSourceInfos. 291 /// 292 /// \returns the transformed type. 293 QualType TransformType(QualType T); 294 295 /// Transforms the given type-with-location into a new 296 /// type-with-location. 297 /// 298 /// By default, this routine transforms a type by delegating to the 299 /// appropriate TransformXXXType to build a new type. Subclasses 300 /// may override this function (to take over all type 301 /// transformations) or some set of the TransformXXXType functions 302 /// to alter the transformation. 303 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 304 305 /// Transform the given type-with-location into a new 306 /// type, collecting location information in the given builder 307 /// as necessary. 308 /// 309 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 310 311 /// Transform a type that is permitted to produce a 312 /// DeducedTemplateSpecializationType. 313 /// 314 /// This is used in the (relatively rare) contexts where it is acceptable 315 /// for transformation to produce a class template type with deduced 316 /// template arguments. 317 /// @{ 318 QualType TransformTypeWithDeducedTST(QualType T); 319 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 320 /// @} 321 322 /// Transform the given statement. 323 /// 324 /// By default, this routine transforms a statement by delegating to the 325 /// appropriate TransformXXXStmt function to transform a specific kind of 326 /// statement or the TransformExpr() function to transform an expression. 327 /// Subclasses may override this function to transform statements using some 328 /// other mechanism. 329 /// 330 /// \returns the transformed statement. 331 StmtResult TransformStmt(Stmt *S); 332 333 /// Transform the given statement. 334 /// 335 /// By default, this routine transforms a statement by delegating to the 336 /// appropriate TransformOMPXXXClause function to transform a specific kind 337 /// of clause. Subclasses may override this function to transform statements 338 /// using some other mechanism. 339 /// 340 /// \returns the transformed OpenMP clause. 341 OMPClause *TransformOMPClause(OMPClause *S); 342 343 /// Transform the given attribute. 344 /// 345 /// By default, this routine transforms a statement by delegating to the 346 /// appropriate TransformXXXAttr function to transform a specific kind 347 /// of attribute. Subclasses may override this function to transform 348 /// attributed statements using some other mechanism. 349 /// 350 /// \returns the transformed attribute 351 const Attr *TransformAttr(const Attr *S); 352 353 /// Transform the specified attribute. 354 /// 355 /// Subclasses should override the transformation of attributes with a pragma 356 /// spelling to transform expressions stored within the attribute. 357 /// 358 /// \returns the transformed attribute. 359 #define ATTR(X) 360 #define PRAGMA_SPELLING_ATTR(X) \ 361 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 362 #include "clang/Basic/AttrList.inc" 363 364 /// Transform the given expression. 365 /// 366 /// By default, this routine transforms an expression by delegating to the 367 /// appropriate TransformXXXExpr function to build a new expression. 368 /// Subclasses may override this function to transform expressions using some 369 /// other mechanism. 370 /// 371 /// \returns the transformed expression. 372 ExprResult TransformExpr(Expr *E); 373 374 /// Transform the given initializer. 375 /// 376 /// By default, this routine transforms an initializer by stripping off the 377 /// semantic nodes added by initialization, then passing the result to 378 /// TransformExpr or TransformExprs. 379 /// 380 /// \returns the transformed initializer. 381 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 382 383 /// Transform the given list of expressions. 384 /// 385 /// This routine transforms a list of expressions by invoking 386 /// \c TransformExpr() for each subexpression. However, it also provides 387 /// support for variadic templates by expanding any pack expansions (if the 388 /// derived class permits such expansion) along the way. When pack expansions 389 /// are present, the number of outputs may not equal the number of inputs. 390 /// 391 /// \param Inputs The set of expressions to be transformed. 392 /// 393 /// \param NumInputs The number of expressions in \c Inputs. 394 /// 395 /// \param IsCall If \c true, then this transform is being performed on 396 /// function-call arguments, and any arguments that should be dropped, will 397 /// be. 398 /// 399 /// \param Outputs The transformed input expressions will be added to this 400 /// vector. 401 /// 402 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 403 /// due to transformation. 404 /// 405 /// \returns true if an error occurred, false otherwise. 406 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 407 SmallVectorImpl<Expr *> &Outputs, 408 bool *ArgChanged = nullptr); 409 410 /// Transform the given declaration, which is referenced from a type 411 /// or expression. 412 /// 413 /// By default, acts as the identity function on declarations, unless the 414 /// transformer has had to transform the declaration itself. Subclasses 415 /// may override this function to provide alternate behavior. 416 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 417 llvm::DenseMap<Decl *, Decl *>::iterator Known 418 = TransformedLocalDecls.find(D); 419 if (Known != TransformedLocalDecls.end()) 420 return Known->second; 421 422 return D; 423 } 424 425 /// Transform the specified condition. 426 /// 427 /// By default, this transforms the variable and expression and rebuilds 428 /// the condition. 429 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 430 Expr *Expr, 431 Sema::ConditionKind Kind); 432 433 /// Transform the attributes associated with the given declaration and 434 /// place them on the new declaration. 435 /// 436 /// By default, this operation does nothing. Subclasses may override this 437 /// behavior to transform attributes. 438 void transformAttrs(Decl *Old, Decl *New) { } 439 440 /// Note that a local declaration has been transformed by this 441 /// transformer. 442 /// 443 /// Local declarations are typically transformed via a call to 444 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 445 /// the transformer itself has to transform the declarations. This routine 446 /// can be overridden by a subclass that keeps track of such mappings. 447 void transformedLocalDecl(Decl *Old, Decl *New) { 448 TransformedLocalDecls[Old] = New; 449 } 450 451 /// Transform the definition of the given declaration. 452 /// 453 /// By default, invokes TransformDecl() to transform the declaration. 454 /// Subclasses may override this function to provide alternate behavior. 455 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 456 return getDerived().TransformDecl(Loc, D); 457 } 458 459 /// Transform the given declaration, which was the first part of a 460 /// nested-name-specifier in a member access expression. 461 /// 462 /// This specific declaration transformation only applies to the first 463 /// identifier in a nested-name-specifier of a member access expression, e.g., 464 /// the \c T in \c x->T::member 465 /// 466 /// By default, invokes TransformDecl() to transform the declaration. 467 /// Subclasses may override this function to provide alternate behavior. 468 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 469 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 470 } 471 472 /// Transform the set of declarations in an OverloadExpr. 473 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 474 LookupResult &R); 475 476 /// Transform the given nested-name-specifier with source-location 477 /// information. 478 /// 479 /// By default, transforms all of the types and declarations within the 480 /// nested-name-specifier. Subclasses may override this function to provide 481 /// alternate behavior. 482 NestedNameSpecifierLoc 483 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 484 QualType ObjectType = QualType(), 485 NamedDecl *FirstQualifierInScope = nullptr); 486 487 /// Transform the given declaration name. 488 /// 489 /// By default, transforms the types of conversion function, constructor, 490 /// and destructor names and then (if needed) rebuilds the declaration name. 491 /// Identifiers and selectors are returned unmodified. Sublcasses may 492 /// override this function to provide alternate behavior. 493 DeclarationNameInfo 494 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 495 496 /// Transform the given template name. 497 /// 498 /// \param SS The nested-name-specifier that qualifies the template 499 /// name. This nested-name-specifier must already have been transformed. 500 /// 501 /// \param Name The template name to transform. 502 /// 503 /// \param NameLoc The source location of the template name. 504 /// 505 /// \param ObjectType If we're translating a template name within a member 506 /// access expression, this is the type of the object whose member template 507 /// is being referenced. 508 /// 509 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 510 /// also refers to a name within the current (lexical) scope, this is the 511 /// declaration it refers to. 512 /// 513 /// By default, transforms the template name by transforming the declarations 514 /// and nested-name-specifiers that occur within the template name. 515 /// Subclasses may override this function to provide alternate behavior. 516 TemplateName 517 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 518 SourceLocation NameLoc, 519 QualType ObjectType = QualType(), 520 NamedDecl *FirstQualifierInScope = nullptr, 521 bool AllowInjectedClassName = false); 522 523 /// Transform the given template argument. 524 /// 525 /// By default, this operation transforms the type, expression, or 526 /// declaration stored within the template argument and constructs a 527 /// new template argument from the transformed result. Subclasses may 528 /// override this function to provide alternate behavior. 529 /// 530 /// Returns true if there was an error. 531 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 532 TemplateArgumentLoc &Output, 533 bool Uneval = false); 534 535 /// Transform the given set of template arguments. 536 /// 537 /// By default, this operation transforms all of the template arguments 538 /// in the input set using \c TransformTemplateArgument(), and appends 539 /// the transformed arguments to the output list. 540 /// 541 /// Note that this overload of \c TransformTemplateArguments() is merely 542 /// a convenience function. Subclasses that wish to override this behavior 543 /// should override the iterator-based member template version. 544 /// 545 /// \param Inputs The set of template arguments to be transformed. 546 /// 547 /// \param NumInputs The number of template arguments in \p Inputs. 548 /// 549 /// \param Outputs The set of transformed template arguments output by this 550 /// routine. 551 /// 552 /// Returns true if an error occurred. 553 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 554 unsigned NumInputs, 555 TemplateArgumentListInfo &Outputs, 556 bool Uneval = false) { 557 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 558 Uneval); 559 } 560 561 /// Transform the given set of template arguments. 562 /// 563 /// By default, this operation transforms all of the template arguments 564 /// in the input set using \c TransformTemplateArgument(), and appends 565 /// the transformed arguments to the output list. 566 /// 567 /// \param First An iterator to the first template argument. 568 /// 569 /// \param Last An iterator one step past the last template argument. 570 /// 571 /// \param Outputs The set of transformed template arguments output by this 572 /// routine. 573 /// 574 /// Returns true if an error occurred. 575 template<typename InputIterator> 576 bool TransformTemplateArguments(InputIterator First, 577 InputIterator Last, 578 TemplateArgumentListInfo &Outputs, 579 bool Uneval = false); 580 581 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 582 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 583 TemplateArgumentLoc &ArgLoc); 584 585 /// Fakes up a TypeSourceInfo for a type. 586 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 587 return SemaRef.Context.getTrivialTypeSourceInfo(T, 588 getDerived().getBaseLocation()); 589 } 590 591 #define ABSTRACT_TYPELOC(CLASS, PARENT) 592 #define TYPELOC(CLASS, PARENT) \ 593 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 594 #include "clang/AST/TypeLocNodes.def" 595 596 template<typename Fn> 597 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 598 FunctionProtoTypeLoc TL, 599 CXXRecordDecl *ThisContext, 600 unsigned ThisTypeQuals, 601 Fn TransformExceptionSpec); 602 603 bool TransformExceptionSpec(SourceLocation Loc, 604 FunctionProtoType::ExceptionSpecInfo &ESI, 605 SmallVectorImpl<QualType> &Exceptions, 606 bool &Changed); 607 608 StmtResult TransformSEHHandler(Stmt *Handler); 609 610 QualType 611 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 612 TemplateSpecializationTypeLoc TL, 613 TemplateName Template); 614 615 QualType 616 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 617 DependentTemplateSpecializationTypeLoc TL, 618 TemplateName Template, 619 CXXScopeSpec &SS); 620 621 QualType TransformDependentTemplateSpecializationType( 622 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 623 NestedNameSpecifierLoc QualifierLoc); 624 625 /// Transforms the parameters of a function type into the 626 /// given vectors. 627 /// 628 /// The result vectors should be kept in sync; null entries in the 629 /// variables vector are acceptable. 630 /// 631 /// Return true on error. 632 bool TransformFunctionTypeParams( 633 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 634 const QualType *ParamTypes, 635 const FunctionProtoType::ExtParameterInfo *ParamInfos, 636 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 637 Sema::ExtParameterInfoBuilder &PInfos); 638 639 /// Transforms a single function-type parameter. Return null 640 /// on error. 641 /// 642 /// \param indexAdjustment - A number to add to the parameter's 643 /// scope index; can be negative 644 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 645 int indexAdjustment, 646 Optional<unsigned> NumExpansions, 647 bool ExpectParameterPack); 648 649 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 650 651 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 652 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 653 654 TemplateParameterList *TransformTemplateParameterList( 655 TemplateParameterList *TPL) { 656 return TPL; 657 } 658 659 ExprResult TransformAddressOfOperand(Expr *E); 660 661 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 662 bool IsAddressOfOperand, 663 TypeSourceInfo **RecoveryTSI); 664 665 ExprResult TransformParenDependentScopeDeclRefExpr( 666 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 667 TypeSourceInfo **RecoveryTSI); 668 669 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 670 671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 672 // amount of stack usage with clang. 673 #define STMT(Node, Parent) \ 674 LLVM_ATTRIBUTE_NOINLINE \ 675 StmtResult Transform##Node(Node *S); 676 #define EXPR(Node, Parent) \ 677 LLVM_ATTRIBUTE_NOINLINE \ 678 ExprResult Transform##Node(Node *E); 679 #define ABSTRACT_STMT(Stmt) 680 #include "clang/AST/StmtNodes.inc" 681 682 #define OPENMP_CLAUSE(Name, Class) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 OMPClause *Transform ## Class(Class *S); 685 #include "clang/Basic/OpenMPKinds.def" 686 687 /// Build a new qualified type given its unqualified type and type 688 /// qualifiers. 689 /// 690 /// By default, this routine adds type qualifiers only to types that can 691 /// have qualifiers, and silently suppresses those qualifiers that are not 692 /// permitted. Subclasses may override this routine to provide different 693 /// behavior. 694 QualType RebuildQualifiedType(QualType T, SourceLocation Loc, 695 Qualifiers Quals); 696 697 /// Build a new pointer type given its pointee type. 698 /// 699 /// By default, performs semantic analysis when building the pointer type. 700 /// Subclasses may override this routine to provide different behavior. 701 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 702 703 /// Build a new block pointer type given its pointee type. 704 /// 705 /// By default, performs semantic analysis when building the block pointer 706 /// type. Subclasses may override this routine to provide different behavior. 707 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 708 709 /// Build a new reference type given the type it references. 710 /// 711 /// By default, performs semantic analysis when building the 712 /// reference type. Subclasses may override this routine to provide 713 /// different behavior. 714 /// 715 /// \param LValue whether the type was written with an lvalue sigil 716 /// or an rvalue sigil. 717 QualType RebuildReferenceType(QualType ReferentType, 718 bool LValue, 719 SourceLocation Sigil); 720 721 /// Build a new member pointer type given the pointee type and the 722 /// class type it refers into. 723 /// 724 /// By default, performs semantic analysis when building the member pointer 725 /// type. Subclasses may override this routine to provide different behavior. 726 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 727 SourceLocation Sigil); 728 729 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 730 SourceLocation ProtocolLAngleLoc, 731 ArrayRef<ObjCProtocolDecl *> Protocols, 732 ArrayRef<SourceLocation> ProtocolLocs, 733 SourceLocation ProtocolRAngleLoc); 734 735 /// Build an Objective-C object type. 736 /// 737 /// By default, performs semantic analysis when building the object type. 738 /// Subclasses may override this routine to provide different behavior. 739 QualType RebuildObjCObjectType(QualType BaseType, 740 SourceLocation Loc, 741 SourceLocation TypeArgsLAngleLoc, 742 ArrayRef<TypeSourceInfo *> TypeArgs, 743 SourceLocation TypeArgsRAngleLoc, 744 SourceLocation ProtocolLAngleLoc, 745 ArrayRef<ObjCProtocolDecl *> Protocols, 746 ArrayRef<SourceLocation> ProtocolLocs, 747 SourceLocation ProtocolRAngleLoc); 748 749 /// Build a new Objective-C object pointer type given the pointee type. 750 /// 751 /// By default, directly builds the pointer type, with no additional semantic 752 /// analysis. 753 QualType RebuildObjCObjectPointerType(QualType PointeeType, 754 SourceLocation Star); 755 756 /// Build a new array type given the element type, size 757 /// modifier, size of the array (if known), size expression, and index type 758 /// qualifiers. 759 /// 760 /// By default, performs semantic analysis when building the array type. 761 /// Subclasses may override this routine to provide different behavior. 762 /// Also by default, all of the other Rebuild*Array 763 QualType RebuildArrayType(QualType ElementType, 764 ArrayType::ArraySizeModifier SizeMod, 765 const llvm::APInt *Size, 766 Expr *SizeExpr, 767 unsigned IndexTypeQuals, 768 SourceRange BracketsRange); 769 770 /// Build a new constant array type given the element type, size 771 /// modifier, (known) size of the array, and index type qualifiers. 772 /// 773 /// By default, performs semantic analysis when building the array type. 774 /// Subclasses may override this routine to provide different behavior. 775 QualType RebuildConstantArrayType(QualType ElementType, 776 ArrayType::ArraySizeModifier SizeMod, 777 const llvm::APInt &Size, 778 unsigned IndexTypeQuals, 779 SourceRange BracketsRange); 780 781 /// Build a new incomplete array type given the element type, size 782 /// modifier, and index type qualifiers. 783 /// 784 /// By default, performs semantic analysis when building the array type. 785 /// Subclasses may override this routine to provide different behavior. 786 QualType RebuildIncompleteArrayType(QualType ElementType, 787 ArrayType::ArraySizeModifier SizeMod, 788 unsigned IndexTypeQuals, 789 SourceRange BracketsRange); 790 791 /// Build a new variable-length array type given the element type, 792 /// size modifier, size expression, and index type qualifiers. 793 /// 794 /// By default, performs semantic analysis when building the array type. 795 /// Subclasses may override this routine to provide different behavior. 796 QualType RebuildVariableArrayType(QualType ElementType, 797 ArrayType::ArraySizeModifier SizeMod, 798 Expr *SizeExpr, 799 unsigned IndexTypeQuals, 800 SourceRange BracketsRange); 801 802 /// Build a new dependent-sized array type given the element type, 803 /// size modifier, size expression, and index type qualifiers. 804 /// 805 /// By default, performs semantic analysis when building the array type. 806 /// Subclasses may override this routine to provide different behavior. 807 QualType RebuildDependentSizedArrayType(QualType ElementType, 808 ArrayType::ArraySizeModifier SizeMod, 809 Expr *SizeExpr, 810 unsigned IndexTypeQuals, 811 SourceRange BracketsRange); 812 813 /// Build a new vector type given the element type and 814 /// number of elements. 815 /// 816 /// By default, performs semantic analysis when building the vector type. 817 /// Subclasses may override this routine to provide different behavior. 818 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 819 VectorType::VectorKind VecKind); 820 821 /// Build a new potentially dependently-sized extended vector type 822 /// given the element type and number of elements. 823 /// 824 /// By default, performs semantic analysis when building the vector type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 827 SourceLocation AttributeLoc, 828 VectorType::VectorKind); 829 830 /// Build a new extended vector type given the element type and 831 /// number of elements. 832 /// 833 /// By default, performs semantic analysis when building the vector type. 834 /// Subclasses may override this routine to provide different behavior. 835 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 836 SourceLocation AttributeLoc); 837 838 /// Build a new potentially dependently-sized extended vector type 839 /// given the element type and number of elements. 840 /// 841 /// By default, performs semantic analysis when building the vector type. 842 /// Subclasses may override this routine to provide different behavior. 843 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 844 Expr *SizeExpr, 845 SourceLocation AttributeLoc); 846 847 /// Build a new DependentAddressSpaceType or return the pointee 848 /// type variable with the correct address space (retrieved from 849 /// AddrSpaceExpr) applied to it. The former will be returned in cases 850 /// where the address space remains dependent. 851 /// 852 /// By default, performs semantic analysis when building the type with address 853 /// space applied. Subclasses may override this routine to provide different 854 /// behavior. 855 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 856 Expr *AddrSpaceExpr, 857 SourceLocation AttributeLoc); 858 859 /// Build a new function type. 860 /// 861 /// By default, performs semantic analysis when building the function type. 862 /// Subclasses may override this routine to provide different behavior. 863 QualType RebuildFunctionProtoType(QualType T, 864 MutableArrayRef<QualType> ParamTypes, 865 const FunctionProtoType::ExtProtoInfo &EPI); 866 867 /// Build a new unprototyped function type. 868 QualType RebuildFunctionNoProtoType(QualType ResultType); 869 870 /// Rebuild an unresolved typename type, given the decl that 871 /// the UnresolvedUsingTypenameDecl was transformed to. 872 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 873 874 /// Build a new typedef type. 875 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 876 return SemaRef.Context.getTypeDeclType(Typedef); 877 } 878 879 /// Build a new class/struct/union type. 880 QualType RebuildRecordType(RecordDecl *Record) { 881 return SemaRef.Context.getTypeDeclType(Record); 882 } 883 884 /// Build a new Enum type. 885 QualType RebuildEnumType(EnumDecl *Enum) { 886 return SemaRef.Context.getTypeDeclType(Enum); 887 } 888 889 /// Build a new typeof(expr) type. 890 /// 891 /// By default, performs semantic analysis when building the typeof type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 894 895 /// Build a new typeof(type) type. 896 /// 897 /// By default, builds a new TypeOfType with the given underlying type. 898 QualType RebuildTypeOfType(QualType Underlying); 899 900 /// Build a new unary transform type. 901 QualType RebuildUnaryTransformType(QualType BaseType, 902 UnaryTransformType::UTTKind UKind, 903 SourceLocation Loc); 904 905 /// Build a new C++11 decltype type. 906 /// 907 /// By default, performs semantic analysis when building the decltype type. 908 /// Subclasses may override this routine to provide different behavior. 909 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 910 911 /// Build a new C++11 auto type. 912 /// 913 /// By default, builds a new AutoType with the given deduced type. 914 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 915 // Note, IsDependent is always false here: we implicitly convert an 'auto' 916 // which has been deduced to a dependent type into an undeduced 'auto', so 917 // that we'll retry deduction after the transformation. 918 return SemaRef.Context.getAutoType(Deduced, Keyword, 919 /*IsDependent*/ false); 920 } 921 922 /// By default, builds a new DeducedTemplateSpecializationType with the given 923 /// deduced type. 924 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 925 QualType Deduced) { 926 return SemaRef.Context.getDeducedTemplateSpecializationType( 927 Template, Deduced, /*IsDependent*/ false); 928 } 929 930 /// Build a new template specialization type. 931 /// 932 /// By default, performs semantic analysis when building the template 933 /// specialization type. Subclasses may override this routine to provide 934 /// different behavior. 935 QualType RebuildTemplateSpecializationType(TemplateName Template, 936 SourceLocation TemplateLoc, 937 TemplateArgumentListInfo &Args); 938 939 /// Build a new parenthesized type. 940 /// 941 /// By default, builds a new ParenType type from the inner type. 942 /// Subclasses may override this routine to provide different behavior. 943 QualType RebuildParenType(QualType InnerType) { 944 return SemaRef.BuildParenType(InnerType); 945 } 946 947 /// Build a new qualified name type. 948 /// 949 /// By default, builds a new ElaboratedType type from the keyword, 950 /// the nested-name-specifier and the named type. 951 /// Subclasses may override this routine to provide different behavior. 952 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 953 ElaboratedTypeKeyword Keyword, 954 NestedNameSpecifierLoc QualifierLoc, 955 QualType Named) { 956 return SemaRef.Context.getElaboratedType(Keyword, 957 QualifierLoc.getNestedNameSpecifier(), 958 Named); 959 } 960 961 /// Build a new typename type that refers to a template-id. 962 /// 963 /// By default, builds a new DependentNameType type from the 964 /// nested-name-specifier and the given type. Subclasses may override 965 /// this routine to provide different behavior. 966 QualType RebuildDependentTemplateSpecializationType( 967 ElaboratedTypeKeyword Keyword, 968 NestedNameSpecifierLoc QualifierLoc, 969 SourceLocation TemplateKWLoc, 970 const IdentifierInfo *Name, 971 SourceLocation NameLoc, 972 TemplateArgumentListInfo &Args, 973 bool AllowInjectedClassName) { 974 // Rebuild the template name. 975 // TODO: avoid TemplateName abstraction 976 CXXScopeSpec SS; 977 SS.Adopt(QualifierLoc); 978 TemplateName InstName = getDerived().RebuildTemplateName( 979 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 980 AllowInjectedClassName); 981 982 if (InstName.isNull()) 983 return QualType(); 984 985 // If it's still dependent, make a dependent specialization. 986 if (InstName.getAsDependentTemplateName()) 987 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 988 QualifierLoc.getNestedNameSpecifier(), 989 Name, 990 Args); 991 992 // Otherwise, make an elaborated type wrapping a non-dependent 993 // specialization. 994 QualType T = 995 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 996 if (T.isNull()) return QualType(); 997 998 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 999 return T; 1000 1001 return SemaRef.Context.getElaboratedType(Keyword, 1002 QualifierLoc.getNestedNameSpecifier(), 1003 T); 1004 } 1005 1006 /// Build a new typename type that refers to an identifier. 1007 /// 1008 /// By default, performs semantic analysis when building the typename type 1009 /// (or elaborated type). Subclasses may override this routine to provide 1010 /// different behavior. 1011 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1012 SourceLocation KeywordLoc, 1013 NestedNameSpecifierLoc QualifierLoc, 1014 const IdentifierInfo *Id, 1015 SourceLocation IdLoc, 1016 bool DeducedTSTContext) { 1017 CXXScopeSpec SS; 1018 SS.Adopt(QualifierLoc); 1019 1020 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1021 // If the name is still dependent, just build a new dependent name type. 1022 if (!SemaRef.computeDeclContext(SS)) 1023 return SemaRef.Context.getDependentNameType(Keyword, 1024 QualifierLoc.getNestedNameSpecifier(), 1025 Id); 1026 } 1027 1028 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1029 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1030 *Id, IdLoc); 1031 // If a dependent name resolves to a deduced template specialization type, 1032 // check that we're in one of the syntactic contexts permitting it. 1033 if (!DeducedTSTContext) { 1034 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1035 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1036 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1037 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1038 Deduced->getTemplateName()) 1039 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1040 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1041 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1042 return QualType(); 1043 } 1044 } 1045 return T; 1046 } 1047 1048 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1049 1050 // We had a dependent elaborated-type-specifier that has been transformed 1051 // into a non-dependent elaborated-type-specifier. Find the tag we're 1052 // referring to. 1053 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1054 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1055 if (!DC) 1056 return QualType(); 1057 1058 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1059 return QualType(); 1060 1061 TagDecl *Tag = nullptr; 1062 SemaRef.LookupQualifiedName(Result, DC); 1063 switch (Result.getResultKind()) { 1064 case LookupResult::NotFound: 1065 case LookupResult::NotFoundInCurrentInstantiation: 1066 break; 1067 1068 case LookupResult::Found: 1069 Tag = Result.getAsSingle<TagDecl>(); 1070 break; 1071 1072 case LookupResult::FoundOverloaded: 1073 case LookupResult::FoundUnresolvedValue: 1074 llvm_unreachable("Tag lookup cannot find non-tags"); 1075 1076 case LookupResult::Ambiguous: 1077 // Let the LookupResult structure handle ambiguities. 1078 return QualType(); 1079 } 1080 1081 if (!Tag) { 1082 // Check where the name exists but isn't a tag type and use that to emit 1083 // better diagnostics. 1084 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1085 SemaRef.LookupQualifiedName(Result, DC); 1086 switch (Result.getResultKind()) { 1087 case LookupResult::Found: 1088 case LookupResult::FoundOverloaded: 1089 case LookupResult::FoundUnresolvedValue: { 1090 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1091 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1092 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1093 << NTK << Kind; 1094 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1095 break; 1096 } 1097 default: 1098 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1099 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1100 break; 1101 } 1102 return QualType(); 1103 } 1104 1105 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1106 IdLoc, Id)) { 1107 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1108 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1109 return QualType(); 1110 } 1111 1112 // Build the elaborated-type-specifier type. 1113 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1114 return SemaRef.Context.getElaboratedType(Keyword, 1115 QualifierLoc.getNestedNameSpecifier(), 1116 T); 1117 } 1118 1119 /// Build a new pack expansion type. 1120 /// 1121 /// By default, builds a new PackExpansionType type from the given pattern. 1122 /// Subclasses may override this routine to provide different behavior. 1123 QualType RebuildPackExpansionType(QualType Pattern, 1124 SourceRange PatternRange, 1125 SourceLocation EllipsisLoc, 1126 Optional<unsigned> NumExpansions) { 1127 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1128 NumExpansions); 1129 } 1130 1131 /// Build a new atomic type given its value type. 1132 /// 1133 /// By default, performs semantic analysis when building the atomic type. 1134 /// Subclasses may override this routine to provide different behavior. 1135 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1136 1137 /// Build a new pipe type given its value type. 1138 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1139 bool isReadPipe); 1140 1141 /// Build a new template name given a nested name specifier, a flag 1142 /// indicating whether the "template" keyword was provided, and the template 1143 /// that the template name refers to. 1144 /// 1145 /// By default, builds the new template name directly. Subclasses may override 1146 /// this routine to provide different behavior. 1147 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1148 bool TemplateKW, 1149 TemplateDecl *Template); 1150 1151 /// Build a new template name given a nested name specifier and the 1152 /// name that is referred to as a template. 1153 /// 1154 /// By default, performs semantic analysis to determine whether the name can 1155 /// be resolved to a specific template, then builds the appropriate kind of 1156 /// template name. Subclasses may override this routine to provide different 1157 /// behavior. 1158 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1159 SourceLocation TemplateKWLoc, 1160 const IdentifierInfo &Name, 1161 SourceLocation NameLoc, QualType ObjectType, 1162 NamedDecl *FirstQualifierInScope, 1163 bool AllowInjectedClassName); 1164 1165 /// Build a new template name given a nested name specifier and the 1166 /// overloaded operator name that is referred to as a template. 1167 /// 1168 /// By default, performs semantic analysis to determine whether the name can 1169 /// be resolved to a specific template, then builds the appropriate kind of 1170 /// template name. Subclasses may override this routine to provide different 1171 /// behavior. 1172 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1173 SourceLocation TemplateKWLoc, 1174 OverloadedOperatorKind Operator, 1175 SourceLocation NameLoc, QualType ObjectType, 1176 bool AllowInjectedClassName); 1177 1178 /// Build a new template name given a template template parameter pack 1179 /// and the 1180 /// 1181 /// By default, performs semantic analysis to determine whether the name can 1182 /// be resolved to a specific template, then builds the appropriate kind of 1183 /// template name. Subclasses may override this routine to provide different 1184 /// behavior. 1185 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1186 const TemplateArgument &ArgPack) { 1187 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1188 } 1189 1190 /// Build a new compound statement. 1191 /// 1192 /// By default, performs semantic analysis to build the new statement. 1193 /// Subclasses may override this routine to provide different behavior. 1194 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1195 MultiStmtArg Statements, 1196 SourceLocation RBraceLoc, 1197 bool IsStmtExpr) { 1198 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1199 IsStmtExpr); 1200 } 1201 1202 /// Build a new case statement. 1203 /// 1204 /// By default, performs semantic analysis to build the new statement. 1205 /// Subclasses may override this routine to provide different behavior. 1206 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1207 Expr *LHS, 1208 SourceLocation EllipsisLoc, 1209 Expr *RHS, 1210 SourceLocation ColonLoc) { 1211 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1212 ColonLoc); 1213 } 1214 1215 /// Attach the body to a new case statement. 1216 /// 1217 /// By default, performs semantic analysis to build the new statement. 1218 /// Subclasses may override this routine to provide different behavior. 1219 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1220 getSema().ActOnCaseStmtBody(S, Body); 1221 return S; 1222 } 1223 1224 /// Build a new default statement. 1225 /// 1226 /// By default, performs semantic analysis to build the new statement. 1227 /// Subclasses may override this routine to provide different behavior. 1228 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1229 SourceLocation ColonLoc, 1230 Stmt *SubStmt) { 1231 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1232 /*CurScope=*/nullptr); 1233 } 1234 1235 /// Build a new label statement. 1236 /// 1237 /// By default, performs semantic analysis to build the new statement. 1238 /// Subclasses may override this routine to provide different behavior. 1239 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1240 SourceLocation ColonLoc, Stmt *SubStmt) { 1241 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1242 } 1243 1244 /// Build a new label statement. 1245 /// 1246 /// By default, performs semantic analysis to build the new statement. 1247 /// Subclasses may override this routine to provide different behavior. 1248 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1249 ArrayRef<const Attr*> Attrs, 1250 Stmt *SubStmt) { 1251 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1252 } 1253 1254 /// Build a new "if" statement. 1255 /// 1256 /// By default, performs semantic analysis to build the new statement. 1257 /// Subclasses may override this routine to provide different behavior. 1258 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1259 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1260 SourceLocation ElseLoc, Stmt *Else) { 1261 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1262 ElseLoc, Else); 1263 } 1264 1265 /// Start building a new switch statement. 1266 /// 1267 /// By default, performs semantic analysis to build the new statement. 1268 /// Subclasses may override this routine to provide different behavior. 1269 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1270 Sema::ConditionResult Cond) { 1271 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1272 } 1273 1274 /// Attach the body to the switch statement. 1275 /// 1276 /// By default, performs semantic analysis to build the new statement. 1277 /// Subclasses may override this routine to provide different behavior. 1278 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1279 Stmt *Switch, Stmt *Body) { 1280 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1281 } 1282 1283 /// Build a new while statement. 1284 /// 1285 /// By default, performs semantic analysis to build the new statement. 1286 /// Subclasses may override this routine to provide different behavior. 1287 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1288 Sema::ConditionResult Cond, Stmt *Body) { 1289 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1290 } 1291 1292 /// Build a new do-while statement. 1293 /// 1294 /// By default, performs semantic analysis to build the new statement. 1295 /// Subclasses may override this routine to provide different behavior. 1296 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1297 SourceLocation WhileLoc, SourceLocation LParenLoc, 1298 Expr *Cond, SourceLocation RParenLoc) { 1299 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1300 Cond, RParenLoc); 1301 } 1302 1303 /// Build a new for statement. 1304 /// 1305 /// By default, performs semantic analysis to build the new statement. 1306 /// Subclasses may override this routine to provide different behavior. 1307 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1308 Stmt *Init, Sema::ConditionResult Cond, 1309 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1310 Stmt *Body) { 1311 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1312 Inc, RParenLoc, Body); 1313 } 1314 1315 /// Build a new goto statement. 1316 /// 1317 /// By default, performs semantic analysis to build the new statement. 1318 /// Subclasses may override this routine to provide different behavior. 1319 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1320 LabelDecl *Label) { 1321 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1322 } 1323 1324 /// Build a new indirect goto statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1329 SourceLocation StarLoc, 1330 Expr *Target) { 1331 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1332 } 1333 1334 /// Build a new return statement. 1335 /// 1336 /// By default, performs semantic analysis to build the new statement. 1337 /// Subclasses may override this routine to provide different behavior. 1338 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1339 return getSema().BuildReturnStmt(ReturnLoc, Result); 1340 } 1341 1342 /// Build a new declaration statement. 1343 /// 1344 /// By default, performs semantic analysis to build the new statement. 1345 /// Subclasses may override this routine to provide different behavior. 1346 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1347 SourceLocation StartLoc, SourceLocation EndLoc) { 1348 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1349 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1350 } 1351 1352 /// Build a new inline asm statement. 1353 /// 1354 /// By default, performs semantic analysis to build the new statement. 1355 /// Subclasses may override this routine to provide different behavior. 1356 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1357 bool IsVolatile, unsigned NumOutputs, 1358 unsigned NumInputs, IdentifierInfo **Names, 1359 MultiExprArg Constraints, MultiExprArg Exprs, 1360 Expr *AsmString, MultiExprArg Clobbers, 1361 SourceLocation RParenLoc) { 1362 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1363 NumInputs, Names, Constraints, Exprs, 1364 AsmString, Clobbers, RParenLoc); 1365 } 1366 1367 /// Build a new MS style inline asm statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1372 ArrayRef<Token> AsmToks, 1373 StringRef AsmString, 1374 unsigned NumOutputs, unsigned NumInputs, 1375 ArrayRef<StringRef> Constraints, 1376 ArrayRef<StringRef> Clobbers, 1377 ArrayRef<Expr*> Exprs, 1378 SourceLocation EndLoc) { 1379 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1380 NumOutputs, NumInputs, 1381 Constraints, Clobbers, Exprs, EndLoc); 1382 } 1383 1384 /// Build a new co_return statement. 1385 /// 1386 /// By default, performs semantic analysis to build the new statement. 1387 /// Subclasses may override this routine to provide different behavior. 1388 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1389 bool IsImplicit) { 1390 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1391 } 1392 1393 /// Build a new co_await expression. 1394 /// 1395 /// By default, performs semantic analysis to build the new expression. 1396 /// Subclasses may override this routine to provide different behavior. 1397 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1398 bool IsImplicit) { 1399 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1400 } 1401 1402 /// Build a new co_await expression. 1403 /// 1404 /// By default, performs semantic analysis to build the new expression. 1405 /// Subclasses may override this routine to provide different behavior. 1406 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1407 Expr *Result, 1408 UnresolvedLookupExpr *Lookup) { 1409 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1410 } 1411 1412 /// Build a new co_yield expression. 1413 /// 1414 /// By default, performs semantic analysis to build the new expression. 1415 /// Subclasses may override this routine to provide different behavior. 1416 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1417 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1418 } 1419 1420 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1421 return getSema().BuildCoroutineBodyStmt(Args); 1422 } 1423 1424 /// Build a new Objective-C \@try statement. 1425 /// 1426 /// By default, performs semantic analysis to build the new statement. 1427 /// Subclasses may override this routine to provide different behavior. 1428 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1429 Stmt *TryBody, 1430 MultiStmtArg CatchStmts, 1431 Stmt *Finally) { 1432 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1433 Finally); 1434 } 1435 1436 /// Rebuild an Objective-C exception declaration. 1437 /// 1438 /// By default, performs semantic analysis to build the new declaration. 1439 /// Subclasses may override this routine to provide different behavior. 1440 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1441 TypeSourceInfo *TInfo, QualType T) { 1442 return getSema().BuildObjCExceptionDecl(TInfo, T, 1443 ExceptionDecl->getInnerLocStart(), 1444 ExceptionDecl->getLocation(), 1445 ExceptionDecl->getIdentifier()); 1446 } 1447 1448 /// Build a new Objective-C \@catch statement. 1449 /// 1450 /// By default, performs semantic analysis to build the new statement. 1451 /// Subclasses may override this routine to provide different behavior. 1452 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1453 SourceLocation RParenLoc, 1454 VarDecl *Var, 1455 Stmt *Body) { 1456 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1457 Var, Body); 1458 } 1459 1460 /// Build a new Objective-C \@finally statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1465 Stmt *Body) { 1466 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1467 } 1468 1469 /// Build a new Objective-C \@throw statement. 1470 /// 1471 /// By default, performs semantic analysis to build the new statement. 1472 /// Subclasses may override this routine to provide different behavior. 1473 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1474 Expr *Operand) { 1475 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1476 } 1477 1478 /// Build a new OpenMP executable directive. 1479 /// 1480 /// By default, performs semantic analysis to build the new statement. 1481 /// Subclasses may override this routine to provide different behavior. 1482 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1483 DeclarationNameInfo DirName, 1484 OpenMPDirectiveKind CancelRegion, 1485 ArrayRef<OMPClause *> Clauses, 1486 Stmt *AStmt, SourceLocation StartLoc, 1487 SourceLocation EndLoc) { 1488 return getSema().ActOnOpenMPExecutableDirective( 1489 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1490 } 1491 1492 /// Build a new OpenMP 'if' clause. 1493 /// 1494 /// By default, performs semantic analysis to build the new OpenMP clause. 1495 /// Subclasses may override this routine to provide different behavior. 1496 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1497 Expr *Condition, SourceLocation StartLoc, 1498 SourceLocation LParenLoc, 1499 SourceLocation NameModifierLoc, 1500 SourceLocation ColonLoc, 1501 SourceLocation EndLoc) { 1502 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1503 LParenLoc, NameModifierLoc, ColonLoc, 1504 EndLoc); 1505 } 1506 1507 /// Build a new OpenMP 'final' clause. 1508 /// 1509 /// By default, performs semantic analysis to build the new OpenMP clause. 1510 /// Subclasses may override this routine to provide different behavior. 1511 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1512 SourceLocation LParenLoc, 1513 SourceLocation EndLoc) { 1514 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1515 EndLoc); 1516 } 1517 1518 /// Build a new OpenMP 'num_threads' clause. 1519 /// 1520 /// By default, performs semantic analysis to build the new OpenMP clause. 1521 /// Subclasses may override this routine to provide different behavior. 1522 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1523 SourceLocation StartLoc, 1524 SourceLocation LParenLoc, 1525 SourceLocation EndLoc) { 1526 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1527 LParenLoc, EndLoc); 1528 } 1529 1530 /// Build a new OpenMP 'safelen' clause. 1531 /// 1532 /// By default, performs semantic analysis to build the new OpenMP clause. 1533 /// Subclasses may override this routine to provide different behavior. 1534 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1535 SourceLocation LParenLoc, 1536 SourceLocation EndLoc) { 1537 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1538 } 1539 1540 /// Build a new OpenMP 'simdlen' clause. 1541 /// 1542 /// By default, performs semantic analysis to build the new OpenMP clause. 1543 /// Subclasses may override this routine to provide different behavior. 1544 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1545 SourceLocation LParenLoc, 1546 SourceLocation EndLoc) { 1547 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1548 } 1549 1550 /// Build a new OpenMP 'collapse' clause. 1551 /// 1552 /// By default, performs semantic analysis to build the new OpenMP clause. 1553 /// Subclasses may override this routine to provide different behavior. 1554 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1555 SourceLocation LParenLoc, 1556 SourceLocation EndLoc) { 1557 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1558 EndLoc); 1559 } 1560 1561 /// Build a new OpenMP 'default' clause. 1562 /// 1563 /// By default, performs semantic analysis to build the new OpenMP clause. 1564 /// Subclasses may override this routine to provide different behavior. 1565 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1566 SourceLocation KindKwLoc, 1567 SourceLocation StartLoc, 1568 SourceLocation LParenLoc, 1569 SourceLocation EndLoc) { 1570 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1571 StartLoc, LParenLoc, EndLoc); 1572 } 1573 1574 /// Build a new OpenMP 'proc_bind' clause. 1575 /// 1576 /// By default, performs semantic analysis to build the new OpenMP clause. 1577 /// Subclasses may override this routine to provide different behavior. 1578 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1579 SourceLocation KindKwLoc, 1580 SourceLocation StartLoc, 1581 SourceLocation LParenLoc, 1582 SourceLocation EndLoc) { 1583 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1584 StartLoc, LParenLoc, EndLoc); 1585 } 1586 1587 /// Build a new OpenMP 'schedule' clause. 1588 /// 1589 /// By default, performs semantic analysis to build the new OpenMP clause. 1590 /// Subclasses may override this routine to provide different behavior. 1591 OMPClause *RebuildOMPScheduleClause( 1592 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1593 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1594 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1595 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1596 return getSema().ActOnOpenMPScheduleClause( 1597 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1598 CommaLoc, EndLoc); 1599 } 1600 1601 /// Build a new OpenMP 'ordered' clause. 1602 /// 1603 /// By default, performs semantic analysis to build the new OpenMP clause. 1604 /// Subclasses may override this routine to provide different behavior. 1605 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1606 SourceLocation EndLoc, 1607 SourceLocation LParenLoc, Expr *Num) { 1608 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1609 } 1610 1611 /// Build a new OpenMP 'private' clause. 1612 /// 1613 /// By default, performs semantic analysis to build the new OpenMP clause. 1614 /// Subclasses may override this routine to provide different behavior. 1615 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1616 SourceLocation StartLoc, 1617 SourceLocation LParenLoc, 1618 SourceLocation EndLoc) { 1619 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1620 EndLoc); 1621 } 1622 1623 /// Build a new OpenMP 'firstprivate' clause. 1624 /// 1625 /// By default, performs semantic analysis to build the new OpenMP clause. 1626 /// Subclasses may override this routine to provide different behavior. 1627 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1628 SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1632 EndLoc); 1633 } 1634 1635 /// Build a new OpenMP 'lastprivate' clause. 1636 /// 1637 /// By default, performs semantic analysis to build the new OpenMP clause. 1638 /// Subclasses may override this routine to provide different behavior. 1639 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1640 SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1644 EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'shared' clause. 1648 /// 1649 /// By default, performs semantic analysis to build the new OpenMP clause. 1650 /// Subclasses may override this routine to provide different behavior. 1651 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1652 SourceLocation StartLoc, 1653 SourceLocation LParenLoc, 1654 SourceLocation EndLoc) { 1655 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1656 EndLoc); 1657 } 1658 1659 /// Build a new OpenMP 'reduction' clause. 1660 /// 1661 /// By default, performs semantic analysis to build the new statement. 1662 /// Subclasses may override this routine to provide different behavior. 1663 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1664 SourceLocation StartLoc, 1665 SourceLocation LParenLoc, 1666 SourceLocation ColonLoc, 1667 SourceLocation EndLoc, 1668 CXXScopeSpec &ReductionIdScopeSpec, 1669 const DeclarationNameInfo &ReductionId, 1670 ArrayRef<Expr *> UnresolvedReductions) { 1671 return getSema().ActOnOpenMPReductionClause( 1672 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1673 ReductionId, UnresolvedReductions); 1674 } 1675 1676 /// Build a new OpenMP 'task_reduction' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new statement. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPTaskReductionClause( 1681 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1682 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1683 CXXScopeSpec &ReductionIdScopeSpec, 1684 const DeclarationNameInfo &ReductionId, 1685 ArrayRef<Expr *> UnresolvedReductions) { 1686 return getSema().ActOnOpenMPTaskReductionClause( 1687 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1688 ReductionId, UnresolvedReductions); 1689 } 1690 1691 /// Build a new OpenMP 'in_reduction' clause. 1692 /// 1693 /// By default, performs semantic analysis to build the new statement. 1694 /// Subclasses may override this routine to provide different behavior. 1695 OMPClause * 1696 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1697 SourceLocation LParenLoc, SourceLocation ColonLoc, 1698 SourceLocation EndLoc, 1699 CXXScopeSpec &ReductionIdScopeSpec, 1700 const DeclarationNameInfo &ReductionId, 1701 ArrayRef<Expr *> UnresolvedReductions) { 1702 return getSema().ActOnOpenMPInReductionClause( 1703 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1704 ReductionId, UnresolvedReductions); 1705 } 1706 1707 /// Build a new OpenMP 'linear' clause. 1708 /// 1709 /// By default, performs semantic analysis to build the new OpenMP clause. 1710 /// Subclasses may override this routine to provide different behavior. 1711 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1712 SourceLocation StartLoc, 1713 SourceLocation LParenLoc, 1714 OpenMPLinearClauseKind Modifier, 1715 SourceLocation ModifierLoc, 1716 SourceLocation ColonLoc, 1717 SourceLocation EndLoc) { 1718 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1719 Modifier, ModifierLoc, ColonLoc, 1720 EndLoc); 1721 } 1722 1723 /// Build a new OpenMP 'aligned' clause. 1724 /// 1725 /// By default, performs semantic analysis to build the new OpenMP clause. 1726 /// Subclasses may override this routine to provide different behavior. 1727 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1728 SourceLocation StartLoc, 1729 SourceLocation LParenLoc, 1730 SourceLocation ColonLoc, 1731 SourceLocation EndLoc) { 1732 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1733 LParenLoc, ColonLoc, EndLoc); 1734 } 1735 1736 /// Build a new OpenMP 'copyin' clause. 1737 /// 1738 /// By default, performs semantic analysis to build the new OpenMP clause. 1739 /// Subclasses may override this routine to provide different behavior. 1740 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1741 SourceLocation StartLoc, 1742 SourceLocation LParenLoc, 1743 SourceLocation EndLoc) { 1744 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1745 EndLoc); 1746 } 1747 1748 /// Build a new OpenMP 'copyprivate' clause. 1749 /// 1750 /// By default, performs semantic analysis to build the new OpenMP clause. 1751 /// Subclasses may override this routine to provide different behavior. 1752 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1753 SourceLocation StartLoc, 1754 SourceLocation LParenLoc, 1755 SourceLocation EndLoc) { 1756 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1757 EndLoc); 1758 } 1759 1760 /// Build a new OpenMP 'flush' pseudo clause. 1761 /// 1762 /// By default, performs semantic analysis to build the new OpenMP clause. 1763 /// Subclasses may override this routine to provide different behavior. 1764 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1765 SourceLocation StartLoc, 1766 SourceLocation LParenLoc, 1767 SourceLocation EndLoc) { 1768 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1769 EndLoc); 1770 } 1771 1772 /// Build a new OpenMP 'depend' pseudo clause. 1773 /// 1774 /// By default, performs semantic analysis to build the new OpenMP clause. 1775 /// Subclasses may override this routine to provide different behavior. 1776 OMPClause * 1777 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1778 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1779 SourceLocation StartLoc, SourceLocation LParenLoc, 1780 SourceLocation EndLoc) { 1781 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1782 StartLoc, LParenLoc, EndLoc); 1783 } 1784 1785 /// Build a new OpenMP 'device' clause. 1786 /// 1787 /// By default, performs semantic analysis to build the new statement. 1788 /// Subclasses may override this routine to provide different behavior. 1789 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1790 SourceLocation LParenLoc, 1791 SourceLocation EndLoc) { 1792 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1793 EndLoc); 1794 } 1795 1796 /// Build a new OpenMP 'map' clause. 1797 /// 1798 /// By default, performs semantic analysis to build the new OpenMP clause. 1799 /// Subclasses may override this routine to provide different behavior. 1800 OMPClause * 1801 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1802 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1803 SourceLocation MapLoc, SourceLocation ColonLoc, 1804 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1805 SourceLocation LParenLoc, SourceLocation EndLoc) { 1806 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1807 IsMapTypeImplicit, MapLoc, ColonLoc, 1808 VarList, StartLoc, LParenLoc, EndLoc); 1809 } 1810 1811 /// Build a new OpenMP 'num_teams' clause. 1812 /// 1813 /// By default, performs semantic analysis to build the new statement. 1814 /// Subclasses may override this routine to provide different behavior. 1815 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1816 SourceLocation LParenLoc, 1817 SourceLocation EndLoc) { 1818 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1819 EndLoc); 1820 } 1821 1822 /// Build a new OpenMP 'thread_limit' clause. 1823 /// 1824 /// By default, performs semantic analysis to build the new statement. 1825 /// Subclasses may override this routine to provide different behavior. 1826 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1827 SourceLocation StartLoc, 1828 SourceLocation LParenLoc, 1829 SourceLocation EndLoc) { 1830 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1831 LParenLoc, EndLoc); 1832 } 1833 1834 /// Build a new OpenMP 'priority' clause. 1835 /// 1836 /// By default, performs semantic analysis to build the new statement. 1837 /// Subclasses may override this routine to provide different behavior. 1838 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1839 SourceLocation LParenLoc, 1840 SourceLocation EndLoc) { 1841 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1842 EndLoc); 1843 } 1844 1845 /// Build a new OpenMP 'grainsize' clause. 1846 /// 1847 /// By default, performs semantic analysis to build the new statement. 1848 /// Subclasses may override this routine to provide different behavior. 1849 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1850 SourceLocation LParenLoc, 1851 SourceLocation EndLoc) { 1852 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1853 EndLoc); 1854 } 1855 1856 /// Build a new OpenMP 'num_tasks' clause. 1857 /// 1858 /// By default, performs semantic analysis to build the new statement. 1859 /// Subclasses may override this routine to provide different behavior. 1860 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1861 SourceLocation LParenLoc, 1862 SourceLocation EndLoc) { 1863 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1864 EndLoc); 1865 } 1866 1867 /// Build a new OpenMP 'hint' clause. 1868 /// 1869 /// By default, performs semantic analysis to build the new statement. 1870 /// Subclasses may override this routine to provide different behavior. 1871 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1872 SourceLocation LParenLoc, 1873 SourceLocation EndLoc) { 1874 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1875 } 1876 1877 /// Build a new OpenMP 'dist_schedule' clause. 1878 /// 1879 /// By default, performs semantic analysis to build the new OpenMP clause. 1880 /// Subclasses may override this routine to provide different behavior. 1881 OMPClause * 1882 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1883 Expr *ChunkSize, SourceLocation StartLoc, 1884 SourceLocation LParenLoc, SourceLocation KindLoc, 1885 SourceLocation CommaLoc, SourceLocation EndLoc) { 1886 return getSema().ActOnOpenMPDistScheduleClause( 1887 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1888 } 1889 1890 /// Build a new OpenMP 'to' clause. 1891 /// 1892 /// By default, performs semantic analysis to build the new statement. 1893 /// Subclasses may override this routine to provide different behavior. 1894 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1895 SourceLocation StartLoc, 1896 SourceLocation LParenLoc, 1897 SourceLocation EndLoc) { 1898 return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); 1899 } 1900 1901 /// Build a new OpenMP 'from' clause. 1902 /// 1903 /// By default, performs semantic analysis to build the new statement. 1904 /// Subclasses may override this routine to provide different behavior. 1905 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1906 SourceLocation StartLoc, 1907 SourceLocation LParenLoc, 1908 SourceLocation EndLoc) { 1909 return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, 1910 EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'use_device_ptr' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new OpenMP clause. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1918 SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation EndLoc) { 1921 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc, 1922 EndLoc); 1923 } 1924 1925 /// Build a new OpenMP 'is_device_ptr' clause. 1926 /// 1927 /// By default, performs semantic analysis to build the new OpenMP clause. 1928 /// Subclasses may override this routine to provide different behavior. 1929 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1930 SourceLocation StartLoc, 1931 SourceLocation LParenLoc, 1932 SourceLocation EndLoc) { 1933 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc, 1934 EndLoc); 1935 } 1936 1937 /// Rebuild the operand to an Objective-C \@synchronized statement. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1942 Expr *object) { 1943 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1944 } 1945 1946 /// Build a new Objective-C \@synchronized statement. 1947 /// 1948 /// By default, performs semantic analysis to build the new statement. 1949 /// Subclasses may override this routine to provide different behavior. 1950 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1951 Expr *Object, Stmt *Body) { 1952 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1953 } 1954 1955 /// Build a new Objective-C \@autoreleasepool statement. 1956 /// 1957 /// By default, performs semantic analysis to build the new statement. 1958 /// Subclasses may override this routine to provide different behavior. 1959 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1960 Stmt *Body) { 1961 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1962 } 1963 1964 /// Build a new Objective-C fast enumeration statement. 1965 /// 1966 /// By default, performs semantic analysis to build the new statement. 1967 /// Subclasses may override this routine to provide different behavior. 1968 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1969 Stmt *Element, 1970 Expr *Collection, 1971 SourceLocation RParenLoc, 1972 Stmt *Body) { 1973 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1974 Element, 1975 Collection, 1976 RParenLoc); 1977 if (ForEachStmt.isInvalid()) 1978 return StmtError(); 1979 1980 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1981 } 1982 1983 /// Build a new C++ exception declaration. 1984 /// 1985 /// By default, performs semantic analysis to build the new decaration. 1986 /// Subclasses may override this routine to provide different behavior. 1987 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1988 TypeSourceInfo *Declarator, 1989 SourceLocation StartLoc, 1990 SourceLocation IdLoc, 1991 IdentifierInfo *Id) { 1992 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1993 StartLoc, IdLoc, Id); 1994 if (Var) 1995 getSema().CurContext->addDecl(Var); 1996 return Var; 1997 } 1998 1999 /// Build a new C++ catch statement. 2000 /// 2001 /// By default, performs semantic analysis to build the new statement. 2002 /// Subclasses may override this routine to provide different behavior. 2003 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2004 VarDecl *ExceptionDecl, 2005 Stmt *Handler) { 2006 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2007 Handler)); 2008 } 2009 2010 /// Build a new C++ try statement. 2011 /// 2012 /// By default, performs semantic analysis to build the new statement. 2013 /// Subclasses may override this routine to provide different behavior. 2014 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2015 ArrayRef<Stmt *> Handlers) { 2016 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2017 } 2018 2019 /// Build a new C++0x range-based for statement. 2020 /// 2021 /// By default, performs semantic analysis to build the new statement. 2022 /// Subclasses may override this routine to provide different behavior. 2023 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2024 SourceLocation CoawaitLoc, 2025 SourceLocation ColonLoc, 2026 Stmt *Range, Stmt *Begin, Stmt *End, 2027 Expr *Cond, Expr *Inc, 2028 Stmt *LoopVar, 2029 SourceLocation RParenLoc) { 2030 // If we've just learned that the range is actually an Objective-C 2031 // collection, treat this as an Objective-C fast enumeration loop. 2032 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2033 if (RangeStmt->isSingleDecl()) { 2034 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2035 if (RangeVar->isInvalidDecl()) 2036 return StmtError(); 2037 2038 Expr *RangeExpr = RangeVar->getInit(); 2039 if (!RangeExpr->isTypeDependent() && 2040 RangeExpr->getType()->isObjCObjectPointerType()) 2041 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 2042 RParenLoc); 2043 } 2044 } 2045 } 2046 2047 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc, 2048 Range, Begin, End, 2049 Cond, Inc, LoopVar, RParenLoc, 2050 Sema::BFRK_Rebuild); 2051 } 2052 2053 /// Build a new C++0x range-based for statement. 2054 /// 2055 /// By default, performs semantic analysis to build the new statement. 2056 /// Subclasses may override this routine to provide different behavior. 2057 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2058 bool IsIfExists, 2059 NestedNameSpecifierLoc QualifierLoc, 2060 DeclarationNameInfo NameInfo, 2061 Stmt *Nested) { 2062 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2063 QualifierLoc, NameInfo, Nested); 2064 } 2065 2066 /// Attach body to a C++0x range-based for statement. 2067 /// 2068 /// By default, performs semantic analysis to finish the new statement. 2069 /// Subclasses may override this routine to provide different behavior. 2070 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2071 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2072 } 2073 2074 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2075 Stmt *TryBlock, Stmt *Handler) { 2076 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2077 } 2078 2079 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2080 Stmt *Block) { 2081 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2082 } 2083 2084 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2085 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2086 } 2087 2088 /// Build a new predefined expression. 2089 /// 2090 /// By default, performs semantic analysis to build the new expression. 2091 /// Subclasses may override this routine to provide different behavior. 2092 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2093 PredefinedExpr::IdentType IT) { 2094 return getSema().BuildPredefinedExpr(Loc, IT); 2095 } 2096 2097 /// Build a new expression that references a declaration. 2098 /// 2099 /// By default, performs semantic analysis to build the new expression. 2100 /// Subclasses may override this routine to provide different behavior. 2101 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2102 LookupResult &R, 2103 bool RequiresADL) { 2104 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2105 } 2106 2107 2108 /// Build a new expression that references a declaration. 2109 /// 2110 /// By default, performs semantic analysis to build the new expression. 2111 /// Subclasses may override this routine to provide different behavior. 2112 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2113 ValueDecl *VD, 2114 const DeclarationNameInfo &NameInfo, 2115 TemplateArgumentListInfo *TemplateArgs) { 2116 CXXScopeSpec SS; 2117 SS.Adopt(QualifierLoc); 2118 2119 // FIXME: loses template args. 2120 2121 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2122 } 2123 2124 /// Build a new expression in parentheses. 2125 /// 2126 /// By default, performs semantic analysis to build the new expression. 2127 /// Subclasses may override this routine to provide different behavior. 2128 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2129 SourceLocation RParen) { 2130 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2131 } 2132 2133 /// Build a new pseudo-destructor expression. 2134 /// 2135 /// By default, performs semantic analysis to build the new expression. 2136 /// Subclasses may override this routine to provide different behavior. 2137 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2138 SourceLocation OperatorLoc, 2139 bool isArrow, 2140 CXXScopeSpec &SS, 2141 TypeSourceInfo *ScopeType, 2142 SourceLocation CCLoc, 2143 SourceLocation TildeLoc, 2144 PseudoDestructorTypeStorage Destroyed); 2145 2146 /// Build a new unary operator expression. 2147 /// 2148 /// By default, performs semantic analysis to build the new expression. 2149 /// Subclasses may override this routine to provide different behavior. 2150 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2151 UnaryOperatorKind Opc, 2152 Expr *SubExpr) { 2153 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2154 } 2155 2156 /// Build a new builtin offsetof expression. 2157 /// 2158 /// By default, performs semantic analysis to build the new expression. 2159 /// Subclasses may override this routine to provide different behavior. 2160 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2161 TypeSourceInfo *Type, 2162 ArrayRef<Sema::OffsetOfComponent> Components, 2163 SourceLocation RParenLoc) { 2164 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2165 RParenLoc); 2166 } 2167 2168 /// Build a new sizeof, alignof or vec_step expression with a 2169 /// type argument. 2170 /// 2171 /// By default, performs semantic analysis to build the new expression. 2172 /// Subclasses may override this routine to provide different behavior. 2173 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2174 SourceLocation OpLoc, 2175 UnaryExprOrTypeTrait ExprKind, 2176 SourceRange R) { 2177 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2178 } 2179 2180 /// Build a new sizeof, alignof or vec step expression with an 2181 /// expression argument. 2182 /// 2183 /// By default, performs semantic analysis to build the new expression. 2184 /// Subclasses may override this routine to provide different behavior. 2185 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2186 UnaryExprOrTypeTrait ExprKind, 2187 SourceRange R) { 2188 ExprResult Result 2189 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2190 if (Result.isInvalid()) 2191 return ExprError(); 2192 2193 return Result; 2194 } 2195 2196 /// Build a new array subscript expression. 2197 /// 2198 /// By default, performs semantic analysis to build the new expression. 2199 /// Subclasses may override this routine to provide different behavior. 2200 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2201 SourceLocation LBracketLoc, 2202 Expr *RHS, 2203 SourceLocation RBracketLoc) { 2204 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2205 LBracketLoc, RHS, 2206 RBracketLoc); 2207 } 2208 2209 /// Build a new array section expression. 2210 /// 2211 /// By default, performs semantic analysis to build the new expression. 2212 /// Subclasses may override this routine to provide different behavior. 2213 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2214 Expr *LowerBound, 2215 SourceLocation ColonLoc, Expr *Length, 2216 SourceLocation RBracketLoc) { 2217 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2218 ColonLoc, Length, RBracketLoc); 2219 } 2220 2221 /// Build a new call expression. 2222 /// 2223 /// By default, performs semantic analysis to build the new expression. 2224 /// Subclasses may override this routine to provide different behavior. 2225 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2226 MultiExprArg Args, 2227 SourceLocation RParenLoc, 2228 Expr *ExecConfig = nullptr) { 2229 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2230 Args, RParenLoc, ExecConfig); 2231 } 2232 2233 /// Build a new member access expression. 2234 /// 2235 /// By default, performs semantic analysis to build the new expression. 2236 /// Subclasses may override this routine to provide different behavior. 2237 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2238 bool isArrow, 2239 NestedNameSpecifierLoc QualifierLoc, 2240 SourceLocation TemplateKWLoc, 2241 const DeclarationNameInfo &MemberNameInfo, 2242 ValueDecl *Member, 2243 NamedDecl *FoundDecl, 2244 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2245 NamedDecl *FirstQualifierInScope) { 2246 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2247 isArrow); 2248 if (!Member->getDeclName()) { 2249 // We have a reference to an unnamed field. This is always the 2250 // base of an anonymous struct/union member access, i.e. the 2251 // field is always of record type. 2252 assert(Member->getType()->isRecordType() && 2253 "unnamed member not of record type?"); 2254 2255 BaseResult = 2256 getSema().PerformObjectMemberConversion(BaseResult.get(), 2257 QualifierLoc.getNestedNameSpecifier(), 2258 FoundDecl, Member); 2259 if (BaseResult.isInvalid()) 2260 return ExprError(); 2261 Base = BaseResult.get(); 2262 2263 CXXScopeSpec EmptySS; 2264 return getSema().BuildFieldReferenceExpr( 2265 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2266 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2267 } 2268 2269 CXXScopeSpec SS; 2270 SS.Adopt(QualifierLoc); 2271 2272 Base = BaseResult.get(); 2273 QualType BaseType = Base->getType(); 2274 2275 if (isArrow && !BaseType->isPointerType()) 2276 return ExprError(); 2277 2278 // FIXME: this involves duplicating earlier analysis in a lot of 2279 // cases; we should avoid this when possible. 2280 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2281 R.addDecl(FoundDecl); 2282 R.resolveKind(); 2283 2284 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2285 SS, TemplateKWLoc, 2286 FirstQualifierInScope, 2287 R, ExplicitTemplateArgs, 2288 /*S*/nullptr); 2289 } 2290 2291 /// Build a new binary operator expression. 2292 /// 2293 /// By default, performs semantic analysis to build the new expression. 2294 /// Subclasses may override this routine to provide different behavior. 2295 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2296 BinaryOperatorKind Opc, 2297 Expr *LHS, Expr *RHS) { 2298 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2299 } 2300 2301 /// Build a new conditional operator expression. 2302 /// 2303 /// By default, performs semantic analysis to build the new expression. 2304 /// Subclasses may override this routine to provide different behavior. 2305 ExprResult RebuildConditionalOperator(Expr *Cond, 2306 SourceLocation QuestionLoc, 2307 Expr *LHS, 2308 SourceLocation ColonLoc, 2309 Expr *RHS) { 2310 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2311 LHS, RHS); 2312 } 2313 2314 /// Build a new C-style cast expression. 2315 /// 2316 /// By default, performs semantic analysis to build the new expression. 2317 /// Subclasses may override this routine to provide different behavior. 2318 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2319 TypeSourceInfo *TInfo, 2320 SourceLocation RParenLoc, 2321 Expr *SubExpr) { 2322 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2323 SubExpr); 2324 } 2325 2326 /// Build a new compound literal expression. 2327 /// 2328 /// By default, performs semantic analysis to build the new expression. 2329 /// Subclasses may override this routine to provide different behavior. 2330 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2331 TypeSourceInfo *TInfo, 2332 SourceLocation RParenLoc, 2333 Expr *Init) { 2334 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2335 Init); 2336 } 2337 2338 /// Build a new extended vector element access expression. 2339 /// 2340 /// By default, performs semantic analysis to build the new expression. 2341 /// Subclasses may override this routine to provide different behavior. 2342 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2343 SourceLocation OpLoc, 2344 SourceLocation AccessorLoc, 2345 IdentifierInfo &Accessor) { 2346 2347 CXXScopeSpec SS; 2348 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2349 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2350 OpLoc, /*IsArrow*/ false, 2351 SS, SourceLocation(), 2352 /*FirstQualifierInScope*/ nullptr, 2353 NameInfo, 2354 /* TemplateArgs */ nullptr, 2355 /*S*/ nullptr); 2356 } 2357 2358 /// Build a new initializer list expression. 2359 /// 2360 /// By default, performs semantic analysis to build the new expression. 2361 /// Subclasses may override this routine to provide different behavior. 2362 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2363 MultiExprArg Inits, 2364 SourceLocation RBraceLoc) { 2365 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2366 } 2367 2368 /// Build a new designated initializer expression. 2369 /// 2370 /// By default, performs semantic analysis to build the new expression. 2371 /// Subclasses may override this routine to provide different behavior. 2372 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2373 MultiExprArg ArrayExprs, 2374 SourceLocation EqualOrColonLoc, 2375 bool GNUSyntax, 2376 Expr *Init) { 2377 ExprResult Result 2378 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2379 Init); 2380 if (Result.isInvalid()) 2381 return ExprError(); 2382 2383 return Result; 2384 } 2385 2386 /// Build a new value-initialized expression. 2387 /// 2388 /// By default, builds the implicit value initialization without performing 2389 /// any semantic analysis. Subclasses may override this routine to provide 2390 /// different behavior. 2391 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2392 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2393 } 2394 2395 /// Build a new \c va_arg expression. 2396 /// 2397 /// By default, performs semantic analysis to build the new expression. 2398 /// Subclasses may override this routine to provide different behavior. 2399 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2400 Expr *SubExpr, TypeSourceInfo *TInfo, 2401 SourceLocation RParenLoc) { 2402 return getSema().BuildVAArgExpr(BuiltinLoc, 2403 SubExpr, TInfo, 2404 RParenLoc); 2405 } 2406 2407 /// Build a new expression list in parentheses. 2408 /// 2409 /// By default, performs semantic analysis to build the new expression. 2410 /// Subclasses may override this routine to provide different behavior. 2411 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2412 MultiExprArg SubExprs, 2413 SourceLocation RParenLoc) { 2414 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2415 } 2416 2417 /// Build a new address-of-label expression. 2418 /// 2419 /// By default, performs semantic analysis, using the name of the label 2420 /// rather than attempting to map the label statement itself. 2421 /// Subclasses may override this routine to provide different behavior. 2422 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2423 SourceLocation LabelLoc, LabelDecl *Label) { 2424 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2425 } 2426 2427 /// Build a new GNU statement expression. 2428 /// 2429 /// By default, performs semantic analysis to build the new expression. 2430 /// Subclasses may override this routine to provide different behavior. 2431 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2432 Stmt *SubStmt, 2433 SourceLocation RParenLoc) { 2434 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2435 } 2436 2437 /// Build a new __builtin_choose_expr expression. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2442 Expr *Cond, Expr *LHS, Expr *RHS, 2443 SourceLocation RParenLoc) { 2444 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2445 Cond, LHS, RHS, 2446 RParenLoc); 2447 } 2448 2449 /// Build a new generic selection expression. 2450 /// 2451 /// By default, performs semantic analysis to build the new expression. 2452 /// Subclasses may override this routine to provide different behavior. 2453 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2454 SourceLocation DefaultLoc, 2455 SourceLocation RParenLoc, 2456 Expr *ControllingExpr, 2457 ArrayRef<TypeSourceInfo *> Types, 2458 ArrayRef<Expr *> Exprs) { 2459 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2460 ControllingExpr, Types, Exprs); 2461 } 2462 2463 /// Build a new overloaded operator call expression. 2464 /// 2465 /// By default, performs semantic analysis to build the new expression. 2466 /// The semantic analysis provides the behavior of template instantiation, 2467 /// copying with transformations that turn what looks like an overloaded 2468 /// operator call into a use of a builtin operator, performing 2469 /// argument-dependent lookup, etc. Subclasses may override this routine to 2470 /// provide different behavior. 2471 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2472 SourceLocation OpLoc, 2473 Expr *Callee, 2474 Expr *First, 2475 Expr *Second); 2476 2477 /// Build a new C++ "named" cast expression, such as static_cast or 2478 /// reinterpret_cast. 2479 /// 2480 /// By default, this routine dispatches to one of the more-specific routines 2481 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2482 /// Subclasses may override this routine to provide different behavior. 2483 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2484 Stmt::StmtClass Class, 2485 SourceLocation LAngleLoc, 2486 TypeSourceInfo *TInfo, 2487 SourceLocation RAngleLoc, 2488 SourceLocation LParenLoc, 2489 Expr *SubExpr, 2490 SourceLocation RParenLoc) { 2491 switch (Class) { 2492 case Stmt::CXXStaticCastExprClass: 2493 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2494 RAngleLoc, LParenLoc, 2495 SubExpr, RParenLoc); 2496 2497 case Stmt::CXXDynamicCastExprClass: 2498 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2499 RAngleLoc, LParenLoc, 2500 SubExpr, RParenLoc); 2501 2502 case Stmt::CXXReinterpretCastExprClass: 2503 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2504 RAngleLoc, LParenLoc, 2505 SubExpr, 2506 RParenLoc); 2507 2508 case Stmt::CXXConstCastExprClass: 2509 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2510 RAngleLoc, LParenLoc, 2511 SubExpr, RParenLoc); 2512 2513 default: 2514 llvm_unreachable("Invalid C++ named cast"); 2515 } 2516 } 2517 2518 /// Build a new C++ static_cast expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2523 SourceLocation LAngleLoc, 2524 TypeSourceInfo *TInfo, 2525 SourceLocation RAngleLoc, 2526 SourceLocation LParenLoc, 2527 Expr *SubExpr, 2528 SourceLocation RParenLoc) { 2529 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2530 TInfo, SubExpr, 2531 SourceRange(LAngleLoc, RAngleLoc), 2532 SourceRange(LParenLoc, RParenLoc)); 2533 } 2534 2535 /// Build a new C++ dynamic_cast expression. 2536 /// 2537 /// By default, performs semantic analysis to build the new expression. 2538 /// Subclasses may override this routine to provide different behavior. 2539 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2540 SourceLocation LAngleLoc, 2541 TypeSourceInfo *TInfo, 2542 SourceLocation RAngleLoc, 2543 SourceLocation LParenLoc, 2544 Expr *SubExpr, 2545 SourceLocation RParenLoc) { 2546 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2547 TInfo, SubExpr, 2548 SourceRange(LAngleLoc, RAngleLoc), 2549 SourceRange(LParenLoc, RParenLoc)); 2550 } 2551 2552 /// Build a new C++ reinterpret_cast 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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2557 SourceLocation LAngleLoc, 2558 TypeSourceInfo *TInfo, 2559 SourceLocation RAngleLoc, 2560 SourceLocation LParenLoc, 2561 Expr *SubExpr, 2562 SourceLocation RParenLoc) { 2563 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2564 TInfo, SubExpr, 2565 SourceRange(LAngleLoc, RAngleLoc), 2566 SourceRange(LParenLoc, RParenLoc)); 2567 } 2568 2569 /// Build a new C++ const_cast expression. 2570 /// 2571 /// By default, performs semantic analysis to build the new expression. 2572 /// Subclasses may override this routine to provide different behavior. 2573 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2574 SourceLocation LAngleLoc, 2575 TypeSourceInfo *TInfo, 2576 SourceLocation RAngleLoc, 2577 SourceLocation LParenLoc, 2578 Expr *SubExpr, 2579 SourceLocation RParenLoc) { 2580 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2581 TInfo, SubExpr, 2582 SourceRange(LAngleLoc, RAngleLoc), 2583 SourceRange(LParenLoc, RParenLoc)); 2584 } 2585 2586 /// Build a new C++ functional-style cast expression. 2587 /// 2588 /// By default, performs semantic analysis to build the new expression. 2589 /// Subclasses may override this routine to provide different behavior. 2590 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2591 SourceLocation LParenLoc, 2592 Expr *Sub, 2593 SourceLocation RParenLoc, 2594 bool ListInitialization) { 2595 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2596 MultiExprArg(&Sub, 1), RParenLoc, 2597 ListInitialization); 2598 } 2599 2600 /// Build a new C++ typeid(type) expression. 2601 /// 2602 /// By default, performs semantic analysis to build the new expression. 2603 /// Subclasses may override this routine to provide different behavior. 2604 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2605 SourceLocation TypeidLoc, 2606 TypeSourceInfo *Operand, 2607 SourceLocation RParenLoc) { 2608 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2609 RParenLoc); 2610 } 2611 2612 2613 /// Build a new C++ typeid(expr) expression. 2614 /// 2615 /// By default, performs semantic analysis to build the new expression. 2616 /// Subclasses may override this routine to provide different behavior. 2617 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2618 SourceLocation TypeidLoc, 2619 Expr *Operand, 2620 SourceLocation RParenLoc) { 2621 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2622 RParenLoc); 2623 } 2624 2625 /// Build a new C++ __uuidof(type) expression. 2626 /// 2627 /// By default, performs semantic analysis to build the new expression. 2628 /// Subclasses may override this routine to provide different behavior. 2629 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2630 SourceLocation TypeidLoc, 2631 TypeSourceInfo *Operand, 2632 SourceLocation RParenLoc) { 2633 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2634 RParenLoc); 2635 } 2636 2637 /// Build a new C++ __uuidof(expr) expression. 2638 /// 2639 /// By default, performs semantic analysis to build the new expression. 2640 /// Subclasses may override this routine to provide different behavior. 2641 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2642 SourceLocation TypeidLoc, 2643 Expr *Operand, 2644 SourceLocation RParenLoc) { 2645 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2646 RParenLoc); 2647 } 2648 2649 /// Build a new C++ "this" expression. 2650 /// 2651 /// By default, builds a new "this" expression without performing any 2652 /// semantic analysis. Subclasses may override this routine to provide 2653 /// different behavior. 2654 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2655 QualType ThisType, 2656 bool isImplicit) { 2657 getSema().CheckCXXThisCapture(ThisLoc); 2658 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2659 } 2660 2661 /// Build a new C++ throw expression. 2662 /// 2663 /// By default, performs semantic analysis to build the new expression. 2664 /// Subclasses may override this routine to provide different behavior. 2665 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2666 bool IsThrownVariableInScope) { 2667 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2668 } 2669 2670 /// Build a new C++ default-argument expression. 2671 /// 2672 /// By default, builds a new default-argument expression, which does not 2673 /// require any semantic analysis. Subclasses may override this routine to 2674 /// provide different behavior. 2675 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2676 ParmVarDecl *Param) { 2677 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2678 } 2679 2680 /// Build a new C++11 default-initialization expression. 2681 /// 2682 /// By default, builds a new default field initialization expression, which 2683 /// does not require any semantic analysis. Subclasses may override this 2684 /// routine to provide different behavior. 2685 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2686 FieldDecl *Field) { 2687 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2688 } 2689 2690 /// Build a new C++ zero-initialization expression. 2691 /// 2692 /// By default, performs semantic analysis to build the new expression. 2693 /// Subclasses may override this routine to provide different behavior. 2694 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2695 SourceLocation LParenLoc, 2696 SourceLocation RParenLoc) { 2697 return getSema().BuildCXXTypeConstructExpr( 2698 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2699 } 2700 2701 /// Build a new C++ "new" expression. 2702 /// 2703 /// By default, performs semantic analysis to build the new expression. 2704 /// Subclasses may override this routine to provide different behavior. 2705 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2706 bool UseGlobal, 2707 SourceLocation PlacementLParen, 2708 MultiExprArg PlacementArgs, 2709 SourceLocation PlacementRParen, 2710 SourceRange TypeIdParens, 2711 QualType AllocatedType, 2712 TypeSourceInfo *AllocatedTypeInfo, 2713 Expr *ArraySize, 2714 SourceRange DirectInitRange, 2715 Expr *Initializer) { 2716 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2717 PlacementLParen, 2718 PlacementArgs, 2719 PlacementRParen, 2720 TypeIdParens, 2721 AllocatedType, 2722 AllocatedTypeInfo, 2723 ArraySize, 2724 DirectInitRange, 2725 Initializer); 2726 } 2727 2728 /// Build a new C++ "delete" expression. 2729 /// 2730 /// By default, performs semantic analysis to build the new expression. 2731 /// Subclasses may override this routine to provide different behavior. 2732 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2733 bool IsGlobalDelete, 2734 bool IsArrayForm, 2735 Expr *Operand) { 2736 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2737 Operand); 2738 } 2739 2740 /// Build a new type trait expression. 2741 /// 2742 /// By default, performs semantic analysis to build the new expression. 2743 /// Subclasses may override this routine to provide different behavior. 2744 ExprResult RebuildTypeTrait(TypeTrait Trait, 2745 SourceLocation StartLoc, 2746 ArrayRef<TypeSourceInfo *> Args, 2747 SourceLocation RParenLoc) { 2748 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2749 } 2750 2751 /// Build a new array type trait expression. 2752 /// 2753 /// By default, performs semantic analysis to build the new expression. 2754 /// Subclasses may override this routine to provide different behavior. 2755 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2756 SourceLocation StartLoc, 2757 TypeSourceInfo *TSInfo, 2758 Expr *DimExpr, 2759 SourceLocation RParenLoc) { 2760 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2761 } 2762 2763 /// Build a new expression trait expression. 2764 /// 2765 /// By default, performs semantic analysis to build the new expression. 2766 /// Subclasses may override this routine to provide different behavior. 2767 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2768 SourceLocation StartLoc, 2769 Expr *Queried, 2770 SourceLocation RParenLoc) { 2771 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2772 } 2773 2774 /// Build a new (previously unresolved) declaration reference 2775 /// expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildDependentScopeDeclRefExpr( 2780 NestedNameSpecifierLoc QualifierLoc, 2781 SourceLocation TemplateKWLoc, 2782 const DeclarationNameInfo &NameInfo, 2783 const TemplateArgumentListInfo *TemplateArgs, 2784 bool IsAddressOfOperand, 2785 TypeSourceInfo **RecoveryTSI) { 2786 CXXScopeSpec SS; 2787 SS.Adopt(QualifierLoc); 2788 2789 if (TemplateArgs || TemplateKWLoc.isValid()) 2790 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2791 TemplateArgs); 2792 2793 return getSema().BuildQualifiedDeclarationNameExpr( 2794 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2795 } 2796 2797 /// Build a new template-id expression. 2798 /// 2799 /// By default, performs semantic analysis to build the new expression. 2800 /// Subclasses may override this routine to provide different behavior. 2801 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2802 SourceLocation TemplateKWLoc, 2803 LookupResult &R, 2804 bool RequiresADL, 2805 const TemplateArgumentListInfo *TemplateArgs) { 2806 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2807 TemplateArgs); 2808 } 2809 2810 /// Build a new object-construction expression. 2811 /// 2812 /// By default, performs semantic analysis to build the new expression. 2813 /// Subclasses may override this routine to provide different behavior. 2814 ExprResult RebuildCXXConstructExpr(QualType T, 2815 SourceLocation Loc, 2816 CXXConstructorDecl *Constructor, 2817 bool IsElidable, 2818 MultiExprArg Args, 2819 bool HadMultipleCandidates, 2820 bool ListInitialization, 2821 bool StdInitListInitialization, 2822 bool RequiresZeroInit, 2823 CXXConstructExpr::ConstructionKind ConstructKind, 2824 SourceRange ParenRange) { 2825 SmallVector<Expr*, 8> ConvertedArgs; 2826 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2827 ConvertedArgs)) 2828 return ExprError(); 2829 2830 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2831 IsElidable, 2832 ConvertedArgs, 2833 HadMultipleCandidates, 2834 ListInitialization, 2835 StdInitListInitialization, 2836 RequiresZeroInit, ConstructKind, 2837 ParenRange); 2838 } 2839 2840 /// Build a new implicit construction via inherited constructor 2841 /// expression. 2842 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2843 CXXConstructorDecl *Constructor, 2844 bool ConstructsVBase, 2845 bool InheritedFromVBase) { 2846 return new (getSema().Context) CXXInheritedCtorInitExpr( 2847 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2848 } 2849 2850 /// Build a new object-construction expression. 2851 /// 2852 /// By default, performs semantic analysis to build the new expression. 2853 /// Subclasses may override this routine to provide different behavior. 2854 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2855 SourceLocation LParenOrBraceLoc, 2856 MultiExprArg Args, 2857 SourceLocation RParenOrBraceLoc, 2858 bool ListInitialization) { 2859 return getSema().BuildCXXTypeConstructExpr( 2860 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2861 } 2862 2863 /// Build a new object-construction expression. 2864 /// 2865 /// By default, performs semantic analysis to build the new expression. 2866 /// Subclasses may override this routine to provide different behavior. 2867 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2868 SourceLocation LParenLoc, 2869 MultiExprArg Args, 2870 SourceLocation RParenLoc, 2871 bool ListInitialization) { 2872 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2873 RParenLoc, ListInitialization); 2874 } 2875 2876 /// Build a new member reference expression. 2877 /// 2878 /// By default, performs semantic analysis to build the new expression. 2879 /// Subclasses may override this routine to provide different behavior. 2880 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2881 QualType BaseType, 2882 bool IsArrow, 2883 SourceLocation OperatorLoc, 2884 NestedNameSpecifierLoc QualifierLoc, 2885 SourceLocation TemplateKWLoc, 2886 NamedDecl *FirstQualifierInScope, 2887 const DeclarationNameInfo &MemberNameInfo, 2888 const TemplateArgumentListInfo *TemplateArgs) { 2889 CXXScopeSpec SS; 2890 SS.Adopt(QualifierLoc); 2891 2892 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2893 OperatorLoc, IsArrow, 2894 SS, TemplateKWLoc, 2895 FirstQualifierInScope, 2896 MemberNameInfo, 2897 TemplateArgs, /*S*/nullptr); 2898 } 2899 2900 /// Build a new member reference expression. 2901 /// 2902 /// By default, performs semantic analysis to build the new expression. 2903 /// Subclasses may override this routine to provide different behavior. 2904 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2905 SourceLocation OperatorLoc, 2906 bool IsArrow, 2907 NestedNameSpecifierLoc QualifierLoc, 2908 SourceLocation TemplateKWLoc, 2909 NamedDecl *FirstQualifierInScope, 2910 LookupResult &R, 2911 const TemplateArgumentListInfo *TemplateArgs) { 2912 CXXScopeSpec SS; 2913 SS.Adopt(QualifierLoc); 2914 2915 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2916 OperatorLoc, IsArrow, 2917 SS, TemplateKWLoc, 2918 FirstQualifierInScope, 2919 R, TemplateArgs, /*S*/nullptr); 2920 } 2921 2922 /// Build a new noexcept expression. 2923 /// 2924 /// By default, performs semantic analysis to build the new expression. 2925 /// Subclasses may override this routine to provide different behavior. 2926 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2927 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2928 } 2929 2930 /// Build a new expression to compute the length of a parameter pack. 2931 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2932 NamedDecl *Pack, 2933 SourceLocation PackLoc, 2934 SourceLocation RParenLoc, 2935 Optional<unsigned> Length, 2936 ArrayRef<TemplateArgument> PartialArgs) { 2937 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2938 RParenLoc, Length, PartialArgs); 2939 } 2940 2941 /// Build a new Objective-C boxed expression. 2942 /// 2943 /// By default, performs semantic analysis to build the new expression. 2944 /// Subclasses may override this routine to provide different behavior. 2945 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2946 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2947 } 2948 2949 /// Build a new Objective-C array literal. 2950 /// 2951 /// By default, performs semantic analysis to build the new expression. 2952 /// Subclasses may override this routine to provide different behavior. 2953 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2954 Expr **Elements, unsigned NumElements) { 2955 return getSema().BuildObjCArrayLiteral(Range, 2956 MultiExprArg(Elements, NumElements)); 2957 } 2958 2959 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2960 Expr *Base, Expr *Key, 2961 ObjCMethodDecl *getterMethod, 2962 ObjCMethodDecl *setterMethod) { 2963 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2964 getterMethod, setterMethod); 2965 } 2966 2967 /// Build a new Objective-C dictionary literal. 2968 /// 2969 /// By default, performs semantic analysis to build the new expression. 2970 /// Subclasses may override this routine to provide different behavior. 2971 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2972 MutableArrayRef<ObjCDictionaryElement> Elements) { 2973 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2974 } 2975 2976 /// Build a new Objective-C \@encode expression. 2977 /// 2978 /// By default, performs semantic analysis to build the new expression. 2979 /// Subclasses may override this routine to provide different behavior. 2980 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2981 TypeSourceInfo *EncodeTypeInfo, 2982 SourceLocation RParenLoc) { 2983 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2984 } 2985 2986 /// Build a new Objective-C class message. 2987 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2988 Selector Sel, 2989 ArrayRef<SourceLocation> SelectorLocs, 2990 ObjCMethodDecl *Method, 2991 SourceLocation LBracLoc, 2992 MultiExprArg Args, 2993 SourceLocation RBracLoc) { 2994 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2995 ReceiverTypeInfo->getType(), 2996 /*SuperLoc=*/SourceLocation(), 2997 Sel, Method, LBracLoc, SelectorLocs, 2998 RBracLoc, Args); 2999 } 3000 3001 /// Build a new Objective-C instance message. 3002 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3003 Selector Sel, 3004 ArrayRef<SourceLocation> SelectorLocs, 3005 ObjCMethodDecl *Method, 3006 SourceLocation LBracLoc, 3007 MultiExprArg Args, 3008 SourceLocation RBracLoc) { 3009 return SemaRef.BuildInstanceMessage(Receiver, 3010 Receiver->getType(), 3011 /*SuperLoc=*/SourceLocation(), 3012 Sel, Method, LBracLoc, SelectorLocs, 3013 RBracLoc, Args); 3014 } 3015 3016 /// Build a new Objective-C instance/class message to 'super'. 3017 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3018 Selector Sel, 3019 ArrayRef<SourceLocation> SelectorLocs, 3020 QualType SuperType, 3021 ObjCMethodDecl *Method, 3022 SourceLocation LBracLoc, 3023 MultiExprArg Args, 3024 SourceLocation RBracLoc) { 3025 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3026 SuperType, 3027 SuperLoc, 3028 Sel, Method, LBracLoc, SelectorLocs, 3029 RBracLoc, Args) 3030 : SemaRef.BuildClassMessage(nullptr, 3031 SuperType, 3032 SuperLoc, 3033 Sel, Method, LBracLoc, SelectorLocs, 3034 RBracLoc, Args); 3035 3036 3037 } 3038 3039 /// Build a new Objective-C ivar reference expression. 3040 /// 3041 /// By default, performs semantic analysis to build the new expression. 3042 /// Subclasses may override this routine to provide different behavior. 3043 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3044 SourceLocation IvarLoc, 3045 bool IsArrow, bool IsFreeIvar) { 3046 CXXScopeSpec SS; 3047 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3048 ExprResult Result = getSema().BuildMemberReferenceExpr( 3049 BaseArg, BaseArg->getType(), 3050 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3051 /*FirstQualifierInScope=*/nullptr, NameInfo, 3052 /*TemplateArgs=*/nullptr, 3053 /*S=*/nullptr); 3054 if (IsFreeIvar && Result.isUsable()) 3055 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3056 return Result; 3057 } 3058 3059 /// Build a new Objective-C property reference expression. 3060 /// 3061 /// By default, performs semantic analysis to build the new expression. 3062 /// Subclasses may override this routine to provide different behavior. 3063 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3064 ObjCPropertyDecl *Property, 3065 SourceLocation PropertyLoc) { 3066 CXXScopeSpec SS; 3067 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3068 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3069 /*FIXME:*/PropertyLoc, 3070 /*IsArrow=*/false, 3071 SS, SourceLocation(), 3072 /*FirstQualifierInScope=*/nullptr, 3073 NameInfo, 3074 /*TemplateArgs=*/nullptr, 3075 /*S=*/nullptr); 3076 } 3077 3078 /// Build a new Objective-C property reference expression. 3079 /// 3080 /// By default, performs semantic analysis to build the new expression. 3081 /// Subclasses may override this routine to provide different behavior. 3082 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3083 ObjCMethodDecl *Getter, 3084 ObjCMethodDecl *Setter, 3085 SourceLocation PropertyLoc) { 3086 // Since these expressions can only be value-dependent, we do not 3087 // need to perform semantic analysis again. 3088 return Owned( 3089 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3090 VK_LValue, OK_ObjCProperty, 3091 PropertyLoc, Base)); 3092 } 3093 3094 /// Build a new Objective-C "isa" expression. 3095 /// 3096 /// By default, performs semantic analysis to build the new expression. 3097 /// Subclasses may override this routine to provide different behavior. 3098 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3099 SourceLocation OpLoc, bool IsArrow) { 3100 CXXScopeSpec SS; 3101 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3102 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3103 OpLoc, IsArrow, 3104 SS, SourceLocation(), 3105 /*FirstQualifierInScope=*/nullptr, 3106 NameInfo, 3107 /*TemplateArgs=*/nullptr, 3108 /*S=*/nullptr); 3109 } 3110 3111 /// Build a new shuffle vector expression. 3112 /// 3113 /// By default, performs semantic analysis to build the new expression. 3114 /// Subclasses may override this routine to provide different behavior. 3115 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3116 MultiExprArg SubExprs, 3117 SourceLocation RParenLoc) { 3118 // Find the declaration for __builtin_shufflevector 3119 const IdentifierInfo &Name 3120 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3121 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3122 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3123 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3124 3125 // Build a reference to the __builtin_shufflevector builtin 3126 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3127 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3128 SemaRef.Context.BuiltinFnTy, 3129 VK_RValue, BuiltinLoc); 3130 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3131 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3132 CK_BuiltinFnToFnPtr).get(); 3133 3134 // Build the CallExpr 3135 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3136 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3137 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3138 3139 // Type-check the __builtin_shufflevector expression. 3140 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3141 } 3142 3143 /// Build a new convert vector expression. 3144 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3145 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3146 SourceLocation RParenLoc) { 3147 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3148 BuiltinLoc, RParenLoc); 3149 } 3150 3151 /// Build a new template argument pack expansion. 3152 /// 3153 /// By default, performs semantic analysis to build a new pack expansion 3154 /// for a template argument. Subclasses may override this routine to provide 3155 /// different behavior. 3156 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3157 SourceLocation EllipsisLoc, 3158 Optional<unsigned> NumExpansions) { 3159 switch (Pattern.getArgument().getKind()) { 3160 case TemplateArgument::Expression: { 3161 ExprResult Result 3162 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3163 EllipsisLoc, NumExpansions); 3164 if (Result.isInvalid()) 3165 return TemplateArgumentLoc(); 3166 3167 return TemplateArgumentLoc(Result.get(), Result.get()); 3168 } 3169 3170 case TemplateArgument::Template: 3171 return TemplateArgumentLoc(TemplateArgument( 3172 Pattern.getArgument().getAsTemplate(), 3173 NumExpansions), 3174 Pattern.getTemplateQualifierLoc(), 3175 Pattern.getTemplateNameLoc(), 3176 EllipsisLoc); 3177 3178 case TemplateArgument::Null: 3179 case TemplateArgument::Integral: 3180 case TemplateArgument::Declaration: 3181 case TemplateArgument::Pack: 3182 case TemplateArgument::TemplateExpansion: 3183 case TemplateArgument::NullPtr: 3184 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3185 3186 case TemplateArgument::Type: 3187 if (TypeSourceInfo *Expansion 3188 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3189 EllipsisLoc, 3190 NumExpansions)) 3191 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3192 Expansion); 3193 break; 3194 } 3195 3196 return TemplateArgumentLoc(); 3197 } 3198 3199 /// Build a new expression pack expansion. 3200 /// 3201 /// By default, performs semantic analysis to build a new pack expansion 3202 /// for an expression. Subclasses may override this routine to provide 3203 /// different behavior. 3204 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3205 Optional<unsigned> NumExpansions) { 3206 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3207 } 3208 3209 /// Build a new C++1z fold-expression. 3210 /// 3211 /// By default, performs semantic analysis in order to build a new fold 3212 /// expression. 3213 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3214 BinaryOperatorKind Operator, 3215 SourceLocation EllipsisLoc, Expr *RHS, 3216 SourceLocation RParenLoc) { 3217 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3218 RHS, RParenLoc); 3219 } 3220 3221 /// Build an empty C++1z fold-expression with the given operator. 3222 /// 3223 /// By default, produces the fallback value for the fold-expression, or 3224 /// produce an error if there is no fallback value. 3225 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3226 BinaryOperatorKind Operator) { 3227 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3228 } 3229 3230 /// Build a new atomic operation expression. 3231 /// 3232 /// By default, performs semantic analysis to build the new expression. 3233 /// Subclasses may override this routine to provide different behavior. 3234 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3235 MultiExprArg SubExprs, 3236 QualType RetTy, 3237 AtomicExpr::AtomicOp Op, 3238 SourceLocation RParenLoc) { 3239 // Just create the expression; there is not any interesting semantic 3240 // analysis here because we can't actually build an AtomicExpr until 3241 // we are sure it is semantically sound. 3242 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3243 RParenLoc); 3244 } 3245 3246 private: 3247 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3248 QualType ObjectType, 3249 NamedDecl *FirstQualifierInScope, 3250 CXXScopeSpec &SS); 3251 3252 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3253 QualType ObjectType, 3254 NamedDecl *FirstQualifierInScope, 3255 CXXScopeSpec &SS); 3256 3257 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3258 NamedDecl *FirstQualifierInScope, 3259 CXXScopeSpec &SS); 3260 3261 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3262 DependentNameTypeLoc TL, 3263 bool DeducibleTSTContext); 3264 }; 3265 3266 template<typename Derived> 3267 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3268 if (!S) 3269 return S; 3270 3271 switch (S->getStmtClass()) { 3272 case Stmt::NoStmtClass: break; 3273 3274 // Transform individual statement nodes 3275 #define STMT(Node, Parent) \ 3276 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3277 #define ABSTRACT_STMT(Node) 3278 #define EXPR(Node, Parent) 3279 #include "clang/AST/StmtNodes.inc" 3280 3281 // Transform expressions by calling TransformExpr. 3282 #define STMT(Node, Parent) 3283 #define ABSTRACT_STMT(Stmt) 3284 #define EXPR(Node, Parent) case Stmt::Node##Class: 3285 #include "clang/AST/StmtNodes.inc" 3286 { 3287 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3288 if (E.isInvalid()) 3289 return StmtError(); 3290 3291 return getSema().ActOnExprStmt(E); 3292 } 3293 } 3294 3295 return S; 3296 } 3297 3298 template<typename Derived> 3299 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3300 if (!S) 3301 return S; 3302 3303 switch (S->getClauseKind()) { 3304 default: break; 3305 // Transform individual clause nodes 3306 #define OPENMP_CLAUSE(Name, Class) \ 3307 case OMPC_ ## Name : \ 3308 return getDerived().Transform ## Class(cast<Class>(S)); 3309 #include "clang/Basic/OpenMPKinds.def" 3310 } 3311 3312 return S; 3313 } 3314 3315 3316 template<typename Derived> 3317 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3318 if (!E) 3319 return E; 3320 3321 switch (E->getStmtClass()) { 3322 case Stmt::NoStmtClass: break; 3323 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3324 #define ABSTRACT_STMT(Stmt) 3325 #define EXPR(Node, Parent) \ 3326 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3327 #include "clang/AST/StmtNodes.inc" 3328 } 3329 3330 return E; 3331 } 3332 3333 template<typename Derived> 3334 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3335 bool NotCopyInit) { 3336 // Initializers are instantiated like expressions, except that various outer 3337 // layers are stripped. 3338 if (!Init) 3339 return Init; 3340 3341 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3342 Init = ExprTemp->getSubExpr(); 3343 3344 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3345 Init = AIL->getCommonExpr(); 3346 3347 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3348 Init = MTE->GetTemporaryExpr(); 3349 3350 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3351 Init = Binder->getSubExpr(); 3352 3353 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3354 Init = ICE->getSubExprAsWritten(); 3355 3356 if (CXXStdInitializerListExpr *ILE = 3357 dyn_cast<CXXStdInitializerListExpr>(Init)) 3358 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3359 3360 // If this is copy-initialization, we only need to reconstruct 3361 // InitListExprs. Other forms of copy-initialization will be a no-op if 3362 // the initializer is already the right type. 3363 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3364 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3365 return getDerived().TransformExpr(Init); 3366 3367 // Revert value-initialization back to empty parens. 3368 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3369 SourceRange Parens = VIE->getSourceRange(); 3370 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3371 Parens.getEnd()); 3372 } 3373 3374 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3375 if (isa<ImplicitValueInitExpr>(Init)) 3376 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3377 SourceLocation()); 3378 3379 // Revert initialization by constructor back to a parenthesized or braced list 3380 // of expressions. Any other form of initializer can just be reused directly. 3381 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3382 return getDerived().TransformExpr(Init); 3383 3384 // If the initialization implicitly converted an initializer list to a 3385 // std::initializer_list object, unwrap the std::initializer_list too. 3386 if (Construct && Construct->isStdInitListInitialization()) 3387 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3388 3389 SmallVector<Expr*, 8> NewArgs; 3390 bool ArgChanged = false; 3391 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3392 /*IsCall*/true, NewArgs, &ArgChanged)) 3393 return ExprError(); 3394 3395 // If this was list initialization, revert to syntactic list form. 3396 if (Construct->isListInitialization()) 3397 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3398 Construct->getEndLoc()); 3399 3400 // Build a ParenListExpr to represent anything else. 3401 SourceRange Parens = Construct->getParenOrBraceRange(); 3402 if (Parens.isInvalid()) { 3403 // This was a variable declaration's initialization for which no initializer 3404 // was specified. 3405 assert(NewArgs.empty() && 3406 "no parens or braces but have direct init with arguments?"); 3407 return ExprEmpty(); 3408 } 3409 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3410 Parens.getEnd()); 3411 } 3412 3413 template<typename Derived> 3414 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3415 unsigned NumInputs, 3416 bool IsCall, 3417 SmallVectorImpl<Expr *> &Outputs, 3418 bool *ArgChanged) { 3419 for (unsigned I = 0; I != NumInputs; ++I) { 3420 // If requested, drop call arguments that need to be dropped. 3421 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3422 if (ArgChanged) 3423 *ArgChanged = true; 3424 3425 break; 3426 } 3427 3428 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3429 Expr *Pattern = Expansion->getPattern(); 3430 3431 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3432 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3433 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3434 3435 // Determine whether the set of unexpanded parameter packs can and should 3436 // be expanded. 3437 bool Expand = true; 3438 bool RetainExpansion = false; 3439 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3440 Optional<unsigned> NumExpansions = OrigNumExpansions; 3441 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3442 Pattern->getSourceRange(), 3443 Unexpanded, 3444 Expand, RetainExpansion, 3445 NumExpansions)) 3446 return true; 3447 3448 if (!Expand) { 3449 // The transform has determined that we should perform a simple 3450 // transformation on the pack expansion, producing another pack 3451 // expansion. 3452 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3453 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3454 if (OutPattern.isInvalid()) 3455 return true; 3456 3457 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3458 Expansion->getEllipsisLoc(), 3459 NumExpansions); 3460 if (Out.isInvalid()) 3461 return true; 3462 3463 if (ArgChanged) 3464 *ArgChanged = true; 3465 Outputs.push_back(Out.get()); 3466 continue; 3467 } 3468 3469 // Record right away that the argument was changed. This needs 3470 // to happen even if the array expands to nothing. 3471 if (ArgChanged) *ArgChanged = true; 3472 3473 // The transform has determined that we should perform an elementwise 3474 // expansion of the pattern. Do so. 3475 for (unsigned I = 0; I != *NumExpansions; ++I) { 3476 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3477 ExprResult Out = getDerived().TransformExpr(Pattern); 3478 if (Out.isInvalid()) 3479 return true; 3480 3481 if (Out.get()->containsUnexpandedParameterPack()) { 3482 Out = getDerived().RebuildPackExpansion( 3483 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3484 if (Out.isInvalid()) 3485 return true; 3486 } 3487 3488 Outputs.push_back(Out.get()); 3489 } 3490 3491 // If we're supposed to retain a pack expansion, do so by temporarily 3492 // forgetting the partially-substituted parameter pack. 3493 if (RetainExpansion) { 3494 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3495 3496 ExprResult Out = getDerived().TransformExpr(Pattern); 3497 if (Out.isInvalid()) 3498 return true; 3499 3500 Out = getDerived().RebuildPackExpansion( 3501 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3502 if (Out.isInvalid()) 3503 return true; 3504 3505 Outputs.push_back(Out.get()); 3506 } 3507 3508 continue; 3509 } 3510 3511 ExprResult Result = 3512 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3513 : getDerived().TransformExpr(Inputs[I]); 3514 if (Result.isInvalid()) 3515 return true; 3516 3517 if (Result.get() != Inputs[I] && ArgChanged) 3518 *ArgChanged = true; 3519 3520 Outputs.push_back(Result.get()); 3521 } 3522 3523 return false; 3524 } 3525 3526 template <typename Derived> 3527 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3528 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3529 if (Var) { 3530 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3531 getDerived().TransformDefinition(Var->getLocation(), Var)); 3532 3533 if (!ConditionVar) 3534 return Sema::ConditionError(); 3535 3536 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3537 } 3538 3539 if (Expr) { 3540 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3541 3542 if (CondExpr.isInvalid()) 3543 return Sema::ConditionError(); 3544 3545 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3546 } 3547 3548 return Sema::ConditionResult(); 3549 } 3550 3551 template<typename Derived> 3552 NestedNameSpecifierLoc 3553 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3554 NestedNameSpecifierLoc NNS, 3555 QualType ObjectType, 3556 NamedDecl *FirstQualifierInScope) { 3557 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3558 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3559 Qualifier = Qualifier.getPrefix()) 3560 Qualifiers.push_back(Qualifier); 3561 3562 CXXScopeSpec SS; 3563 while (!Qualifiers.empty()) { 3564 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3565 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3566 3567 switch (QNNS->getKind()) { 3568 case NestedNameSpecifier::Identifier: { 3569 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3570 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3571 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3572 SS, FirstQualifierInScope, false)) 3573 return NestedNameSpecifierLoc(); 3574 } 3575 break; 3576 3577 case NestedNameSpecifier::Namespace: { 3578 NamespaceDecl *NS 3579 = cast_or_null<NamespaceDecl>( 3580 getDerived().TransformDecl( 3581 Q.getLocalBeginLoc(), 3582 QNNS->getAsNamespace())); 3583 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3584 break; 3585 } 3586 3587 case NestedNameSpecifier::NamespaceAlias: { 3588 NamespaceAliasDecl *Alias 3589 = cast_or_null<NamespaceAliasDecl>( 3590 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3591 QNNS->getAsNamespaceAlias())); 3592 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3593 Q.getLocalEndLoc()); 3594 break; 3595 } 3596 3597 case NestedNameSpecifier::Global: 3598 // There is no meaningful transformation that one could perform on the 3599 // global scope. 3600 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3601 break; 3602 3603 case NestedNameSpecifier::Super: { 3604 CXXRecordDecl *RD = 3605 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3606 SourceLocation(), QNNS->getAsRecordDecl())); 3607 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3608 break; 3609 } 3610 3611 case NestedNameSpecifier::TypeSpecWithTemplate: 3612 case NestedNameSpecifier::TypeSpec: { 3613 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3614 FirstQualifierInScope, SS); 3615 3616 if (!TL) 3617 return NestedNameSpecifierLoc(); 3618 3619 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3620 (SemaRef.getLangOpts().CPlusPlus11 && 3621 TL.getType()->isEnumeralType())) { 3622 assert(!TL.getType().hasLocalQualifiers() && 3623 "Can't get cv-qualifiers here"); 3624 if (TL.getType()->isEnumeralType()) 3625 SemaRef.Diag(TL.getBeginLoc(), 3626 diag::warn_cxx98_compat_enum_nested_name_spec); 3627 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3628 Q.getLocalEndLoc()); 3629 break; 3630 } 3631 // If the nested-name-specifier is an invalid type def, don't emit an 3632 // error because a previous error should have already been emitted. 3633 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3634 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3635 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3636 << TL.getType() << SS.getRange(); 3637 } 3638 return NestedNameSpecifierLoc(); 3639 } 3640 } 3641 3642 // The qualifier-in-scope and object type only apply to the leftmost entity. 3643 FirstQualifierInScope = nullptr; 3644 ObjectType = QualType(); 3645 } 3646 3647 // Don't rebuild the nested-name-specifier if we don't have to. 3648 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3649 !getDerived().AlwaysRebuild()) 3650 return NNS; 3651 3652 // If we can re-use the source-location data from the original 3653 // nested-name-specifier, do so. 3654 if (SS.location_size() == NNS.getDataLength() && 3655 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3656 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3657 3658 // Allocate new nested-name-specifier location information. 3659 return SS.getWithLocInContext(SemaRef.Context); 3660 } 3661 3662 template<typename Derived> 3663 DeclarationNameInfo 3664 TreeTransform<Derived> 3665 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3666 DeclarationName Name = NameInfo.getName(); 3667 if (!Name) 3668 return DeclarationNameInfo(); 3669 3670 switch (Name.getNameKind()) { 3671 case DeclarationName::Identifier: 3672 case DeclarationName::ObjCZeroArgSelector: 3673 case DeclarationName::ObjCOneArgSelector: 3674 case DeclarationName::ObjCMultiArgSelector: 3675 case DeclarationName::CXXOperatorName: 3676 case DeclarationName::CXXLiteralOperatorName: 3677 case DeclarationName::CXXUsingDirective: 3678 return NameInfo; 3679 3680 case DeclarationName::CXXDeductionGuideName: { 3681 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3682 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3683 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3684 if (!NewTemplate) 3685 return DeclarationNameInfo(); 3686 3687 DeclarationNameInfo NewNameInfo(NameInfo); 3688 NewNameInfo.setName( 3689 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3690 return NewNameInfo; 3691 } 3692 3693 case DeclarationName::CXXConstructorName: 3694 case DeclarationName::CXXDestructorName: 3695 case DeclarationName::CXXConversionFunctionName: { 3696 TypeSourceInfo *NewTInfo; 3697 CanQualType NewCanTy; 3698 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3699 NewTInfo = getDerived().TransformType(OldTInfo); 3700 if (!NewTInfo) 3701 return DeclarationNameInfo(); 3702 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3703 } 3704 else { 3705 NewTInfo = nullptr; 3706 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3707 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3708 if (NewT.isNull()) 3709 return DeclarationNameInfo(); 3710 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3711 } 3712 3713 DeclarationName NewName 3714 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3715 NewCanTy); 3716 DeclarationNameInfo NewNameInfo(NameInfo); 3717 NewNameInfo.setName(NewName); 3718 NewNameInfo.setNamedTypeInfo(NewTInfo); 3719 return NewNameInfo; 3720 } 3721 } 3722 3723 llvm_unreachable("Unknown name kind."); 3724 } 3725 3726 template<typename Derived> 3727 TemplateName 3728 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3729 TemplateName Name, 3730 SourceLocation NameLoc, 3731 QualType ObjectType, 3732 NamedDecl *FirstQualifierInScope, 3733 bool AllowInjectedClassName) { 3734 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3735 TemplateDecl *Template = QTN->getTemplateDecl(); 3736 assert(Template && "qualified template name must refer to a template"); 3737 3738 TemplateDecl *TransTemplate 3739 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3740 Template)); 3741 if (!TransTemplate) 3742 return TemplateName(); 3743 3744 if (!getDerived().AlwaysRebuild() && 3745 SS.getScopeRep() == QTN->getQualifier() && 3746 TransTemplate == Template) 3747 return Name; 3748 3749 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3750 TransTemplate); 3751 } 3752 3753 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3754 if (SS.getScopeRep()) { 3755 // These apply to the scope specifier, not the template. 3756 ObjectType = QualType(); 3757 FirstQualifierInScope = nullptr; 3758 } 3759 3760 if (!getDerived().AlwaysRebuild() && 3761 SS.getScopeRep() == DTN->getQualifier() && 3762 ObjectType.isNull()) 3763 return Name; 3764 3765 // FIXME: Preserve the location of the "template" keyword. 3766 SourceLocation TemplateKWLoc = NameLoc; 3767 3768 if (DTN->isIdentifier()) { 3769 return getDerived().RebuildTemplateName(SS, 3770 TemplateKWLoc, 3771 *DTN->getIdentifier(), 3772 NameLoc, 3773 ObjectType, 3774 FirstQualifierInScope, 3775 AllowInjectedClassName); 3776 } 3777 3778 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3779 DTN->getOperator(), NameLoc, 3780 ObjectType, AllowInjectedClassName); 3781 } 3782 3783 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3784 TemplateDecl *TransTemplate 3785 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3786 Template)); 3787 if (!TransTemplate) 3788 return TemplateName(); 3789 3790 if (!getDerived().AlwaysRebuild() && 3791 TransTemplate == Template) 3792 return Name; 3793 3794 return TemplateName(TransTemplate); 3795 } 3796 3797 if (SubstTemplateTemplateParmPackStorage *SubstPack 3798 = Name.getAsSubstTemplateTemplateParmPack()) { 3799 TemplateTemplateParmDecl *TransParam 3800 = cast_or_null<TemplateTemplateParmDecl>( 3801 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3802 if (!TransParam) 3803 return TemplateName(); 3804 3805 if (!getDerived().AlwaysRebuild() && 3806 TransParam == SubstPack->getParameterPack()) 3807 return Name; 3808 3809 return getDerived().RebuildTemplateName(TransParam, 3810 SubstPack->getArgumentPack()); 3811 } 3812 3813 // These should be getting filtered out before they reach the AST. 3814 llvm_unreachable("overloaded function decl survived to here"); 3815 } 3816 3817 template<typename Derived> 3818 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3819 const TemplateArgument &Arg, 3820 TemplateArgumentLoc &Output) { 3821 SourceLocation Loc = getDerived().getBaseLocation(); 3822 switch (Arg.getKind()) { 3823 case TemplateArgument::Null: 3824 llvm_unreachable("null template argument in TreeTransform"); 3825 break; 3826 3827 case TemplateArgument::Type: 3828 Output = TemplateArgumentLoc(Arg, 3829 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3830 3831 break; 3832 3833 case TemplateArgument::Template: 3834 case TemplateArgument::TemplateExpansion: { 3835 NestedNameSpecifierLocBuilder Builder; 3836 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3837 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3838 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3839 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3840 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3841 3842 if (Arg.getKind() == TemplateArgument::Template) 3843 Output = TemplateArgumentLoc(Arg, 3844 Builder.getWithLocInContext(SemaRef.Context), 3845 Loc); 3846 else 3847 Output = TemplateArgumentLoc(Arg, 3848 Builder.getWithLocInContext(SemaRef.Context), 3849 Loc, Loc); 3850 3851 break; 3852 } 3853 3854 case TemplateArgument::Expression: 3855 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3856 break; 3857 3858 case TemplateArgument::Declaration: 3859 case TemplateArgument::Integral: 3860 case TemplateArgument::Pack: 3861 case TemplateArgument::NullPtr: 3862 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3863 break; 3864 } 3865 } 3866 3867 template<typename Derived> 3868 bool TreeTransform<Derived>::TransformTemplateArgument( 3869 const TemplateArgumentLoc &Input, 3870 TemplateArgumentLoc &Output, bool Uneval) { 3871 EnterExpressionEvaluationContext EEEC( 3872 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3873 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3874 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3875 const TemplateArgument &Arg = Input.getArgument(); 3876 switch (Arg.getKind()) { 3877 case TemplateArgument::Null: 3878 case TemplateArgument::Integral: 3879 case TemplateArgument::Pack: 3880 case TemplateArgument::Declaration: 3881 case TemplateArgument::NullPtr: 3882 llvm_unreachable("Unexpected TemplateArgument"); 3883 3884 case TemplateArgument::Type: { 3885 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3886 if (!DI) 3887 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3888 3889 DI = getDerived().TransformType(DI); 3890 if (!DI) return true; 3891 3892 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3893 return false; 3894 } 3895 3896 case TemplateArgument::Template: { 3897 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3898 if (QualifierLoc) { 3899 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3900 if (!QualifierLoc) 3901 return true; 3902 } 3903 3904 CXXScopeSpec SS; 3905 SS.Adopt(QualifierLoc); 3906 TemplateName Template 3907 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3908 Input.getTemplateNameLoc()); 3909 if (Template.isNull()) 3910 return true; 3911 3912 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3913 Input.getTemplateNameLoc()); 3914 return false; 3915 } 3916 3917 case TemplateArgument::TemplateExpansion: 3918 llvm_unreachable("Caller should expand pack expansions"); 3919 3920 case TemplateArgument::Expression: { 3921 // Template argument expressions are constant expressions. 3922 EnterExpressionEvaluationContext Unevaluated( 3923 getSema(), Uneval 3924 ? Sema::ExpressionEvaluationContext::Unevaluated 3925 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3926 3927 Expr *InputExpr = Input.getSourceExpression(); 3928 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3929 3930 ExprResult E = getDerived().TransformExpr(InputExpr); 3931 E = SemaRef.ActOnConstantExpression(E); 3932 if (E.isInvalid()) return true; 3933 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3934 return false; 3935 } 3936 } 3937 3938 // Work around bogus GCC warning 3939 return true; 3940 } 3941 3942 /// Iterator adaptor that invents template argument location information 3943 /// for each of the template arguments in its underlying iterator. 3944 template<typename Derived, typename InputIterator> 3945 class TemplateArgumentLocInventIterator { 3946 TreeTransform<Derived> &Self; 3947 InputIterator Iter; 3948 3949 public: 3950 typedef TemplateArgumentLoc value_type; 3951 typedef TemplateArgumentLoc reference; 3952 typedef typename std::iterator_traits<InputIterator>::difference_type 3953 difference_type; 3954 typedef std::input_iterator_tag iterator_category; 3955 3956 class pointer { 3957 TemplateArgumentLoc Arg; 3958 3959 public: 3960 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3961 3962 const TemplateArgumentLoc *operator->() const { return &Arg; } 3963 }; 3964 3965 TemplateArgumentLocInventIterator() { } 3966 3967 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3968 InputIterator Iter) 3969 : Self(Self), Iter(Iter) { } 3970 3971 TemplateArgumentLocInventIterator &operator++() { 3972 ++Iter; 3973 return *this; 3974 } 3975 3976 TemplateArgumentLocInventIterator operator++(int) { 3977 TemplateArgumentLocInventIterator Old(*this); 3978 ++(*this); 3979 return Old; 3980 } 3981 3982 reference operator*() const { 3983 TemplateArgumentLoc Result; 3984 Self.InventTemplateArgumentLoc(*Iter, Result); 3985 return Result; 3986 } 3987 3988 pointer operator->() const { return pointer(**this); } 3989 3990 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3991 const TemplateArgumentLocInventIterator &Y) { 3992 return X.Iter == Y.Iter; 3993 } 3994 3995 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3996 const TemplateArgumentLocInventIterator &Y) { 3997 return X.Iter != Y.Iter; 3998 } 3999 }; 4000 4001 template<typename Derived> 4002 template<typename InputIterator> 4003 bool TreeTransform<Derived>::TransformTemplateArguments( 4004 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4005 bool Uneval) { 4006 for (; First != Last; ++First) { 4007 TemplateArgumentLoc Out; 4008 TemplateArgumentLoc In = *First; 4009 4010 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4011 // Unpack argument packs, which we translate them into separate 4012 // arguments. 4013 // FIXME: We could do much better if we could guarantee that the 4014 // TemplateArgumentLocInfo for the pack expansion would be usable for 4015 // all of the template arguments in the argument pack. 4016 typedef TemplateArgumentLocInventIterator<Derived, 4017 TemplateArgument::pack_iterator> 4018 PackLocIterator; 4019 if (TransformTemplateArguments(PackLocIterator(*this, 4020 In.getArgument().pack_begin()), 4021 PackLocIterator(*this, 4022 In.getArgument().pack_end()), 4023 Outputs, Uneval)) 4024 return true; 4025 4026 continue; 4027 } 4028 4029 if (In.getArgument().isPackExpansion()) { 4030 // We have a pack expansion, for which we will be substituting into 4031 // the pattern. 4032 SourceLocation Ellipsis; 4033 Optional<unsigned> OrigNumExpansions; 4034 TemplateArgumentLoc Pattern 4035 = getSema().getTemplateArgumentPackExpansionPattern( 4036 In, Ellipsis, OrigNumExpansions); 4037 4038 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4039 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4040 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4041 4042 // Determine whether the set of unexpanded parameter packs can and should 4043 // be expanded. 4044 bool Expand = true; 4045 bool RetainExpansion = false; 4046 Optional<unsigned> NumExpansions = OrigNumExpansions; 4047 if (getDerived().TryExpandParameterPacks(Ellipsis, 4048 Pattern.getSourceRange(), 4049 Unexpanded, 4050 Expand, 4051 RetainExpansion, 4052 NumExpansions)) 4053 return true; 4054 4055 if (!Expand) { 4056 // The transform has determined that we should perform a simple 4057 // transformation on the pack expansion, producing another pack 4058 // expansion. 4059 TemplateArgumentLoc OutPattern; 4060 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4061 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4062 return true; 4063 4064 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4065 NumExpansions); 4066 if (Out.getArgument().isNull()) 4067 return true; 4068 4069 Outputs.addArgument(Out); 4070 continue; 4071 } 4072 4073 // The transform has determined that we should perform an elementwise 4074 // expansion of the pattern. Do so. 4075 for (unsigned I = 0; I != *NumExpansions; ++I) { 4076 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4077 4078 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4079 return true; 4080 4081 if (Out.getArgument().containsUnexpandedParameterPack()) { 4082 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4083 OrigNumExpansions); 4084 if (Out.getArgument().isNull()) 4085 return true; 4086 } 4087 4088 Outputs.addArgument(Out); 4089 } 4090 4091 // If we're supposed to retain a pack expansion, do so by temporarily 4092 // forgetting the partially-substituted parameter pack. 4093 if (RetainExpansion) { 4094 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4095 4096 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4097 return true; 4098 4099 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4100 OrigNumExpansions); 4101 if (Out.getArgument().isNull()) 4102 return true; 4103 4104 Outputs.addArgument(Out); 4105 } 4106 4107 continue; 4108 } 4109 4110 // The simple case: 4111 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4112 return true; 4113 4114 Outputs.addArgument(Out); 4115 } 4116 4117 return false; 4118 4119 } 4120 4121 //===----------------------------------------------------------------------===// 4122 // Type transformation 4123 //===----------------------------------------------------------------------===// 4124 4125 template<typename Derived> 4126 QualType TreeTransform<Derived>::TransformType(QualType T) { 4127 if (getDerived().AlreadyTransformed(T)) 4128 return T; 4129 4130 // Temporary workaround. All of these transformations should 4131 // eventually turn into transformations on TypeLocs. 4132 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4133 getDerived().getBaseLocation()); 4134 4135 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4136 4137 if (!NewDI) 4138 return QualType(); 4139 4140 return NewDI->getType(); 4141 } 4142 4143 template<typename Derived> 4144 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4145 // Refine the base location to the type's location. 4146 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4147 getDerived().getBaseEntity()); 4148 if (getDerived().AlreadyTransformed(DI->getType())) 4149 return DI; 4150 4151 TypeLocBuilder TLB; 4152 4153 TypeLoc TL = DI->getTypeLoc(); 4154 TLB.reserve(TL.getFullDataSize()); 4155 4156 QualType Result = getDerived().TransformType(TLB, TL); 4157 if (Result.isNull()) 4158 return nullptr; 4159 4160 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4161 } 4162 4163 template<typename Derived> 4164 QualType 4165 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4166 switch (T.getTypeLocClass()) { 4167 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4168 #define TYPELOC(CLASS, PARENT) \ 4169 case TypeLoc::CLASS: \ 4170 return getDerived().Transform##CLASS##Type(TLB, \ 4171 T.castAs<CLASS##TypeLoc>()); 4172 #include "clang/AST/TypeLocNodes.def" 4173 } 4174 4175 llvm_unreachable("unhandled type loc!"); 4176 } 4177 4178 template<typename Derived> 4179 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4180 if (!isa<DependentNameType>(T)) 4181 return TransformType(T); 4182 4183 if (getDerived().AlreadyTransformed(T)) 4184 return T; 4185 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4186 getDerived().getBaseLocation()); 4187 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4188 return NewDI ? NewDI->getType() : QualType(); 4189 } 4190 4191 template<typename Derived> 4192 TypeSourceInfo * 4193 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4194 if (!isa<DependentNameType>(DI->getType())) 4195 return TransformType(DI); 4196 4197 // Refine the base location to the type's location. 4198 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4199 getDerived().getBaseEntity()); 4200 if (getDerived().AlreadyTransformed(DI->getType())) 4201 return DI; 4202 4203 TypeLocBuilder TLB; 4204 4205 TypeLoc TL = DI->getTypeLoc(); 4206 TLB.reserve(TL.getFullDataSize()); 4207 4208 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4209 if (QTL) 4210 TL = QTL.getUnqualifiedLoc(); 4211 4212 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4213 4214 QualType Result = getDerived().TransformDependentNameType( 4215 TLB, DNTL, /*DeducedTSTContext*/true); 4216 if (Result.isNull()) 4217 return nullptr; 4218 4219 if (QTL) { 4220 Result = getDerived().RebuildQualifiedType( 4221 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4222 TLB.TypeWasModifiedSafely(Result); 4223 } 4224 4225 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4226 } 4227 4228 template<typename Derived> 4229 QualType 4230 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4231 QualifiedTypeLoc T) { 4232 Qualifiers Quals = T.getType().getLocalQualifiers(); 4233 4234 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4235 if (Result.isNull()) 4236 return QualType(); 4237 4238 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4239 4240 // RebuildQualifiedType might have updated the type, but not in a way 4241 // that invalidates the TypeLoc. (There's no location information for 4242 // qualifiers.) 4243 TLB.TypeWasModifiedSafely(Result); 4244 4245 return Result; 4246 } 4247 4248 template<typename Derived> 4249 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4250 SourceLocation Loc, 4251 Qualifiers Quals) { 4252 // C++ [dcl.fct]p7: 4253 // [When] adding cv-qualifications on top of the function type [...] the 4254 // cv-qualifiers are ignored. 4255 // C++ [dcl.ref]p1: 4256 // when the cv-qualifiers are introduced through the use of a typedef-name 4257 // or decltype-specifier [...] the cv-qualifiers are ignored. 4258 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4259 // applied to a reference type. 4260 // FIXME: This removes all qualifiers, not just cv-qualifiers! 4261 if (T->isFunctionType() || T->isReferenceType()) 4262 return T; 4263 4264 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4265 // resulting type. 4266 if (Quals.hasObjCLifetime()) { 4267 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4268 Quals.removeObjCLifetime(); 4269 else if (T.getObjCLifetime()) { 4270 // Objective-C ARC: 4271 // A lifetime qualifier applied to a substituted template parameter 4272 // overrides the lifetime qualifier from the template argument. 4273 const AutoType *AutoTy; 4274 if (const SubstTemplateTypeParmType *SubstTypeParam 4275 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4276 QualType Replacement = SubstTypeParam->getReplacementType(); 4277 Qualifiers Qs = Replacement.getQualifiers(); 4278 Qs.removeObjCLifetime(); 4279 Replacement = SemaRef.Context.getQualifiedType( 4280 Replacement.getUnqualifiedType(), Qs); 4281 T = SemaRef.Context.getSubstTemplateTypeParmType( 4282 SubstTypeParam->getReplacedParameter(), Replacement); 4283 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4284 // 'auto' types behave the same way as template parameters. 4285 QualType Deduced = AutoTy->getDeducedType(); 4286 Qualifiers Qs = Deduced.getQualifiers(); 4287 Qs.removeObjCLifetime(); 4288 Deduced = 4289 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4290 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4291 AutoTy->isDependentType()); 4292 } else { 4293 // Otherwise, complain about the addition of a qualifier to an 4294 // already-qualified type. 4295 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4296 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4297 Quals.removeObjCLifetime(); 4298 } 4299 } 4300 } 4301 4302 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4303 } 4304 4305 template<typename Derived> 4306 TypeLoc 4307 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4308 QualType ObjectType, 4309 NamedDecl *UnqualLookup, 4310 CXXScopeSpec &SS) { 4311 if (getDerived().AlreadyTransformed(TL.getType())) 4312 return TL; 4313 4314 TypeSourceInfo *TSI = 4315 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4316 if (TSI) 4317 return TSI->getTypeLoc(); 4318 return TypeLoc(); 4319 } 4320 4321 template<typename Derived> 4322 TypeSourceInfo * 4323 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4324 QualType ObjectType, 4325 NamedDecl *UnqualLookup, 4326 CXXScopeSpec &SS) { 4327 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4328 return TSInfo; 4329 4330 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4331 UnqualLookup, SS); 4332 } 4333 4334 template <typename Derived> 4335 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4336 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4337 CXXScopeSpec &SS) { 4338 QualType T = TL.getType(); 4339 assert(!getDerived().AlreadyTransformed(T)); 4340 4341 TypeLocBuilder TLB; 4342 QualType Result; 4343 4344 if (isa<TemplateSpecializationType>(T)) { 4345 TemplateSpecializationTypeLoc SpecTL = 4346 TL.castAs<TemplateSpecializationTypeLoc>(); 4347 4348 TemplateName Template = getDerived().TransformTemplateName( 4349 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4350 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4351 if (Template.isNull()) 4352 return nullptr; 4353 4354 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4355 Template); 4356 } else if (isa<DependentTemplateSpecializationType>(T)) { 4357 DependentTemplateSpecializationTypeLoc SpecTL = 4358 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4359 4360 TemplateName Template 4361 = getDerived().RebuildTemplateName(SS, 4362 SpecTL.getTemplateKeywordLoc(), 4363 *SpecTL.getTypePtr()->getIdentifier(), 4364 SpecTL.getTemplateNameLoc(), 4365 ObjectType, UnqualLookup, 4366 /*AllowInjectedClassName*/true); 4367 if (Template.isNull()) 4368 return nullptr; 4369 4370 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4371 SpecTL, 4372 Template, 4373 SS); 4374 } else { 4375 // Nothing special needs to be done for these. 4376 Result = getDerived().TransformType(TLB, TL); 4377 } 4378 4379 if (Result.isNull()) 4380 return nullptr; 4381 4382 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4383 } 4384 4385 template <class TyLoc> static inline 4386 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4387 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4388 NewT.setNameLoc(T.getNameLoc()); 4389 return T.getType(); 4390 } 4391 4392 template<typename Derived> 4393 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4394 BuiltinTypeLoc T) { 4395 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4396 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4397 if (T.needsExtraLocalData()) 4398 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4399 return T.getType(); 4400 } 4401 4402 template<typename Derived> 4403 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4404 ComplexTypeLoc T) { 4405 // FIXME: recurse? 4406 return TransformTypeSpecType(TLB, T); 4407 } 4408 4409 template <typename Derived> 4410 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4411 AdjustedTypeLoc TL) { 4412 // Adjustments applied during transformation are handled elsewhere. 4413 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4414 } 4415 4416 template<typename Derived> 4417 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4418 DecayedTypeLoc TL) { 4419 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4420 if (OriginalType.isNull()) 4421 return QualType(); 4422 4423 QualType Result = TL.getType(); 4424 if (getDerived().AlwaysRebuild() || 4425 OriginalType != TL.getOriginalLoc().getType()) 4426 Result = SemaRef.Context.getDecayedType(OriginalType); 4427 TLB.push<DecayedTypeLoc>(Result); 4428 // Nothing to set for DecayedTypeLoc. 4429 return Result; 4430 } 4431 4432 template<typename Derived> 4433 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4434 PointerTypeLoc TL) { 4435 QualType PointeeType 4436 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4437 if (PointeeType.isNull()) 4438 return QualType(); 4439 4440 QualType Result = TL.getType(); 4441 if (PointeeType->getAs<ObjCObjectType>()) { 4442 // A dependent pointer type 'T *' has is being transformed such 4443 // that an Objective-C class type is being replaced for 'T'. The 4444 // resulting pointer type is an ObjCObjectPointerType, not a 4445 // PointerType. 4446 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4447 4448 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4449 NewT.setStarLoc(TL.getStarLoc()); 4450 return Result; 4451 } 4452 4453 if (getDerived().AlwaysRebuild() || 4454 PointeeType != TL.getPointeeLoc().getType()) { 4455 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4456 if (Result.isNull()) 4457 return QualType(); 4458 } 4459 4460 // Objective-C ARC can add lifetime qualifiers to the type that we're 4461 // pointing to. 4462 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4463 4464 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4465 NewT.setSigilLoc(TL.getSigilLoc()); 4466 return Result; 4467 } 4468 4469 template<typename Derived> 4470 QualType 4471 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4472 BlockPointerTypeLoc TL) { 4473 QualType PointeeType 4474 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4475 if (PointeeType.isNull()) 4476 return QualType(); 4477 4478 QualType Result = TL.getType(); 4479 if (getDerived().AlwaysRebuild() || 4480 PointeeType != TL.getPointeeLoc().getType()) { 4481 Result = getDerived().RebuildBlockPointerType(PointeeType, 4482 TL.getSigilLoc()); 4483 if (Result.isNull()) 4484 return QualType(); 4485 } 4486 4487 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4488 NewT.setSigilLoc(TL.getSigilLoc()); 4489 return Result; 4490 } 4491 4492 /// Transforms a reference type. Note that somewhat paradoxically we 4493 /// don't care whether the type itself is an l-value type or an r-value 4494 /// type; we only care if the type was *written* as an l-value type 4495 /// or an r-value type. 4496 template<typename Derived> 4497 QualType 4498 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4499 ReferenceTypeLoc TL) { 4500 const ReferenceType *T = TL.getTypePtr(); 4501 4502 // Note that this works with the pointee-as-written. 4503 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4504 if (PointeeType.isNull()) 4505 return QualType(); 4506 4507 QualType Result = TL.getType(); 4508 if (getDerived().AlwaysRebuild() || 4509 PointeeType != T->getPointeeTypeAsWritten()) { 4510 Result = getDerived().RebuildReferenceType(PointeeType, 4511 T->isSpelledAsLValue(), 4512 TL.getSigilLoc()); 4513 if (Result.isNull()) 4514 return QualType(); 4515 } 4516 4517 // Objective-C ARC can add lifetime qualifiers to the type that we're 4518 // referring to. 4519 TLB.TypeWasModifiedSafely( 4520 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4521 4522 // r-value references can be rebuilt as l-value references. 4523 ReferenceTypeLoc NewTL; 4524 if (isa<LValueReferenceType>(Result)) 4525 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4526 else 4527 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4528 NewTL.setSigilLoc(TL.getSigilLoc()); 4529 4530 return Result; 4531 } 4532 4533 template<typename Derived> 4534 QualType 4535 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4536 LValueReferenceTypeLoc TL) { 4537 return TransformReferenceType(TLB, TL); 4538 } 4539 4540 template<typename Derived> 4541 QualType 4542 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4543 RValueReferenceTypeLoc TL) { 4544 return TransformReferenceType(TLB, TL); 4545 } 4546 4547 template<typename Derived> 4548 QualType 4549 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4550 MemberPointerTypeLoc TL) { 4551 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4552 if (PointeeType.isNull()) 4553 return QualType(); 4554 4555 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4556 TypeSourceInfo *NewClsTInfo = nullptr; 4557 if (OldClsTInfo) { 4558 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4559 if (!NewClsTInfo) 4560 return QualType(); 4561 } 4562 4563 const MemberPointerType *T = TL.getTypePtr(); 4564 QualType OldClsType = QualType(T->getClass(), 0); 4565 QualType NewClsType; 4566 if (NewClsTInfo) 4567 NewClsType = NewClsTInfo->getType(); 4568 else { 4569 NewClsType = getDerived().TransformType(OldClsType); 4570 if (NewClsType.isNull()) 4571 return QualType(); 4572 } 4573 4574 QualType Result = TL.getType(); 4575 if (getDerived().AlwaysRebuild() || 4576 PointeeType != T->getPointeeType() || 4577 NewClsType != OldClsType) { 4578 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4579 TL.getStarLoc()); 4580 if (Result.isNull()) 4581 return QualType(); 4582 } 4583 4584 // If we had to adjust the pointee type when building a member pointer, make 4585 // sure to push TypeLoc info for it. 4586 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4587 if (MPT && PointeeType != MPT->getPointeeType()) { 4588 assert(isa<AdjustedType>(MPT->getPointeeType())); 4589 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4590 } 4591 4592 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4593 NewTL.setSigilLoc(TL.getSigilLoc()); 4594 NewTL.setClassTInfo(NewClsTInfo); 4595 4596 return Result; 4597 } 4598 4599 template<typename Derived> 4600 QualType 4601 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4602 ConstantArrayTypeLoc TL) { 4603 const ConstantArrayType *T = TL.getTypePtr(); 4604 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4605 if (ElementType.isNull()) 4606 return QualType(); 4607 4608 QualType Result = TL.getType(); 4609 if (getDerived().AlwaysRebuild() || 4610 ElementType != T->getElementType()) { 4611 Result = getDerived().RebuildConstantArrayType(ElementType, 4612 T->getSizeModifier(), 4613 T->getSize(), 4614 T->getIndexTypeCVRQualifiers(), 4615 TL.getBracketsRange()); 4616 if (Result.isNull()) 4617 return QualType(); 4618 } 4619 4620 // We might have either a ConstantArrayType or a VariableArrayType now: 4621 // a ConstantArrayType is allowed to have an element type which is a 4622 // VariableArrayType if the type is dependent. Fortunately, all array 4623 // types have the same location layout. 4624 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4625 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4626 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4627 4628 Expr *Size = TL.getSizeExpr(); 4629 if (Size) { 4630 EnterExpressionEvaluationContext Unevaluated( 4631 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4632 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4633 Size = SemaRef.ActOnConstantExpression(Size).get(); 4634 } 4635 NewTL.setSizeExpr(Size); 4636 4637 return Result; 4638 } 4639 4640 template<typename Derived> 4641 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4642 TypeLocBuilder &TLB, 4643 IncompleteArrayTypeLoc TL) { 4644 const IncompleteArrayType *T = TL.getTypePtr(); 4645 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4646 if (ElementType.isNull()) 4647 return QualType(); 4648 4649 QualType Result = TL.getType(); 4650 if (getDerived().AlwaysRebuild() || 4651 ElementType != T->getElementType()) { 4652 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4653 T->getSizeModifier(), 4654 T->getIndexTypeCVRQualifiers(), 4655 TL.getBracketsRange()); 4656 if (Result.isNull()) 4657 return QualType(); 4658 } 4659 4660 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4661 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4662 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4663 NewTL.setSizeExpr(nullptr); 4664 4665 return Result; 4666 } 4667 4668 template<typename Derived> 4669 QualType 4670 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4671 VariableArrayTypeLoc TL) { 4672 const VariableArrayType *T = TL.getTypePtr(); 4673 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4674 if (ElementType.isNull()) 4675 return QualType(); 4676 4677 ExprResult SizeResult; 4678 { 4679 EnterExpressionEvaluationContext Context( 4680 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4681 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4682 } 4683 if (SizeResult.isInvalid()) 4684 return QualType(); 4685 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4686 if (SizeResult.isInvalid()) 4687 return QualType(); 4688 4689 Expr *Size = SizeResult.get(); 4690 4691 QualType Result = TL.getType(); 4692 if (getDerived().AlwaysRebuild() || 4693 ElementType != T->getElementType() || 4694 Size != T->getSizeExpr()) { 4695 Result = getDerived().RebuildVariableArrayType(ElementType, 4696 T->getSizeModifier(), 4697 Size, 4698 T->getIndexTypeCVRQualifiers(), 4699 TL.getBracketsRange()); 4700 if (Result.isNull()) 4701 return QualType(); 4702 } 4703 4704 // We might have constant size array now, but fortunately it has the same 4705 // location layout. 4706 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4707 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4708 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4709 NewTL.setSizeExpr(Size); 4710 4711 return Result; 4712 } 4713 4714 template<typename Derived> 4715 QualType 4716 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4717 DependentSizedArrayTypeLoc TL) { 4718 const DependentSizedArrayType *T = TL.getTypePtr(); 4719 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4720 if (ElementType.isNull()) 4721 return QualType(); 4722 4723 // Array bounds are constant expressions. 4724 EnterExpressionEvaluationContext Unevaluated( 4725 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4726 4727 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4728 Expr *origSize = TL.getSizeExpr(); 4729 if (!origSize) origSize = T->getSizeExpr(); 4730 4731 ExprResult sizeResult 4732 = getDerived().TransformExpr(origSize); 4733 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4734 if (sizeResult.isInvalid()) 4735 return QualType(); 4736 4737 Expr *size = sizeResult.get(); 4738 4739 QualType Result = TL.getType(); 4740 if (getDerived().AlwaysRebuild() || 4741 ElementType != T->getElementType() || 4742 size != origSize) { 4743 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4744 T->getSizeModifier(), 4745 size, 4746 T->getIndexTypeCVRQualifiers(), 4747 TL.getBracketsRange()); 4748 if (Result.isNull()) 4749 return QualType(); 4750 } 4751 4752 // We might have any sort of array type now, but fortunately they 4753 // all have the same location layout. 4754 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4755 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4756 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4757 NewTL.setSizeExpr(size); 4758 4759 return Result; 4760 } 4761 4762 template <typename Derived> 4763 QualType TreeTransform<Derived>::TransformDependentVectorType( 4764 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4765 const DependentVectorType *T = TL.getTypePtr(); 4766 QualType ElementType = getDerived().TransformType(T->getElementType()); 4767 if (ElementType.isNull()) 4768 return QualType(); 4769 4770 EnterExpressionEvaluationContext Unevaluated( 4771 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4772 4773 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4774 Size = SemaRef.ActOnConstantExpression(Size); 4775 if (Size.isInvalid()) 4776 return QualType(); 4777 4778 QualType Result = TL.getType(); 4779 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4780 Size.get() != T->getSizeExpr()) { 4781 Result = getDerived().RebuildDependentVectorType( 4782 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4783 if (Result.isNull()) 4784 return QualType(); 4785 } 4786 4787 // Result might be dependent or not. 4788 if (isa<DependentVectorType>(Result)) { 4789 DependentVectorTypeLoc NewTL = 4790 TLB.push<DependentVectorTypeLoc>(Result); 4791 NewTL.setNameLoc(TL.getNameLoc()); 4792 } else { 4793 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4794 NewTL.setNameLoc(TL.getNameLoc()); 4795 } 4796 4797 return Result; 4798 } 4799 4800 template<typename Derived> 4801 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4802 TypeLocBuilder &TLB, 4803 DependentSizedExtVectorTypeLoc TL) { 4804 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4805 4806 // FIXME: ext vector locs should be nested 4807 QualType ElementType = getDerived().TransformType(T->getElementType()); 4808 if (ElementType.isNull()) 4809 return QualType(); 4810 4811 // Vector sizes are constant expressions. 4812 EnterExpressionEvaluationContext Unevaluated( 4813 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4814 4815 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4816 Size = SemaRef.ActOnConstantExpression(Size); 4817 if (Size.isInvalid()) 4818 return QualType(); 4819 4820 QualType Result = TL.getType(); 4821 if (getDerived().AlwaysRebuild() || 4822 ElementType != T->getElementType() || 4823 Size.get() != T->getSizeExpr()) { 4824 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4825 Size.get(), 4826 T->getAttributeLoc()); 4827 if (Result.isNull()) 4828 return QualType(); 4829 } 4830 4831 // Result might be dependent or not. 4832 if (isa<DependentSizedExtVectorType>(Result)) { 4833 DependentSizedExtVectorTypeLoc NewTL 4834 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4835 NewTL.setNameLoc(TL.getNameLoc()); 4836 } else { 4837 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4838 NewTL.setNameLoc(TL.getNameLoc()); 4839 } 4840 4841 return Result; 4842 } 4843 4844 template <typename Derived> 4845 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4846 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4847 const DependentAddressSpaceType *T = TL.getTypePtr(); 4848 4849 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4850 4851 if (pointeeType.isNull()) 4852 return QualType(); 4853 4854 // Address spaces are constant expressions. 4855 EnterExpressionEvaluationContext Unevaluated( 4856 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4857 4858 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4859 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4860 if (AddrSpace.isInvalid()) 4861 return QualType(); 4862 4863 QualType Result = TL.getType(); 4864 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4865 AddrSpace.get() != T->getAddrSpaceExpr()) { 4866 Result = getDerived().RebuildDependentAddressSpaceType( 4867 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4868 if (Result.isNull()) 4869 return QualType(); 4870 } 4871 4872 // Result might be dependent or not. 4873 if (isa<DependentAddressSpaceType>(Result)) { 4874 DependentAddressSpaceTypeLoc NewTL = 4875 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4876 4877 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4878 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4879 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4880 4881 } else { 4882 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4883 Result, getDerived().getBaseLocation()); 4884 TransformType(TLB, DI->getTypeLoc()); 4885 } 4886 4887 return Result; 4888 } 4889 4890 template <typename Derived> 4891 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4892 VectorTypeLoc TL) { 4893 const VectorType *T = TL.getTypePtr(); 4894 QualType ElementType = getDerived().TransformType(T->getElementType()); 4895 if (ElementType.isNull()) 4896 return QualType(); 4897 4898 QualType Result = TL.getType(); 4899 if (getDerived().AlwaysRebuild() || 4900 ElementType != T->getElementType()) { 4901 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4902 T->getVectorKind()); 4903 if (Result.isNull()) 4904 return QualType(); 4905 } 4906 4907 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4908 NewTL.setNameLoc(TL.getNameLoc()); 4909 4910 return Result; 4911 } 4912 4913 template<typename Derived> 4914 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4915 ExtVectorTypeLoc TL) { 4916 const VectorType *T = TL.getTypePtr(); 4917 QualType ElementType = getDerived().TransformType(T->getElementType()); 4918 if (ElementType.isNull()) 4919 return QualType(); 4920 4921 QualType Result = TL.getType(); 4922 if (getDerived().AlwaysRebuild() || 4923 ElementType != T->getElementType()) { 4924 Result = getDerived().RebuildExtVectorType(ElementType, 4925 T->getNumElements(), 4926 /*FIXME*/ SourceLocation()); 4927 if (Result.isNull()) 4928 return QualType(); 4929 } 4930 4931 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4932 NewTL.setNameLoc(TL.getNameLoc()); 4933 4934 return Result; 4935 } 4936 4937 template <typename Derived> 4938 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4939 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4940 bool ExpectParameterPack) { 4941 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4942 TypeSourceInfo *NewDI = nullptr; 4943 4944 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4945 // If we're substituting into a pack expansion type and we know the 4946 // length we want to expand to, just substitute for the pattern. 4947 TypeLoc OldTL = OldDI->getTypeLoc(); 4948 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4949 4950 TypeLocBuilder TLB; 4951 TypeLoc NewTL = OldDI->getTypeLoc(); 4952 TLB.reserve(NewTL.getFullDataSize()); 4953 4954 QualType Result = getDerived().TransformType(TLB, 4955 OldExpansionTL.getPatternLoc()); 4956 if (Result.isNull()) 4957 return nullptr; 4958 4959 Result = RebuildPackExpansionType(Result, 4960 OldExpansionTL.getPatternLoc().getSourceRange(), 4961 OldExpansionTL.getEllipsisLoc(), 4962 NumExpansions); 4963 if (Result.isNull()) 4964 return nullptr; 4965 4966 PackExpansionTypeLoc NewExpansionTL 4967 = TLB.push<PackExpansionTypeLoc>(Result); 4968 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4969 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4970 } else 4971 NewDI = getDerived().TransformType(OldDI); 4972 if (!NewDI) 4973 return nullptr; 4974 4975 if (NewDI == OldDI && indexAdjustment == 0) 4976 return OldParm; 4977 4978 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4979 OldParm->getDeclContext(), 4980 OldParm->getInnerLocStart(), 4981 OldParm->getLocation(), 4982 OldParm->getIdentifier(), 4983 NewDI->getType(), 4984 NewDI, 4985 OldParm->getStorageClass(), 4986 /* DefArg */ nullptr); 4987 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4988 OldParm->getFunctionScopeIndex() + indexAdjustment); 4989 return newParm; 4990 } 4991 4992 template <typename Derived> 4993 bool TreeTransform<Derived>::TransformFunctionTypeParams( 4994 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 4995 const QualType *ParamTypes, 4996 const FunctionProtoType::ExtParameterInfo *ParamInfos, 4997 SmallVectorImpl<QualType> &OutParamTypes, 4998 SmallVectorImpl<ParmVarDecl *> *PVars, 4999 Sema::ExtParameterInfoBuilder &PInfos) { 5000 int indexAdjustment = 0; 5001 5002 unsigned NumParams = Params.size(); 5003 for (unsigned i = 0; i != NumParams; ++i) { 5004 if (ParmVarDecl *OldParm = Params[i]) { 5005 assert(OldParm->getFunctionScopeIndex() == i); 5006 5007 Optional<unsigned> NumExpansions; 5008 ParmVarDecl *NewParm = nullptr; 5009 if (OldParm->isParameterPack()) { 5010 // We have a function parameter pack that may need to be expanded. 5011 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5012 5013 // Find the parameter packs that could be expanded. 5014 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5015 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5016 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5017 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5018 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5019 5020 // Determine whether we should expand the parameter packs. 5021 bool ShouldExpand = false; 5022 bool RetainExpansion = false; 5023 Optional<unsigned> OrigNumExpansions = 5024 ExpansionTL.getTypePtr()->getNumExpansions(); 5025 NumExpansions = OrigNumExpansions; 5026 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5027 Pattern.getSourceRange(), 5028 Unexpanded, 5029 ShouldExpand, 5030 RetainExpansion, 5031 NumExpansions)) { 5032 return true; 5033 } 5034 5035 if (ShouldExpand) { 5036 // Expand the function parameter pack into multiple, separate 5037 // parameters. 5038 getDerived().ExpandingFunctionParameterPack(OldParm); 5039 for (unsigned I = 0; I != *NumExpansions; ++I) { 5040 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5041 ParmVarDecl *NewParm 5042 = getDerived().TransformFunctionTypeParam(OldParm, 5043 indexAdjustment++, 5044 OrigNumExpansions, 5045 /*ExpectParameterPack=*/false); 5046 if (!NewParm) 5047 return true; 5048 5049 if (ParamInfos) 5050 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5051 OutParamTypes.push_back(NewParm->getType()); 5052 if (PVars) 5053 PVars->push_back(NewParm); 5054 } 5055 5056 // If we're supposed to retain a pack expansion, do so by temporarily 5057 // forgetting the partially-substituted parameter pack. 5058 if (RetainExpansion) { 5059 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5060 ParmVarDecl *NewParm 5061 = getDerived().TransformFunctionTypeParam(OldParm, 5062 indexAdjustment++, 5063 OrigNumExpansions, 5064 /*ExpectParameterPack=*/false); 5065 if (!NewParm) 5066 return true; 5067 5068 if (ParamInfos) 5069 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5070 OutParamTypes.push_back(NewParm->getType()); 5071 if (PVars) 5072 PVars->push_back(NewParm); 5073 } 5074 5075 // The next parameter should have the same adjustment as the 5076 // last thing we pushed, but we post-incremented indexAdjustment 5077 // on every push. Also, if we push nothing, the adjustment should 5078 // go down by one. 5079 indexAdjustment--; 5080 5081 // We're done with the pack expansion. 5082 continue; 5083 } 5084 5085 // We'll substitute the parameter now without expanding the pack 5086 // expansion. 5087 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5088 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5089 indexAdjustment, 5090 NumExpansions, 5091 /*ExpectParameterPack=*/true); 5092 } else { 5093 NewParm = getDerived().TransformFunctionTypeParam( 5094 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5095 } 5096 5097 if (!NewParm) 5098 return true; 5099 5100 if (ParamInfos) 5101 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5102 OutParamTypes.push_back(NewParm->getType()); 5103 if (PVars) 5104 PVars->push_back(NewParm); 5105 continue; 5106 } 5107 5108 // Deal with the possibility that we don't have a parameter 5109 // declaration for this parameter. 5110 QualType OldType = ParamTypes[i]; 5111 bool IsPackExpansion = false; 5112 Optional<unsigned> NumExpansions; 5113 QualType NewType; 5114 if (const PackExpansionType *Expansion 5115 = dyn_cast<PackExpansionType>(OldType)) { 5116 // We have a function parameter pack that may need to be expanded. 5117 QualType Pattern = Expansion->getPattern(); 5118 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5119 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5120 5121 // Determine whether we should expand the parameter packs. 5122 bool ShouldExpand = false; 5123 bool RetainExpansion = false; 5124 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5125 Unexpanded, 5126 ShouldExpand, 5127 RetainExpansion, 5128 NumExpansions)) { 5129 return true; 5130 } 5131 5132 if (ShouldExpand) { 5133 // Expand the function parameter pack into multiple, separate 5134 // parameters. 5135 for (unsigned I = 0; I != *NumExpansions; ++I) { 5136 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5137 QualType NewType = getDerived().TransformType(Pattern); 5138 if (NewType.isNull()) 5139 return true; 5140 5141 if (NewType->containsUnexpandedParameterPack()) { 5142 NewType = 5143 getSema().getASTContext().getPackExpansionType(NewType, None); 5144 5145 if (NewType.isNull()) 5146 return true; 5147 } 5148 5149 if (ParamInfos) 5150 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5151 OutParamTypes.push_back(NewType); 5152 if (PVars) 5153 PVars->push_back(nullptr); 5154 } 5155 5156 // We're done with the pack expansion. 5157 continue; 5158 } 5159 5160 // If we're supposed to retain a pack expansion, do so by temporarily 5161 // forgetting the partially-substituted parameter pack. 5162 if (RetainExpansion) { 5163 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5164 QualType NewType = getDerived().TransformType(Pattern); 5165 if (NewType.isNull()) 5166 return true; 5167 5168 if (ParamInfos) 5169 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5170 OutParamTypes.push_back(NewType); 5171 if (PVars) 5172 PVars->push_back(nullptr); 5173 } 5174 5175 // We'll substitute the parameter now without expanding the pack 5176 // expansion. 5177 OldType = Expansion->getPattern(); 5178 IsPackExpansion = true; 5179 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5180 NewType = getDerived().TransformType(OldType); 5181 } else { 5182 NewType = getDerived().TransformType(OldType); 5183 } 5184 5185 if (NewType.isNull()) 5186 return true; 5187 5188 if (IsPackExpansion) 5189 NewType = getSema().Context.getPackExpansionType(NewType, 5190 NumExpansions); 5191 5192 if (ParamInfos) 5193 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5194 OutParamTypes.push_back(NewType); 5195 if (PVars) 5196 PVars->push_back(nullptr); 5197 } 5198 5199 #ifndef NDEBUG 5200 if (PVars) { 5201 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5202 if (ParmVarDecl *parm = (*PVars)[i]) 5203 assert(parm->getFunctionScopeIndex() == i); 5204 } 5205 #endif 5206 5207 return false; 5208 } 5209 5210 template<typename Derived> 5211 QualType 5212 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5213 FunctionProtoTypeLoc TL) { 5214 SmallVector<QualType, 4> ExceptionStorage; 5215 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5216 return getDerived().TransformFunctionProtoType( 5217 TLB, TL, nullptr, 0, 5218 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5219 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5220 ExceptionStorage, Changed); 5221 }); 5222 } 5223 5224 template<typename Derived> template<typename Fn> 5225 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5226 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5227 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5228 5229 // Transform the parameters and return type. 5230 // 5231 // We are required to instantiate the params and return type in source order. 5232 // When the function has a trailing return type, we instantiate the 5233 // parameters before the return type, since the return type can then refer 5234 // to the parameters themselves (via decltype, sizeof, etc.). 5235 // 5236 SmallVector<QualType, 4> ParamTypes; 5237 SmallVector<ParmVarDecl*, 4> ParamDecls; 5238 Sema::ExtParameterInfoBuilder ExtParamInfos; 5239 const FunctionProtoType *T = TL.getTypePtr(); 5240 5241 QualType ResultType; 5242 5243 if (T->hasTrailingReturn()) { 5244 if (getDerived().TransformFunctionTypeParams( 5245 TL.getBeginLoc(), TL.getParams(), 5246 TL.getTypePtr()->param_type_begin(), 5247 T->getExtParameterInfosOrNull(), 5248 ParamTypes, &ParamDecls, ExtParamInfos)) 5249 return QualType(); 5250 5251 { 5252 // C++11 [expr.prim.general]p3: 5253 // If a declaration declares a member function or member function 5254 // template of a class X, the expression this is a prvalue of type 5255 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5256 // and the end of the function-definition, member-declarator, or 5257 // declarator. 5258 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5259 5260 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5261 if (ResultType.isNull()) 5262 return QualType(); 5263 } 5264 } 5265 else { 5266 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5267 if (ResultType.isNull()) 5268 return QualType(); 5269 5270 if (getDerived().TransformFunctionTypeParams( 5271 TL.getBeginLoc(), TL.getParams(), 5272 TL.getTypePtr()->param_type_begin(), 5273 T->getExtParameterInfosOrNull(), 5274 ParamTypes, &ParamDecls, ExtParamInfos)) 5275 return QualType(); 5276 } 5277 5278 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5279 5280 bool EPIChanged = false; 5281 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5282 return QualType(); 5283 5284 // Handle extended parameter information. 5285 if (auto NewExtParamInfos = 5286 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5287 if (!EPI.ExtParameterInfos || 5288 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5289 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5290 EPIChanged = true; 5291 } 5292 EPI.ExtParameterInfos = NewExtParamInfos; 5293 } else if (EPI.ExtParameterInfos) { 5294 EPIChanged = true; 5295 EPI.ExtParameterInfos = nullptr; 5296 } 5297 5298 QualType Result = TL.getType(); 5299 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5300 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5301 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5302 if (Result.isNull()) 5303 return QualType(); 5304 } 5305 5306 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5307 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5308 NewTL.setLParenLoc(TL.getLParenLoc()); 5309 NewTL.setRParenLoc(TL.getRParenLoc()); 5310 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5311 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5312 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5313 NewTL.setParam(i, ParamDecls[i]); 5314 5315 return Result; 5316 } 5317 5318 template<typename Derived> 5319 bool TreeTransform<Derived>::TransformExceptionSpec( 5320 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5321 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5322 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5323 5324 // Instantiate a dynamic noexcept expression, if any. 5325 if (isComputedNoexcept(ESI.Type)) { 5326 EnterExpressionEvaluationContext Unevaluated( 5327 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5328 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5329 if (NoexceptExpr.isInvalid()) 5330 return true; 5331 5332 ExceptionSpecificationType EST = ESI.Type; 5333 NoexceptExpr = 5334 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5335 if (NoexceptExpr.isInvalid()) 5336 return true; 5337 5338 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5339 Changed = true; 5340 ESI.NoexceptExpr = NoexceptExpr.get(); 5341 ESI.Type = EST; 5342 } 5343 5344 if (ESI.Type != EST_Dynamic) 5345 return false; 5346 5347 // Instantiate a dynamic exception specification's type. 5348 for (QualType T : ESI.Exceptions) { 5349 if (const PackExpansionType *PackExpansion = 5350 T->getAs<PackExpansionType>()) { 5351 Changed = true; 5352 5353 // We have a pack expansion. Instantiate it. 5354 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5355 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5356 Unexpanded); 5357 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5358 5359 // Determine whether the set of unexpanded parameter packs can and 5360 // should 5361 // be expanded. 5362 bool Expand = false; 5363 bool RetainExpansion = false; 5364 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5365 // FIXME: Track the location of the ellipsis (and track source location 5366 // information for the types in the exception specification in general). 5367 if (getDerived().TryExpandParameterPacks( 5368 Loc, SourceRange(), Unexpanded, Expand, 5369 RetainExpansion, NumExpansions)) 5370 return true; 5371 5372 if (!Expand) { 5373 // We can't expand this pack expansion into separate arguments yet; 5374 // just substitute into the pattern and create a new pack expansion 5375 // type. 5376 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5377 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5378 if (U.isNull()) 5379 return true; 5380 5381 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5382 Exceptions.push_back(U); 5383 continue; 5384 } 5385 5386 // Substitute into the pack expansion pattern for each slice of the 5387 // pack. 5388 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5389 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5390 5391 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5392 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5393 return true; 5394 5395 Exceptions.push_back(U); 5396 } 5397 } else { 5398 QualType U = getDerived().TransformType(T); 5399 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5400 return true; 5401 if (T != U) 5402 Changed = true; 5403 5404 Exceptions.push_back(U); 5405 } 5406 } 5407 5408 ESI.Exceptions = Exceptions; 5409 if (ESI.Exceptions.empty()) 5410 ESI.Type = EST_DynamicNone; 5411 return false; 5412 } 5413 5414 template<typename Derived> 5415 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5416 TypeLocBuilder &TLB, 5417 FunctionNoProtoTypeLoc TL) { 5418 const FunctionNoProtoType *T = TL.getTypePtr(); 5419 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5420 if (ResultType.isNull()) 5421 return QualType(); 5422 5423 QualType Result = TL.getType(); 5424 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5425 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5426 5427 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5428 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5429 NewTL.setLParenLoc(TL.getLParenLoc()); 5430 NewTL.setRParenLoc(TL.getRParenLoc()); 5431 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5432 5433 return Result; 5434 } 5435 5436 template<typename Derived> QualType 5437 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5438 UnresolvedUsingTypeLoc TL) { 5439 const UnresolvedUsingType *T = TL.getTypePtr(); 5440 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5441 if (!D) 5442 return QualType(); 5443 5444 QualType Result = TL.getType(); 5445 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5446 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5447 if (Result.isNull()) 5448 return QualType(); 5449 } 5450 5451 // We might get an arbitrary type spec type back. We should at 5452 // least always get a type spec type, though. 5453 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5454 NewTL.setNameLoc(TL.getNameLoc()); 5455 5456 return Result; 5457 } 5458 5459 template<typename Derived> 5460 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5461 TypedefTypeLoc TL) { 5462 const TypedefType *T = TL.getTypePtr(); 5463 TypedefNameDecl *Typedef 5464 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5465 T->getDecl())); 5466 if (!Typedef) 5467 return QualType(); 5468 5469 QualType Result = TL.getType(); 5470 if (getDerived().AlwaysRebuild() || 5471 Typedef != T->getDecl()) { 5472 Result = getDerived().RebuildTypedefType(Typedef); 5473 if (Result.isNull()) 5474 return QualType(); 5475 } 5476 5477 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5478 NewTL.setNameLoc(TL.getNameLoc()); 5479 5480 return Result; 5481 } 5482 5483 template<typename Derived> 5484 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5485 TypeOfExprTypeLoc TL) { 5486 // typeof expressions are not potentially evaluated contexts 5487 EnterExpressionEvaluationContext Unevaluated( 5488 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5489 Sema::ReuseLambdaContextDecl); 5490 5491 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5492 if (E.isInvalid()) 5493 return QualType(); 5494 5495 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5496 if (E.isInvalid()) 5497 return QualType(); 5498 5499 QualType Result = TL.getType(); 5500 if (getDerived().AlwaysRebuild() || 5501 E.get() != TL.getUnderlyingExpr()) { 5502 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5503 if (Result.isNull()) 5504 return QualType(); 5505 } 5506 else E.get(); 5507 5508 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5509 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5510 NewTL.setLParenLoc(TL.getLParenLoc()); 5511 NewTL.setRParenLoc(TL.getRParenLoc()); 5512 5513 return Result; 5514 } 5515 5516 template<typename Derived> 5517 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5518 TypeOfTypeLoc TL) { 5519 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5520 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5521 if (!New_Under_TI) 5522 return QualType(); 5523 5524 QualType Result = TL.getType(); 5525 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5526 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5527 if (Result.isNull()) 5528 return QualType(); 5529 } 5530 5531 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5532 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5533 NewTL.setLParenLoc(TL.getLParenLoc()); 5534 NewTL.setRParenLoc(TL.getRParenLoc()); 5535 NewTL.setUnderlyingTInfo(New_Under_TI); 5536 5537 return Result; 5538 } 5539 5540 template<typename Derived> 5541 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5542 DecltypeTypeLoc TL) { 5543 const DecltypeType *T = TL.getTypePtr(); 5544 5545 // decltype expressions are not potentially evaluated contexts 5546 EnterExpressionEvaluationContext Unevaluated( 5547 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5548 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5549 5550 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5551 if (E.isInvalid()) 5552 return QualType(); 5553 5554 E = getSema().ActOnDecltypeExpression(E.get()); 5555 if (E.isInvalid()) 5556 return QualType(); 5557 5558 QualType Result = TL.getType(); 5559 if (getDerived().AlwaysRebuild() || 5560 E.get() != T->getUnderlyingExpr()) { 5561 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5562 if (Result.isNull()) 5563 return QualType(); 5564 } 5565 else E.get(); 5566 5567 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5568 NewTL.setNameLoc(TL.getNameLoc()); 5569 5570 return Result; 5571 } 5572 5573 template<typename Derived> 5574 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5575 TypeLocBuilder &TLB, 5576 UnaryTransformTypeLoc TL) { 5577 QualType Result = TL.getType(); 5578 if (Result->isDependentType()) { 5579 const UnaryTransformType *T = TL.getTypePtr(); 5580 QualType NewBase = 5581 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5582 Result = getDerived().RebuildUnaryTransformType(NewBase, 5583 T->getUTTKind(), 5584 TL.getKWLoc()); 5585 if (Result.isNull()) 5586 return QualType(); 5587 } 5588 5589 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5590 NewTL.setKWLoc(TL.getKWLoc()); 5591 NewTL.setParensRange(TL.getParensRange()); 5592 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5593 return Result; 5594 } 5595 5596 template<typename Derived> 5597 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5598 AutoTypeLoc TL) { 5599 const AutoType *T = TL.getTypePtr(); 5600 QualType OldDeduced = T->getDeducedType(); 5601 QualType NewDeduced; 5602 if (!OldDeduced.isNull()) { 5603 NewDeduced = getDerived().TransformType(OldDeduced); 5604 if (NewDeduced.isNull()) 5605 return QualType(); 5606 } 5607 5608 QualType Result = TL.getType(); 5609 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5610 T->isDependentType()) { 5611 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5612 if (Result.isNull()) 5613 return QualType(); 5614 } 5615 5616 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5617 NewTL.setNameLoc(TL.getNameLoc()); 5618 5619 return Result; 5620 } 5621 5622 template<typename Derived> 5623 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5624 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5625 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5626 5627 CXXScopeSpec SS; 5628 TemplateName TemplateName = getDerived().TransformTemplateName( 5629 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5630 if (TemplateName.isNull()) 5631 return QualType(); 5632 5633 QualType OldDeduced = T->getDeducedType(); 5634 QualType NewDeduced; 5635 if (!OldDeduced.isNull()) { 5636 NewDeduced = getDerived().TransformType(OldDeduced); 5637 if (NewDeduced.isNull()) 5638 return QualType(); 5639 } 5640 5641 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5642 TemplateName, NewDeduced); 5643 if (Result.isNull()) 5644 return QualType(); 5645 5646 DeducedTemplateSpecializationTypeLoc NewTL = 5647 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5648 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5649 5650 return Result; 5651 } 5652 5653 template<typename Derived> 5654 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5655 RecordTypeLoc TL) { 5656 const RecordType *T = TL.getTypePtr(); 5657 RecordDecl *Record 5658 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5659 T->getDecl())); 5660 if (!Record) 5661 return QualType(); 5662 5663 QualType Result = TL.getType(); 5664 if (getDerived().AlwaysRebuild() || 5665 Record != T->getDecl()) { 5666 Result = getDerived().RebuildRecordType(Record); 5667 if (Result.isNull()) 5668 return QualType(); 5669 } 5670 5671 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5672 NewTL.setNameLoc(TL.getNameLoc()); 5673 5674 return Result; 5675 } 5676 5677 template<typename Derived> 5678 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5679 EnumTypeLoc TL) { 5680 const EnumType *T = TL.getTypePtr(); 5681 EnumDecl *Enum 5682 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5683 T->getDecl())); 5684 if (!Enum) 5685 return QualType(); 5686 5687 QualType Result = TL.getType(); 5688 if (getDerived().AlwaysRebuild() || 5689 Enum != T->getDecl()) { 5690 Result = getDerived().RebuildEnumType(Enum); 5691 if (Result.isNull()) 5692 return QualType(); 5693 } 5694 5695 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5696 NewTL.setNameLoc(TL.getNameLoc()); 5697 5698 return Result; 5699 } 5700 5701 template<typename Derived> 5702 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5703 TypeLocBuilder &TLB, 5704 InjectedClassNameTypeLoc TL) { 5705 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5706 TL.getTypePtr()->getDecl()); 5707 if (!D) return QualType(); 5708 5709 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5710 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5711 return T; 5712 } 5713 5714 template<typename Derived> 5715 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5716 TypeLocBuilder &TLB, 5717 TemplateTypeParmTypeLoc TL) { 5718 return TransformTypeSpecType(TLB, TL); 5719 } 5720 5721 template<typename Derived> 5722 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5723 TypeLocBuilder &TLB, 5724 SubstTemplateTypeParmTypeLoc TL) { 5725 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5726 5727 // Substitute into the replacement type, which itself might involve something 5728 // that needs to be transformed. This only tends to occur with default 5729 // template arguments of template template parameters. 5730 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5731 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5732 if (Replacement.isNull()) 5733 return QualType(); 5734 5735 // Always canonicalize the replacement type. 5736 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5737 QualType Result 5738 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5739 Replacement); 5740 5741 // Propagate type-source information. 5742 SubstTemplateTypeParmTypeLoc NewTL 5743 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5744 NewTL.setNameLoc(TL.getNameLoc()); 5745 return Result; 5746 5747 } 5748 5749 template<typename Derived> 5750 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5751 TypeLocBuilder &TLB, 5752 SubstTemplateTypeParmPackTypeLoc TL) { 5753 return TransformTypeSpecType(TLB, TL); 5754 } 5755 5756 template<typename Derived> 5757 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5758 TypeLocBuilder &TLB, 5759 TemplateSpecializationTypeLoc TL) { 5760 const TemplateSpecializationType *T = TL.getTypePtr(); 5761 5762 // The nested-name-specifier never matters in a TemplateSpecializationType, 5763 // because we can't have a dependent nested-name-specifier anyway. 5764 CXXScopeSpec SS; 5765 TemplateName Template 5766 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5767 TL.getTemplateNameLoc()); 5768 if (Template.isNull()) 5769 return QualType(); 5770 5771 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5772 } 5773 5774 template<typename Derived> 5775 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5776 AtomicTypeLoc TL) { 5777 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5778 if (ValueType.isNull()) 5779 return QualType(); 5780 5781 QualType Result = TL.getType(); 5782 if (getDerived().AlwaysRebuild() || 5783 ValueType != TL.getValueLoc().getType()) { 5784 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5785 if (Result.isNull()) 5786 return QualType(); 5787 } 5788 5789 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5790 NewTL.setKWLoc(TL.getKWLoc()); 5791 NewTL.setLParenLoc(TL.getLParenLoc()); 5792 NewTL.setRParenLoc(TL.getRParenLoc()); 5793 5794 return Result; 5795 } 5796 5797 template <typename Derived> 5798 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5799 PipeTypeLoc TL) { 5800 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5801 if (ValueType.isNull()) 5802 return QualType(); 5803 5804 QualType Result = TL.getType(); 5805 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5806 const PipeType *PT = Result->getAs<PipeType>(); 5807 bool isReadPipe = PT->isReadOnly(); 5808 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5809 if (Result.isNull()) 5810 return QualType(); 5811 } 5812 5813 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5814 NewTL.setKWLoc(TL.getKWLoc()); 5815 5816 return Result; 5817 } 5818 5819 /// Simple iterator that traverses the template arguments in a 5820 /// container that provides a \c getArgLoc() member function. 5821 /// 5822 /// This iterator is intended to be used with the iterator form of 5823 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5824 template<typename ArgLocContainer> 5825 class TemplateArgumentLocContainerIterator { 5826 ArgLocContainer *Container; 5827 unsigned Index; 5828 5829 public: 5830 typedef TemplateArgumentLoc value_type; 5831 typedef TemplateArgumentLoc reference; 5832 typedef int difference_type; 5833 typedef std::input_iterator_tag iterator_category; 5834 5835 class pointer { 5836 TemplateArgumentLoc Arg; 5837 5838 public: 5839 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5840 5841 const TemplateArgumentLoc *operator->() const { 5842 return &Arg; 5843 } 5844 }; 5845 5846 5847 TemplateArgumentLocContainerIterator() {} 5848 5849 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5850 unsigned Index) 5851 : Container(&Container), Index(Index) { } 5852 5853 TemplateArgumentLocContainerIterator &operator++() { 5854 ++Index; 5855 return *this; 5856 } 5857 5858 TemplateArgumentLocContainerIterator operator++(int) { 5859 TemplateArgumentLocContainerIterator Old(*this); 5860 ++(*this); 5861 return Old; 5862 } 5863 5864 TemplateArgumentLoc operator*() const { 5865 return Container->getArgLoc(Index); 5866 } 5867 5868 pointer operator->() const { 5869 return pointer(Container->getArgLoc(Index)); 5870 } 5871 5872 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5873 const TemplateArgumentLocContainerIterator &Y) { 5874 return X.Container == Y.Container && X.Index == Y.Index; 5875 } 5876 5877 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5878 const TemplateArgumentLocContainerIterator &Y) { 5879 return !(X == Y); 5880 } 5881 }; 5882 5883 5884 template <typename Derived> 5885 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5886 TypeLocBuilder &TLB, 5887 TemplateSpecializationTypeLoc TL, 5888 TemplateName Template) { 5889 TemplateArgumentListInfo NewTemplateArgs; 5890 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5891 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5892 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5893 ArgIterator; 5894 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5895 ArgIterator(TL, TL.getNumArgs()), 5896 NewTemplateArgs)) 5897 return QualType(); 5898 5899 // FIXME: maybe don't rebuild if all the template arguments are the same. 5900 5901 QualType Result = 5902 getDerived().RebuildTemplateSpecializationType(Template, 5903 TL.getTemplateNameLoc(), 5904 NewTemplateArgs); 5905 5906 if (!Result.isNull()) { 5907 // Specializations of template template parameters are represented as 5908 // TemplateSpecializationTypes, and substitution of type alias templates 5909 // within a dependent context can transform them into 5910 // DependentTemplateSpecializationTypes. 5911 if (isa<DependentTemplateSpecializationType>(Result)) { 5912 DependentTemplateSpecializationTypeLoc NewTL 5913 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5914 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5915 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5916 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5917 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5918 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5919 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5920 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5921 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5922 return Result; 5923 } 5924 5925 TemplateSpecializationTypeLoc NewTL 5926 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5927 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5928 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5929 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5930 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5931 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5932 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5933 } 5934 5935 return Result; 5936 } 5937 5938 template <typename Derived> 5939 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5940 TypeLocBuilder &TLB, 5941 DependentTemplateSpecializationTypeLoc TL, 5942 TemplateName Template, 5943 CXXScopeSpec &SS) { 5944 TemplateArgumentListInfo NewTemplateArgs; 5945 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5946 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5947 typedef TemplateArgumentLocContainerIterator< 5948 DependentTemplateSpecializationTypeLoc> ArgIterator; 5949 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5950 ArgIterator(TL, TL.getNumArgs()), 5951 NewTemplateArgs)) 5952 return QualType(); 5953 5954 // FIXME: maybe don't rebuild if all the template arguments are the same. 5955 5956 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5957 QualType Result 5958 = getSema().Context.getDependentTemplateSpecializationType( 5959 TL.getTypePtr()->getKeyword(), 5960 DTN->getQualifier(), 5961 DTN->getIdentifier(), 5962 NewTemplateArgs); 5963 5964 DependentTemplateSpecializationTypeLoc NewTL 5965 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5966 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5967 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5968 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5969 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5970 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5971 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5972 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5973 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5974 return Result; 5975 } 5976 5977 QualType Result 5978 = getDerived().RebuildTemplateSpecializationType(Template, 5979 TL.getTemplateNameLoc(), 5980 NewTemplateArgs); 5981 5982 if (!Result.isNull()) { 5983 /// FIXME: Wrap this in an elaborated-type-specifier? 5984 TemplateSpecializationTypeLoc NewTL 5985 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5986 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5987 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5988 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5989 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5990 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5991 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5992 } 5993 5994 return Result; 5995 } 5996 5997 template<typename Derived> 5998 QualType 5999 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6000 ElaboratedTypeLoc TL) { 6001 const ElaboratedType *T = TL.getTypePtr(); 6002 6003 NestedNameSpecifierLoc QualifierLoc; 6004 // NOTE: the qualifier in an ElaboratedType is optional. 6005 if (TL.getQualifierLoc()) { 6006 QualifierLoc 6007 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6008 if (!QualifierLoc) 6009 return QualType(); 6010 } 6011 6012 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6013 if (NamedT.isNull()) 6014 return QualType(); 6015 6016 // C++0x [dcl.type.elab]p2: 6017 // If the identifier resolves to a typedef-name or the simple-template-id 6018 // resolves to an alias template specialization, the 6019 // elaborated-type-specifier is ill-formed. 6020 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6021 if (const TemplateSpecializationType *TST = 6022 NamedT->getAs<TemplateSpecializationType>()) { 6023 TemplateName Template = TST->getTemplateName(); 6024 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6025 Template.getAsTemplateDecl())) { 6026 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6027 diag::err_tag_reference_non_tag) 6028 << TAT << Sema::NTK_TypeAliasTemplate 6029 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6030 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6031 } 6032 } 6033 } 6034 6035 QualType Result = TL.getType(); 6036 if (getDerived().AlwaysRebuild() || 6037 QualifierLoc != TL.getQualifierLoc() || 6038 NamedT != T->getNamedType()) { 6039 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6040 T->getKeyword(), 6041 QualifierLoc, NamedT); 6042 if (Result.isNull()) 6043 return QualType(); 6044 } 6045 6046 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6047 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6048 NewTL.setQualifierLoc(QualifierLoc); 6049 return Result; 6050 } 6051 6052 template<typename Derived> 6053 QualType TreeTransform<Derived>::TransformAttributedType( 6054 TypeLocBuilder &TLB, 6055 AttributedTypeLoc TL) { 6056 const AttributedType *oldType = TL.getTypePtr(); 6057 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6058 if (modifiedType.isNull()) 6059 return QualType(); 6060 6061 QualType result = TL.getType(); 6062 6063 // FIXME: dependent operand expressions? 6064 if (getDerived().AlwaysRebuild() || 6065 modifiedType != oldType->getModifiedType()) { 6066 // TODO: this is really lame; we should really be rebuilding the 6067 // equivalent type from first principles. 6068 QualType equivalentType 6069 = getDerived().TransformType(oldType->getEquivalentType()); 6070 if (equivalentType.isNull()) 6071 return QualType(); 6072 6073 // Check whether we can add nullability; it is only represented as 6074 // type sugar, and therefore cannot be diagnosed in any other way. 6075 if (auto nullability = oldType->getImmediateNullability()) { 6076 if (!modifiedType->canHaveNullability()) { 6077 SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer) 6078 << DiagNullabilityKind(*nullability, false) << modifiedType; 6079 return QualType(); 6080 } 6081 } 6082 6083 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 6084 modifiedType, 6085 equivalentType); 6086 } 6087 6088 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6089 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 6090 if (TL.hasAttrOperand()) 6091 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 6092 if (TL.hasAttrExprOperand()) 6093 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 6094 else if (TL.hasAttrEnumOperand()) 6095 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 6096 6097 return result; 6098 } 6099 6100 template<typename Derived> 6101 QualType 6102 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6103 ParenTypeLoc TL) { 6104 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6105 if (Inner.isNull()) 6106 return QualType(); 6107 6108 QualType Result = TL.getType(); 6109 if (getDerived().AlwaysRebuild() || 6110 Inner != TL.getInnerLoc().getType()) { 6111 Result = getDerived().RebuildParenType(Inner); 6112 if (Result.isNull()) 6113 return QualType(); 6114 } 6115 6116 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6117 NewTL.setLParenLoc(TL.getLParenLoc()); 6118 NewTL.setRParenLoc(TL.getRParenLoc()); 6119 return Result; 6120 } 6121 6122 template<typename Derived> 6123 QualType TreeTransform<Derived>::TransformDependentNameType( 6124 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6125 return TransformDependentNameType(TLB, TL, false); 6126 } 6127 6128 template<typename Derived> 6129 QualType TreeTransform<Derived>::TransformDependentNameType( 6130 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6131 const DependentNameType *T = TL.getTypePtr(); 6132 6133 NestedNameSpecifierLoc QualifierLoc 6134 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6135 if (!QualifierLoc) 6136 return QualType(); 6137 6138 QualType Result 6139 = getDerived().RebuildDependentNameType(T->getKeyword(), 6140 TL.getElaboratedKeywordLoc(), 6141 QualifierLoc, 6142 T->getIdentifier(), 6143 TL.getNameLoc(), 6144 DeducedTSTContext); 6145 if (Result.isNull()) 6146 return QualType(); 6147 6148 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6149 QualType NamedT = ElabT->getNamedType(); 6150 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6151 6152 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6153 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6154 NewTL.setQualifierLoc(QualifierLoc); 6155 } else { 6156 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6157 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6158 NewTL.setQualifierLoc(QualifierLoc); 6159 NewTL.setNameLoc(TL.getNameLoc()); 6160 } 6161 return Result; 6162 } 6163 6164 template<typename Derived> 6165 QualType TreeTransform<Derived>:: 6166 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6167 DependentTemplateSpecializationTypeLoc TL) { 6168 NestedNameSpecifierLoc QualifierLoc; 6169 if (TL.getQualifierLoc()) { 6170 QualifierLoc 6171 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6172 if (!QualifierLoc) 6173 return QualType(); 6174 } 6175 6176 return getDerived() 6177 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6178 } 6179 6180 template<typename Derived> 6181 QualType TreeTransform<Derived>:: 6182 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6183 DependentTemplateSpecializationTypeLoc TL, 6184 NestedNameSpecifierLoc QualifierLoc) { 6185 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6186 6187 TemplateArgumentListInfo NewTemplateArgs; 6188 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6189 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6190 6191 typedef TemplateArgumentLocContainerIterator< 6192 DependentTemplateSpecializationTypeLoc> ArgIterator; 6193 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6194 ArgIterator(TL, TL.getNumArgs()), 6195 NewTemplateArgs)) 6196 return QualType(); 6197 6198 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6199 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6200 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6201 /*AllowInjectedClassName*/ false); 6202 if (Result.isNull()) 6203 return QualType(); 6204 6205 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6206 QualType NamedT = ElabT->getNamedType(); 6207 6208 // Copy information relevant to the template specialization. 6209 TemplateSpecializationTypeLoc NamedTL 6210 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6211 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6212 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6213 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6214 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6215 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6216 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6217 6218 // Copy information relevant to the elaborated type. 6219 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6220 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6221 NewTL.setQualifierLoc(QualifierLoc); 6222 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6223 DependentTemplateSpecializationTypeLoc SpecTL 6224 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6225 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6226 SpecTL.setQualifierLoc(QualifierLoc); 6227 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6228 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6229 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6230 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6231 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6232 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6233 } else { 6234 TemplateSpecializationTypeLoc SpecTL 6235 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6236 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6237 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6238 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6239 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6240 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6241 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6242 } 6243 return Result; 6244 } 6245 6246 template<typename Derived> 6247 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6248 PackExpansionTypeLoc TL) { 6249 QualType Pattern 6250 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6251 if (Pattern.isNull()) 6252 return QualType(); 6253 6254 QualType Result = TL.getType(); 6255 if (getDerived().AlwaysRebuild() || 6256 Pattern != TL.getPatternLoc().getType()) { 6257 Result = getDerived().RebuildPackExpansionType(Pattern, 6258 TL.getPatternLoc().getSourceRange(), 6259 TL.getEllipsisLoc(), 6260 TL.getTypePtr()->getNumExpansions()); 6261 if (Result.isNull()) 6262 return QualType(); 6263 } 6264 6265 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6266 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6267 return Result; 6268 } 6269 6270 template<typename Derived> 6271 QualType 6272 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6273 ObjCInterfaceTypeLoc TL) { 6274 // ObjCInterfaceType is never dependent. 6275 TLB.pushFullCopy(TL); 6276 return TL.getType(); 6277 } 6278 6279 template<typename Derived> 6280 QualType 6281 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6282 ObjCTypeParamTypeLoc TL) { 6283 const ObjCTypeParamType *T = TL.getTypePtr(); 6284 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6285 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6286 if (!OTP) 6287 return QualType(); 6288 6289 QualType Result = TL.getType(); 6290 if (getDerived().AlwaysRebuild() || 6291 OTP != T->getDecl()) { 6292 Result = getDerived().RebuildObjCTypeParamType(OTP, 6293 TL.getProtocolLAngleLoc(), 6294 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6295 TL.getNumProtocols()), 6296 TL.getProtocolLocs(), 6297 TL.getProtocolRAngleLoc()); 6298 if (Result.isNull()) 6299 return QualType(); 6300 } 6301 6302 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6303 if (TL.getNumProtocols()) { 6304 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6305 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6306 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6307 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6308 } 6309 return Result; 6310 } 6311 6312 template<typename Derived> 6313 QualType 6314 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6315 ObjCObjectTypeLoc TL) { 6316 // Transform base type. 6317 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6318 if (BaseType.isNull()) 6319 return QualType(); 6320 6321 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6322 6323 // Transform type arguments. 6324 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6325 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6326 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6327 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6328 QualType TypeArg = TypeArgInfo->getType(); 6329 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6330 AnyChanged = true; 6331 6332 // We have a pack expansion. Instantiate it. 6333 const auto *PackExpansion = PackExpansionLoc.getType() 6334 ->castAs<PackExpansionType>(); 6335 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6336 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6337 Unexpanded); 6338 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6339 6340 // Determine whether the set of unexpanded parameter packs can 6341 // and should be expanded. 6342 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6343 bool Expand = false; 6344 bool RetainExpansion = false; 6345 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6346 if (getDerived().TryExpandParameterPacks( 6347 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6348 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6349 return QualType(); 6350 6351 if (!Expand) { 6352 // We can't expand this pack expansion into separate arguments yet; 6353 // just substitute into the pattern and create a new pack expansion 6354 // type. 6355 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6356 6357 TypeLocBuilder TypeArgBuilder; 6358 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6359 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6360 PatternLoc); 6361 if (NewPatternType.isNull()) 6362 return QualType(); 6363 6364 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6365 NewPatternType, NumExpansions); 6366 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6367 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6368 NewTypeArgInfos.push_back( 6369 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6370 continue; 6371 } 6372 6373 // Substitute into the pack expansion pattern for each slice of the 6374 // pack. 6375 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6376 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6377 6378 TypeLocBuilder TypeArgBuilder; 6379 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6380 6381 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6382 PatternLoc); 6383 if (NewTypeArg.isNull()) 6384 return QualType(); 6385 6386 NewTypeArgInfos.push_back( 6387 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6388 } 6389 6390 continue; 6391 } 6392 6393 TypeLocBuilder TypeArgBuilder; 6394 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6395 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6396 if (NewTypeArg.isNull()) 6397 return QualType(); 6398 6399 // If nothing changed, just keep the old TypeSourceInfo. 6400 if (NewTypeArg == TypeArg) { 6401 NewTypeArgInfos.push_back(TypeArgInfo); 6402 continue; 6403 } 6404 6405 NewTypeArgInfos.push_back( 6406 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6407 AnyChanged = true; 6408 } 6409 6410 QualType Result = TL.getType(); 6411 if (getDerived().AlwaysRebuild() || AnyChanged) { 6412 // Rebuild the type. 6413 Result = getDerived().RebuildObjCObjectType( 6414 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6415 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6416 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6417 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6418 6419 if (Result.isNull()) 6420 return QualType(); 6421 } 6422 6423 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6424 NewT.setHasBaseTypeAsWritten(true); 6425 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6426 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6427 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6428 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6429 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6430 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6431 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6432 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6433 return Result; 6434 } 6435 6436 template<typename Derived> 6437 QualType 6438 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6439 ObjCObjectPointerTypeLoc TL) { 6440 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6441 if (PointeeType.isNull()) 6442 return QualType(); 6443 6444 QualType Result = TL.getType(); 6445 if (getDerived().AlwaysRebuild() || 6446 PointeeType != TL.getPointeeLoc().getType()) { 6447 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6448 TL.getStarLoc()); 6449 if (Result.isNull()) 6450 return QualType(); 6451 } 6452 6453 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6454 NewT.setStarLoc(TL.getStarLoc()); 6455 return Result; 6456 } 6457 6458 //===----------------------------------------------------------------------===// 6459 // Statement transformation 6460 //===----------------------------------------------------------------------===// 6461 template<typename Derived> 6462 StmtResult 6463 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6464 return S; 6465 } 6466 6467 template<typename Derived> 6468 StmtResult 6469 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6470 return getDerived().TransformCompoundStmt(S, false); 6471 } 6472 6473 template<typename Derived> 6474 StmtResult 6475 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6476 bool IsStmtExpr) { 6477 Sema::CompoundScopeRAII CompoundScope(getSema()); 6478 6479 bool SubStmtInvalid = false; 6480 bool SubStmtChanged = false; 6481 SmallVector<Stmt*, 8> Statements; 6482 for (auto *B : S->body()) { 6483 StmtResult Result = getDerived().TransformStmt(B); 6484 if (Result.isInvalid()) { 6485 // Immediately fail if this was a DeclStmt, since it's very 6486 // likely that this will cause problems for future statements. 6487 if (isa<DeclStmt>(B)) 6488 return StmtError(); 6489 6490 // Otherwise, just keep processing substatements and fail later. 6491 SubStmtInvalid = true; 6492 continue; 6493 } 6494 6495 SubStmtChanged = SubStmtChanged || Result.get() != B; 6496 Statements.push_back(Result.getAs<Stmt>()); 6497 } 6498 6499 if (SubStmtInvalid) 6500 return StmtError(); 6501 6502 if (!getDerived().AlwaysRebuild() && 6503 !SubStmtChanged) 6504 return S; 6505 6506 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6507 Statements, 6508 S->getRBracLoc(), 6509 IsStmtExpr); 6510 } 6511 6512 template<typename Derived> 6513 StmtResult 6514 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6515 ExprResult LHS, RHS; 6516 { 6517 EnterExpressionEvaluationContext Unevaluated( 6518 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6519 6520 // Transform the left-hand case value. 6521 LHS = getDerived().TransformExpr(S->getLHS()); 6522 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6523 if (LHS.isInvalid()) 6524 return StmtError(); 6525 6526 // Transform the right-hand case value (for the GNU case-range extension). 6527 RHS = getDerived().TransformExpr(S->getRHS()); 6528 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6529 if (RHS.isInvalid()) 6530 return StmtError(); 6531 } 6532 6533 // Build the case statement. 6534 // Case statements are always rebuilt so that they will attached to their 6535 // transformed switch statement. 6536 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6537 LHS.get(), 6538 S->getEllipsisLoc(), 6539 RHS.get(), 6540 S->getColonLoc()); 6541 if (Case.isInvalid()) 6542 return StmtError(); 6543 6544 // Transform the statement following the case 6545 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6546 if (SubStmt.isInvalid()) 6547 return StmtError(); 6548 6549 // Attach the body to the case statement 6550 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6551 } 6552 6553 template<typename Derived> 6554 StmtResult 6555 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6556 // Transform the statement following the default case 6557 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6558 if (SubStmt.isInvalid()) 6559 return StmtError(); 6560 6561 // Default statements are always rebuilt 6562 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6563 SubStmt.get()); 6564 } 6565 6566 template<typename Derived> 6567 StmtResult 6568 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6569 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6570 if (SubStmt.isInvalid()) 6571 return StmtError(); 6572 6573 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6574 S->getDecl()); 6575 if (!LD) 6576 return StmtError(); 6577 6578 6579 // FIXME: Pass the real colon location in. 6580 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6581 cast<LabelDecl>(LD), SourceLocation(), 6582 SubStmt.get()); 6583 } 6584 6585 template <typename Derived> 6586 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6587 if (!R) 6588 return R; 6589 6590 switch (R->getKind()) { 6591 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6592 #define ATTR(X) 6593 #define PRAGMA_SPELLING_ATTR(X) \ 6594 case attr::X: \ 6595 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6596 #include "clang/Basic/AttrList.inc" 6597 default: 6598 return R; 6599 } 6600 } 6601 6602 template <typename Derived> 6603 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6604 bool AttrsChanged = false; 6605 SmallVector<const Attr *, 1> Attrs; 6606 6607 // Visit attributes and keep track if any are transformed. 6608 for (const auto *I : S->getAttrs()) { 6609 const Attr *R = getDerived().TransformAttr(I); 6610 AttrsChanged |= (I != R); 6611 Attrs.push_back(R); 6612 } 6613 6614 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6615 if (SubStmt.isInvalid()) 6616 return StmtError(); 6617 6618 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6619 return S; 6620 6621 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6622 SubStmt.get()); 6623 } 6624 6625 template<typename Derived> 6626 StmtResult 6627 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6628 // Transform the initialization statement 6629 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6630 if (Init.isInvalid()) 6631 return StmtError(); 6632 6633 // Transform the condition 6634 Sema::ConditionResult Cond = getDerived().TransformCondition( 6635 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6636 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6637 : Sema::ConditionKind::Boolean); 6638 if (Cond.isInvalid()) 6639 return StmtError(); 6640 6641 // If this is a constexpr if, determine which arm we should instantiate. 6642 llvm::Optional<bool> ConstexprConditionValue; 6643 if (S->isConstexpr()) 6644 ConstexprConditionValue = Cond.getKnownValue(); 6645 6646 // Transform the "then" branch. 6647 StmtResult Then; 6648 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6649 Then = getDerived().TransformStmt(S->getThen()); 6650 if (Then.isInvalid()) 6651 return StmtError(); 6652 } else { 6653 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6654 } 6655 6656 // Transform the "else" branch. 6657 StmtResult Else; 6658 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6659 Else = getDerived().TransformStmt(S->getElse()); 6660 if (Else.isInvalid()) 6661 return StmtError(); 6662 } 6663 6664 if (!getDerived().AlwaysRebuild() && 6665 Init.get() == S->getInit() && 6666 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6667 Then.get() == S->getThen() && 6668 Else.get() == S->getElse()) 6669 return S; 6670 6671 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6672 Init.get(), Then.get(), S->getElseLoc(), 6673 Else.get()); 6674 } 6675 6676 template<typename Derived> 6677 StmtResult 6678 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6679 // Transform the initialization statement 6680 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6681 if (Init.isInvalid()) 6682 return StmtError(); 6683 6684 // Transform the condition. 6685 Sema::ConditionResult Cond = getDerived().TransformCondition( 6686 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6687 Sema::ConditionKind::Switch); 6688 if (Cond.isInvalid()) 6689 return StmtError(); 6690 6691 // Rebuild the switch statement. 6692 StmtResult Switch 6693 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6694 if (Switch.isInvalid()) 6695 return StmtError(); 6696 6697 // Transform the body of the switch statement. 6698 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6699 if (Body.isInvalid()) 6700 return StmtError(); 6701 6702 // Complete the switch statement. 6703 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6704 Body.get()); 6705 } 6706 6707 template<typename Derived> 6708 StmtResult 6709 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6710 // Transform the condition 6711 Sema::ConditionResult Cond = getDerived().TransformCondition( 6712 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6713 Sema::ConditionKind::Boolean); 6714 if (Cond.isInvalid()) 6715 return StmtError(); 6716 6717 // Transform the body 6718 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6719 if (Body.isInvalid()) 6720 return StmtError(); 6721 6722 if (!getDerived().AlwaysRebuild() && 6723 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6724 Body.get() == S->getBody()) 6725 return Owned(S); 6726 6727 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6728 } 6729 6730 template<typename Derived> 6731 StmtResult 6732 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6733 // Transform the body 6734 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6735 if (Body.isInvalid()) 6736 return StmtError(); 6737 6738 // Transform the condition 6739 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6740 if (Cond.isInvalid()) 6741 return StmtError(); 6742 6743 if (!getDerived().AlwaysRebuild() && 6744 Cond.get() == S->getCond() && 6745 Body.get() == S->getBody()) 6746 return S; 6747 6748 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6749 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6750 S->getRParenLoc()); 6751 } 6752 6753 template<typename Derived> 6754 StmtResult 6755 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6756 // Transform the initialization statement 6757 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6758 if (Init.isInvalid()) 6759 return StmtError(); 6760 6761 // In OpenMP loop region loop control variable must be captured and be 6762 // private. Perform analysis of first part (if any). 6763 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6764 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6765 6766 // Transform the condition 6767 Sema::ConditionResult Cond = getDerived().TransformCondition( 6768 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6769 Sema::ConditionKind::Boolean); 6770 if (Cond.isInvalid()) 6771 return StmtError(); 6772 6773 // Transform the increment 6774 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6775 if (Inc.isInvalid()) 6776 return StmtError(); 6777 6778 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6779 if (S->getInc() && !FullInc.get()) 6780 return StmtError(); 6781 6782 // Transform the body 6783 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6784 if (Body.isInvalid()) 6785 return StmtError(); 6786 6787 if (!getDerived().AlwaysRebuild() && 6788 Init.get() == S->getInit() && 6789 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6790 Inc.get() == S->getInc() && 6791 Body.get() == S->getBody()) 6792 return S; 6793 6794 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6795 Init.get(), Cond, FullInc, 6796 S->getRParenLoc(), Body.get()); 6797 } 6798 6799 template<typename Derived> 6800 StmtResult 6801 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6802 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6803 S->getLabel()); 6804 if (!LD) 6805 return StmtError(); 6806 6807 // Goto statements must always be rebuilt, to resolve the label. 6808 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6809 cast<LabelDecl>(LD)); 6810 } 6811 6812 template<typename Derived> 6813 StmtResult 6814 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6815 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6816 if (Target.isInvalid()) 6817 return StmtError(); 6818 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6819 6820 if (!getDerived().AlwaysRebuild() && 6821 Target.get() == S->getTarget()) 6822 return S; 6823 6824 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6825 Target.get()); 6826 } 6827 6828 template<typename Derived> 6829 StmtResult 6830 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6831 return S; 6832 } 6833 6834 template<typename Derived> 6835 StmtResult 6836 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6837 return S; 6838 } 6839 6840 template<typename Derived> 6841 StmtResult 6842 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6843 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6844 /*NotCopyInit*/false); 6845 if (Result.isInvalid()) 6846 return StmtError(); 6847 6848 // FIXME: We always rebuild the return statement because there is no way 6849 // to tell whether the return type of the function has changed. 6850 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6851 } 6852 6853 template<typename Derived> 6854 StmtResult 6855 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6856 bool DeclChanged = false; 6857 SmallVector<Decl *, 4> Decls; 6858 for (auto *D : S->decls()) { 6859 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6860 if (!Transformed) 6861 return StmtError(); 6862 6863 if (Transformed != D) 6864 DeclChanged = true; 6865 6866 Decls.push_back(Transformed); 6867 } 6868 6869 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6870 return S; 6871 6872 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6873 } 6874 6875 template<typename Derived> 6876 StmtResult 6877 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6878 6879 SmallVector<Expr*, 8> Constraints; 6880 SmallVector<Expr*, 8> Exprs; 6881 SmallVector<IdentifierInfo *, 4> Names; 6882 6883 ExprResult AsmString; 6884 SmallVector<Expr*, 8> Clobbers; 6885 6886 bool ExprsChanged = false; 6887 6888 // Go through the outputs. 6889 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6890 Names.push_back(S->getOutputIdentifier(I)); 6891 6892 // No need to transform the constraint literal. 6893 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6894 6895 // Transform the output expr. 6896 Expr *OutputExpr = S->getOutputExpr(I); 6897 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6898 if (Result.isInvalid()) 6899 return StmtError(); 6900 6901 ExprsChanged |= Result.get() != OutputExpr; 6902 6903 Exprs.push_back(Result.get()); 6904 } 6905 6906 // Go through the inputs. 6907 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6908 Names.push_back(S->getInputIdentifier(I)); 6909 6910 // No need to transform the constraint literal. 6911 Constraints.push_back(S->getInputConstraintLiteral(I)); 6912 6913 // Transform the input expr. 6914 Expr *InputExpr = S->getInputExpr(I); 6915 ExprResult Result = getDerived().TransformExpr(InputExpr); 6916 if (Result.isInvalid()) 6917 return StmtError(); 6918 6919 ExprsChanged |= Result.get() != InputExpr; 6920 6921 Exprs.push_back(Result.get()); 6922 } 6923 6924 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6925 return S; 6926 6927 // Go through the clobbers. 6928 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6929 Clobbers.push_back(S->getClobberStringLiteral(I)); 6930 6931 // No need to transform the asm string literal. 6932 AsmString = S->getAsmString(); 6933 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6934 S->isVolatile(), S->getNumOutputs(), 6935 S->getNumInputs(), Names.data(), 6936 Constraints, Exprs, AsmString.get(), 6937 Clobbers, S->getRParenLoc()); 6938 } 6939 6940 template<typename Derived> 6941 StmtResult 6942 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6943 ArrayRef<Token> AsmToks = 6944 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6945 6946 bool HadError = false, HadChange = false; 6947 6948 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6949 SmallVector<Expr*, 8> TransformedExprs; 6950 TransformedExprs.reserve(SrcExprs.size()); 6951 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6952 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6953 if (!Result.isUsable()) { 6954 HadError = true; 6955 } else { 6956 HadChange |= (Result.get() != SrcExprs[i]); 6957 TransformedExprs.push_back(Result.get()); 6958 } 6959 } 6960 6961 if (HadError) return StmtError(); 6962 if (!HadChange && !getDerived().AlwaysRebuild()) 6963 return Owned(S); 6964 6965 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6966 AsmToks, S->getAsmString(), 6967 S->getNumOutputs(), S->getNumInputs(), 6968 S->getAllConstraints(), S->getClobbers(), 6969 TransformedExprs, S->getEndLoc()); 6970 } 6971 6972 // C++ Coroutines TS 6973 6974 template<typename Derived> 6975 StmtResult 6976 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6977 auto *ScopeInfo = SemaRef.getCurFunction(); 6978 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 6979 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 6980 ScopeInfo->NeedsCoroutineSuspends && 6981 ScopeInfo->CoroutineSuspends.first == nullptr && 6982 ScopeInfo->CoroutineSuspends.second == nullptr && 6983 "expected clean scope info"); 6984 6985 // Set that we have (possibly-invalid) suspend points before we do anything 6986 // that may fail. 6987 ScopeInfo->setNeedsCoroutineSuspends(false); 6988 6989 // The new CoroutinePromise object needs to be built and put into the current 6990 // FunctionScopeInfo before any transformations or rebuilding occurs. 6991 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 6992 return StmtError(); 6993 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 6994 if (!Promise) 6995 return StmtError(); 6996 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 6997 ScopeInfo->CoroutinePromise = Promise; 6998 6999 // Transform the implicit coroutine statements we built during the initial 7000 // parse. 7001 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7002 if (InitSuspend.isInvalid()) 7003 return StmtError(); 7004 StmtResult FinalSuspend = 7005 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7006 if (FinalSuspend.isInvalid()) 7007 return StmtError(); 7008 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7009 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7010 7011 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7012 if (BodyRes.isInvalid()) 7013 return StmtError(); 7014 7015 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7016 if (Builder.isInvalid()) 7017 return StmtError(); 7018 7019 Expr *ReturnObject = S->getReturnValueInit(); 7020 assert(ReturnObject && "the return object is expected to be valid"); 7021 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7022 /*NoCopyInit*/ false); 7023 if (Res.isInvalid()) 7024 return StmtError(); 7025 Builder.ReturnValue = Res.get(); 7026 7027 if (S->hasDependentPromiseType()) { 7028 assert(!Promise->getType()->isDependentType() && 7029 "the promise type must no longer be dependent"); 7030 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7031 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7032 "these nodes should not have been built yet"); 7033 if (!Builder.buildDependentStatements()) 7034 return StmtError(); 7035 } else { 7036 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7037 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7038 if (Res.isInvalid()) 7039 return StmtError(); 7040 Builder.OnFallthrough = Res.get(); 7041 } 7042 7043 if (auto *OnException = S->getExceptionHandler()) { 7044 StmtResult Res = getDerived().TransformStmt(OnException); 7045 if (Res.isInvalid()) 7046 return StmtError(); 7047 Builder.OnException = Res.get(); 7048 } 7049 7050 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7051 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7052 if (Res.isInvalid()) 7053 return StmtError(); 7054 Builder.ReturnStmtOnAllocFailure = Res.get(); 7055 } 7056 7057 // Transform any additional statements we may have already built 7058 assert(S->getAllocate() && S->getDeallocate() && 7059 "allocation and deallocation calls must already be built"); 7060 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7061 if (AllocRes.isInvalid()) 7062 return StmtError(); 7063 Builder.Allocate = AllocRes.get(); 7064 7065 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7066 if (DeallocRes.isInvalid()) 7067 return StmtError(); 7068 Builder.Deallocate = DeallocRes.get(); 7069 7070 assert(S->getResultDecl() && "ResultDecl must already be built"); 7071 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7072 if (ResultDecl.isInvalid()) 7073 return StmtError(); 7074 Builder.ResultDecl = ResultDecl.get(); 7075 7076 if (auto *ReturnStmt = S->getReturnStmt()) { 7077 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7078 if (Res.isInvalid()) 7079 return StmtError(); 7080 Builder.ReturnStmt = Res.get(); 7081 } 7082 } 7083 7084 return getDerived().RebuildCoroutineBodyStmt(Builder); 7085 } 7086 7087 template<typename Derived> 7088 StmtResult 7089 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7090 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7091 /*NotCopyInit*/false); 7092 if (Result.isInvalid()) 7093 return StmtError(); 7094 7095 // Always rebuild; we don't know if this needs to be injected into a new 7096 // context or if the promise type has changed. 7097 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7098 S->isImplicit()); 7099 } 7100 7101 template<typename Derived> 7102 ExprResult 7103 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7104 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7105 /*NotCopyInit*/false); 7106 if (Result.isInvalid()) 7107 return ExprError(); 7108 7109 // Always rebuild; we don't know if this needs to be injected into a new 7110 // context or if the promise type has changed. 7111 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7112 E->isImplicit()); 7113 } 7114 7115 template <typename Derived> 7116 ExprResult 7117 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7118 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7119 /*NotCopyInit*/ false); 7120 if (OperandResult.isInvalid()) 7121 return ExprError(); 7122 7123 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7124 E->getOperatorCoawaitLookup()); 7125 7126 if (LookupResult.isInvalid()) 7127 return ExprError(); 7128 7129 // Always rebuild; we don't know if this needs to be injected into a new 7130 // context or if the promise type has changed. 7131 return getDerived().RebuildDependentCoawaitExpr( 7132 E->getKeywordLoc(), OperandResult.get(), 7133 cast<UnresolvedLookupExpr>(LookupResult.get())); 7134 } 7135 7136 template<typename Derived> 7137 ExprResult 7138 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7139 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7140 /*NotCopyInit*/false); 7141 if (Result.isInvalid()) 7142 return ExprError(); 7143 7144 // Always rebuild; we don't know if this needs to be injected into a new 7145 // context or if the promise type has changed. 7146 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7147 } 7148 7149 // Objective-C Statements. 7150 7151 template<typename Derived> 7152 StmtResult 7153 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7154 // Transform the body of the @try. 7155 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7156 if (TryBody.isInvalid()) 7157 return StmtError(); 7158 7159 // Transform the @catch statements (if present). 7160 bool AnyCatchChanged = false; 7161 SmallVector<Stmt*, 8> CatchStmts; 7162 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7163 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7164 if (Catch.isInvalid()) 7165 return StmtError(); 7166 if (Catch.get() != S->getCatchStmt(I)) 7167 AnyCatchChanged = true; 7168 CatchStmts.push_back(Catch.get()); 7169 } 7170 7171 // Transform the @finally statement (if present). 7172 StmtResult Finally; 7173 if (S->getFinallyStmt()) { 7174 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7175 if (Finally.isInvalid()) 7176 return StmtError(); 7177 } 7178 7179 // If nothing changed, just retain this statement. 7180 if (!getDerived().AlwaysRebuild() && 7181 TryBody.get() == S->getTryBody() && 7182 !AnyCatchChanged && 7183 Finally.get() == S->getFinallyStmt()) 7184 return S; 7185 7186 // Build a new statement. 7187 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7188 CatchStmts, Finally.get()); 7189 } 7190 7191 template<typename Derived> 7192 StmtResult 7193 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7194 // Transform the @catch parameter, if there is one. 7195 VarDecl *Var = nullptr; 7196 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7197 TypeSourceInfo *TSInfo = nullptr; 7198 if (FromVar->getTypeSourceInfo()) { 7199 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7200 if (!TSInfo) 7201 return StmtError(); 7202 } 7203 7204 QualType T; 7205 if (TSInfo) 7206 T = TSInfo->getType(); 7207 else { 7208 T = getDerived().TransformType(FromVar->getType()); 7209 if (T.isNull()) 7210 return StmtError(); 7211 } 7212 7213 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7214 if (!Var) 7215 return StmtError(); 7216 } 7217 7218 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7219 if (Body.isInvalid()) 7220 return StmtError(); 7221 7222 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7223 S->getRParenLoc(), 7224 Var, Body.get()); 7225 } 7226 7227 template<typename Derived> 7228 StmtResult 7229 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7230 // Transform the body. 7231 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7232 if (Body.isInvalid()) 7233 return StmtError(); 7234 7235 // If nothing changed, just retain this statement. 7236 if (!getDerived().AlwaysRebuild() && 7237 Body.get() == S->getFinallyBody()) 7238 return S; 7239 7240 // Build a new statement. 7241 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7242 Body.get()); 7243 } 7244 7245 template<typename Derived> 7246 StmtResult 7247 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7248 ExprResult Operand; 7249 if (S->getThrowExpr()) { 7250 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7251 if (Operand.isInvalid()) 7252 return StmtError(); 7253 } 7254 7255 if (!getDerived().AlwaysRebuild() && 7256 Operand.get() == S->getThrowExpr()) 7257 return S; 7258 7259 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7265 ObjCAtSynchronizedStmt *S) { 7266 // Transform the object we are locking. 7267 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7268 if (Object.isInvalid()) 7269 return StmtError(); 7270 Object = 7271 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7272 Object.get()); 7273 if (Object.isInvalid()) 7274 return StmtError(); 7275 7276 // Transform the body. 7277 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7278 if (Body.isInvalid()) 7279 return StmtError(); 7280 7281 // If nothing change, just retain the current statement. 7282 if (!getDerived().AlwaysRebuild() && 7283 Object.get() == S->getSynchExpr() && 7284 Body.get() == S->getSynchBody()) 7285 return S; 7286 7287 // Build a new statement. 7288 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7289 Object.get(), Body.get()); 7290 } 7291 7292 template<typename Derived> 7293 StmtResult 7294 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7295 ObjCAutoreleasePoolStmt *S) { 7296 // Transform the body. 7297 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7298 if (Body.isInvalid()) 7299 return StmtError(); 7300 7301 // If nothing changed, just retain this statement. 7302 if (!getDerived().AlwaysRebuild() && 7303 Body.get() == S->getSubStmt()) 7304 return S; 7305 7306 // Build a new statement. 7307 return getDerived().RebuildObjCAutoreleasePoolStmt( 7308 S->getAtLoc(), Body.get()); 7309 } 7310 7311 template<typename Derived> 7312 StmtResult 7313 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7314 ObjCForCollectionStmt *S) { 7315 // Transform the element statement. 7316 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7317 if (Element.isInvalid()) 7318 return StmtError(); 7319 7320 // Transform the collection expression. 7321 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7322 if (Collection.isInvalid()) 7323 return StmtError(); 7324 7325 // Transform the body. 7326 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7327 if (Body.isInvalid()) 7328 return StmtError(); 7329 7330 // If nothing changed, just retain this statement. 7331 if (!getDerived().AlwaysRebuild() && 7332 Element.get() == S->getElement() && 7333 Collection.get() == S->getCollection() && 7334 Body.get() == S->getBody()) 7335 return S; 7336 7337 // Build a new statement. 7338 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7339 Element.get(), 7340 Collection.get(), 7341 S->getRParenLoc(), 7342 Body.get()); 7343 } 7344 7345 template <typename Derived> 7346 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7347 // Transform the exception declaration, if any. 7348 VarDecl *Var = nullptr; 7349 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7350 TypeSourceInfo *T = 7351 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7352 if (!T) 7353 return StmtError(); 7354 7355 Var = getDerived().RebuildExceptionDecl( 7356 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7357 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7358 if (!Var || Var->isInvalidDecl()) 7359 return StmtError(); 7360 } 7361 7362 // Transform the actual exception handler. 7363 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7364 if (Handler.isInvalid()) 7365 return StmtError(); 7366 7367 if (!getDerived().AlwaysRebuild() && !Var && 7368 Handler.get() == S->getHandlerBlock()) 7369 return S; 7370 7371 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7372 } 7373 7374 template <typename Derived> 7375 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7376 // Transform the try block itself. 7377 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7378 if (TryBlock.isInvalid()) 7379 return StmtError(); 7380 7381 // Transform the handlers. 7382 bool HandlerChanged = false; 7383 SmallVector<Stmt *, 8> Handlers; 7384 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7385 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7386 if (Handler.isInvalid()) 7387 return StmtError(); 7388 7389 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7390 Handlers.push_back(Handler.getAs<Stmt>()); 7391 } 7392 7393 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7394 !HandlerChanged) 7395 return S; 7396 7397 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7398 Handlers); 7399 } 7400 7401 template<typename Derived> 7402 StmtResult 7403 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7404 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7405 if (Range.isInvalid()) 7406 return StmtError(); 7407 7408 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7409 if (Begin.isInvalid()) 7410 return StmtError(); 7411 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7412 if (End.isInvalid()) 7413 return StmtError(); 7414 7415 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7416 if (Cond.isInvalid()) 7417 return StmtError(); 7418 if (Cond.get()) 7419 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7420 if (Cond.isInvalid()) 7421 return StmtError(); 7422 if (Cond.get()) 7423 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7424 7425 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7426 if (Inc.isInvalid()) 7427 return StmtError(); 7428 if (Inc.get()) 7429 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7430 7431 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7432 if (LoopVar.isInvalid()) 7433 return StmtError(); 7434 7435 StmtResult NewStmt = S; 7436 if (getDerived().AlwaysRebuild() || 7437 Range.get() != S->getRangeStmt() || 7438 Begin.get() != S->getBeginStmt() || 7439 End.get() != S->getEndStmt() || 7440 Cond.get() != S->getCond() || 7441 Inc.get() != S->getInc() || 7442 LoopVar.get() != S->getLoopVarStmt()) { 7443 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7444 S->getCoawaitLoc(), 7445 S->getColonLoc(), Range.get(), 7446 Begin.get(), End.get(), 7447 Cond.get(), 7448 Inc.get(), LoopVar.get(), 7449 S->getRParenLoc()); 7450 if (NewStmt.isInvalid()) 7451 return StmtError(); 7452 } 7453 7454 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7455 if (Body.isInvalid()) 7456 return StmtError(); 7457 7458 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7459 // it now so we have a new statement to attach the body to. 7460 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7461 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7462 S->getCoawaitLoc(), 7463 S->getColonLoc(), Range.get(), 7464 Begin.get(), End.get(), 7465 Cond.get(), 7466 Inc.get(), LoopVar.get(), 7467 S->getRParenLoc()); 7468 if (NewStmt.isInvalid()) 7469 return StmtError(); 7470 } 7471 7472 if (NewStmt.get() == S) 7473 return S; 7474 7475 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7476 } 7477 7478 template<typename Derived> 7479 StmtResult 7480 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7481 MSDependentExistsStmt *S) { 7482 // Transform the nested-name-specifier, if any. 7483 NestedNameSpecifierLoc QualifierLoc; 7484 if (S->getQualifierLoc()) { 7485 QualifierLoc 7486 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7487 if (!QualifierLoc) 7488 return StmtError(); 7489 } 7490 7491 // Transform the declaration name. 7492 DeclarationNameInfo NameInfo = S->getNameInfo(); 7493 if (NameInfo.getName()) { 7494 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7495 if (!NameInfo.getName()) 7496 return StmtError(); 7497 } 7498 7499 // Check whether anything changed. 7500 if (!getDerived().AlwaysRebuild() && 7501 QualifierLoc == S->getQualifierLoc() && 7502 NameInfo.getName() == S->getNameInfo().getName()) 7503 return S; 7504 7505 // Determine whether this name exists, if we can. 7506 CXXScopeSpec SS; 7507 SS.Adopt(QualifierLoc); 7508 bool Dependent = false; 7509 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7510 case Sema::IER_Exists: 7511 if (S->isIfExists()) 7512 break; 7513 7514 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7515 7516 case Sema::IER_DoesNotExist: 7517 if (S->isIfNotExists()) 7518 break; 7519 7520 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7521 7522 case Sema::IER_Dependent: 7523 Dependent = true; 7524 break; 7525 7526 case Sema::IER_Error: 7527 return StmtError(); 7528 } 7529 7530 // We need to continue with the instantiation, so do so now. 7531 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7532 if (SubStmt.isInvalid()) 7533 return StmtError(); 7534 7535 // If we have resolved the name, just transform to the substatement. 7536 if (!Dependent) 7537 return SubStmt; 7538 7539 // The name is still dependent, so build a dependent expression again. 7540 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7541 S->isIfExists(), 7542 QualifierLoc, 7543 NameInfo, 7544 SubStmt.get()); 7545 } 7546 7547 template<typename Derived> 7548 ExprResult 7549 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7550 NestedNameSpecifierLoc QualifierLoc; 7551 if (E->getQualifierLoc()) { 7552 QualifierLoc 7553 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7554 if (!QualifierLoc) 7555 return ExprError(); 7556 } 7557 7558 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7559 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7560 if (!PD) 7561 return ExprError(); 7562 7563 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7564 if (Base.isInvalid()) 7565 return ExprError(); 7566 7567 return new (SemaRef.getASTContext()) 7568 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7569 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7570 QualifierLoc, E->getMemberLoc()); 7571 } 7572 7573 template <typename Derived> 7574 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7575 MSPropertySubscriptExpr *E) { 7576 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7577 if (BaseRes.isInvalid()) 7578 return ExprError(); 7579 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7580 if (IdxRes.isInvalid()) 7581 return ExprError(); 7582 7583 if (!getDerived().AlwaysRebuild() && 7584 BaseRes.get() == E->getBase() && 7585 IdxRes.get() == E->getIdx()) 7586 return E; 7587 7588 return getDerived().RebuildArraySubscriptExpr( 7589 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7590 } 7591 7592 template <typename Derived> 7593 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7594 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7595 if (TryBlock.isInvalid()) 7596 return StmtError(); 7597 7598 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7599 if (Handler.isInvalid()) 7600 return StmtError(); 7601 7602 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7603 Handler.get() == S->getHandler()) 7604 return S; 7605 7606 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7607 TryBlock.get(), Handler.get()); 7608 } 7609 7610 template <typename Derived> 7611 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7612 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7613 if (Block.isInvalid()) 7614 return StmtError(); 7615 7616 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7617 } 7618 7619 template <typename Derived> 7620 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7621 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7622 if (FilterExpr.isInvalid()) 7623 return StmtError(); 7624 7625 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7626 if (Block.isInvalid()) 7627 return StmtError(); 7628 7629 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7630 Block.get()); 7631 } 7632 7633 template <typename Derived> 7634 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7635 if (isa<SEHFinallyStmt>(Handler)) 7636 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7637 else 7638 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7639 } 7640 7641 template<typename Derived> 7642 StmtResult 7643 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7644 return S; 7645 } 7646 7647 //===----------------------------------------------------------------------===// 7648 // OpenMP directive transformation 7649 //===----------------------------------------------------------------------===// 7650 template <typename Derived> 7651 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7652 OMPExecutableDirective *D) { 7653 7654 // Transform the clauses 7655 llvm::SmallVector<OMPClause *, 16> TClauses; 7656 ArrayRef<OMPClause *> Clauses = D->clauses(); 7657 TClauses.reserve(Clauses.size()); 7658 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7659 I != E; ++I) { 7660 if (*I) { 7661 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7662 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7663 getDerived().getSema().EndOpenMPClause(); 7664 if (Clause) 7665 TClauses.push_back(Clause); 7666 } else { 7667 TClauses.push_back(nullptr); 7668 } 7669 } 7670 StmtResult AssociatedStmt; 7671 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7672 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7673 /*CurScope=*/nullptr); 7674 StmtResult Body; 7675 { 7676 Sema::CompoundScopeRAII CompoundScope(getSema()); 7677 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7678 Body = getDerived().TransformStmt(CS); 7679 } 7680 AssociatedStmt = 7681 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7682 if (AssociatedStmt.isInvalid()) { 7683 return StmtError(); 7684 } 7685 } 7686 if (TClauses.size() != Clauses.size()) { 7687 return StmtError(); 7688 } 7689 7690 // Transform directive name for 'omp critical' directive. 7691 DeclarationNameInfo DirName; 7692 if (D->getDirectiveKind() == OMPD_critical) { 7693 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7694 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7695 } 7696 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7697 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7698 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7699 } else if (D->getDirectiveKind() == OMPD_cancel) { 7700 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7701 } 7702 7703 return getDerived().RebuildOMPExecutableDirective( 7704 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7705 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7706 } 7707 7708 template <typename Derived> 7709 StmtResult 7710 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7711 DeclarationNameInfo DirName; 7712 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7713 D->getBeginLoc()); 7714 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7715 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7716 return Res; 7717 } 7718 7719 template <typename Derived> 7720 StmtResult 7721 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7722 DeclarationNameInfo DirName; 7723 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7724 D->getBeginLoc()); 7725 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7726 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7727 return Res; 7728 } 7729 7730 template <typename Derived> 7731 StmtResult 7732 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7733 DeclarationNameInfo DirName; 7734 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7735 D->getBeginLoc()); 7736 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7737 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7738 return Res; 7739 } 7740 7741 template <typename Derived> 7742 StmtResult 7743 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7744 DeclarationNameInfo DirName; 7745 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7746 D->getBeginLoc()); 7747 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7748 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7749 return Res; 7750 } 7751 7752 template <typename Derived> 7753 StmtResult 7754 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7755 DeclarationNameInfo DirName; 7756 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7757 D->getBeginLoc()); 7758 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7759 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7760 return Res; 7761 } 7762 7763 template <typename Derived> 7764 StmtResult 7765 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7766 DeclarationNameInfo DirName; 7767 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7768 D->getBeginLoc()); 7769 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7770 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7771 return Res; 7772 } 7773 7774 template <typename Derived> 7775 StmtResult 7776 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7777 DeclarationNameInfo DirName; 7778 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7779 D->getBeginLoc()); 7780 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7781 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7782 return Res; 7783 } 7784 7785 template <typename Derived> 7786 StmtResult 7787 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7788 DeclarationNameInfo DirName; 7789 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7790 D->getBeginLoc()); 7791 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7792 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7793 return Res; 7794 } 7795 7796 template <typename Derived> 7797 StmtResult 7798 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7799 getDerived().getSema().StartOpenMPDSABlock( 7800 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7801 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7802 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7803 return Res; 7804 } 7805 7806 template <typename Derived> 7807 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7808 OMPParallelForDirective *D) { 7809 DeclarationNameInfo DirName; 7810 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7811 nullptr, D->getBeginLoc()); 7812 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7813 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7814 return Res; 7815 } 7816 7817 template <typename Derived> 7818 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7819 OMPParallelForSimdDirective *D) { 7820 DeclarationNameInfo DirName; 7821 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7822 nullptr, D->getBeginLoc()); 7823 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7824 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7825 return Res; 7826 } 7827 7828 template <typename Derived> 7829 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7830 OMPParallelSectionsDirective *D) { 7831 DeclarationNameInfo DirName; 7832 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7833 nullptr, D->getBeginLoc()); 7834 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7835 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7836 return Res; 7837 } 7838 7839 template <typename Derived> 7840 StmtResult 7841 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7842 DeclarationNameInfo DirName; 7843 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7844 D->getBeginLoc()); 7845 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7846 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7847 return Res; 7848 } 7849 7850 template <typename Derived> 7851 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7852 OMPTaskyieldDirective *D) { 7853 DeclarationNameInfo DirName; 7854 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7855 D->getBeginLoc()); 7856 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7857 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7858 return Res; 7859 } 7860 7861 template <typename Derived> 7862 StmtResult 7863 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7864 DeclarationNameInfo DirName; 7865 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7866 D->getBeginLoc()); 7867 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7868 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7869 return Res; 7870 } 7871 7872 template <typename Derived> 7873 StmtResult 7874 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7875 DeclarationNameInfo DirName; 7876 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7877 D->getBeginLoc()); 7878 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7879 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7880 return Res; 7881 } 7882 7883 template <typename Derived> 7884 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7885 OMPTaskgroupDirective *D) { 7886 DeclarationNameInfo DirName; 7887 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7888 D->getBeginLoc()); 7889 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7890 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7891 return Res; 7892 } 7893 7894 template <typename Derived> 7895 StmtResult 7896 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7897 DeclarationNameInfo DirName; 7898 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7899 D->getBeginLoc()); 7900 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7901 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7902 return Res; 7903 } 7904 7905 template <typename Derived> 7906 StmtResult 7907 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7908 DeclarationNameInfo DirName; 7909 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7910 D->getBeginLoc()); 7911 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7912 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7913 return Res; 7914 } 7915 7916 template <typename Derived> 7917 StmtResult 7918 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7919 DeclarationNameInfo DirName; 7920 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7921 D->getBeginLoc()); 7922 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7923 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7924 return Res; 7925 } 7926 7927 template <typename Derived> 7928 StmtResult 7929 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7930 DeclarationNameInfo DirName; 7931 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7932 D->getBeginLoc()); 7933 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7934 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7935 return Res; 7936 } 7937 7938 template <typename Derived> 7939 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7940 OMPTargetDataDirective *D) { 7941 DeclarationNameInfo DirName; 7942 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7943 D->getBeginLoc()); 7944 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7945 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7946 return Res; 7947 } 7948 7949 template <typename Derived> 7950 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7951 OMPTargetEnterDataDirective *D) { 7952 DeclarationNameInfo DirName; 7953 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7954 nullptr, D->getBeginLoc()); 7955 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7956 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7957 return Res; 7958 } 7959 7960 template <typename Derived> 7961 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7962 OMPTargetExitDataDirective *D) { 7963 DeclarationNameInfo DirName; 7964 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7965 nullptr, D->getBeginLoc()); 7966 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7967 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7968 return Res; 7969 } 7970 7971 template <typename Derived> 7972 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7973 OMPTargetParallelDirective *D) { 7974 DeclarationNameInfo DirName; 7975 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7976 nullptr, D->getBeginLoc()); 7977 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7978 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7979 return Res; 7980 } 7981 7982 template <typename Derived> 7983 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 7984 OMPTargetParallelForDirective *D) { 7985 DeclarationNameInfo DirName; 7986 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 7987 nullptr, D->getBeginLoc()); 7988 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7989 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7990 return Res; 7991 } 7992 7993 template <typename Derived> 7994 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 7995 OMPTargetUpdateDirective *D) { 7996 DeclarationNameInfo DirName; 7997 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 7998 nullptr, D->getBeginLoc()); 7999 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8000 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8001 return Res; 8002 } 8003 8004 template <typename Derived> 8005 StmtResult 8006 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8007 DeclarationNameInfo DirName; 8008 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8009 D->getBeginLoc()); 8010 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8011 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8012 return Res; 8013 } 8014 8015 template <typename Derived> 8016 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8017 OMPCancellationPointDirective *D) { 8018 DeclarationNameInfo DirName; 8019 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8020 nullptr, D->getBeginLoc()); 8021 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8022 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8023 return Res; 8024 } 8025 8026 template <typename Derived> 8027 StmtResult 8028 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8029 DeclarationNameInfo DirName; 8030 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8031 D->getBeginLoc()); 8032 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8033 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8034 return Res; 8035 } 8036 8037 template <typename Derived> 8038 StmtResult 8039 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8040 DeclarationNameInfo DirName; 8041 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8042 D->getBeginLoc()); 8043 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8045 return Res; 8046 } 8047 8048 template <typename Derived> 8049 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8050 OMPTaskLoopSimdDirective *D) { 8051 DeclarationNameInfo DirName; 8052 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8053 nullptr, D->getBeginLoc()); 8054 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8055 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8056 return Res; 8057 } 8058 8059 template <typename Derived> 8060 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8061 OMPDistributeDirective *D) { 8062 DeclarationNameInfo DirName; 8063 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8064 D->getBeginLoc()); 8065 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8066 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8067 return Res; 8068 } 8069 8070 template <typename Derived> 8071 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8072 OMPDistributeParallelForDirective *D) { 8073 DeclarationNameInfo DirName; 8074 getDerived().getSema().StartOpenMPDSABlock( 8075 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8076 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8077 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8078 return Res; 8079 } 8080 8081 template <typename Derived> 8082 StmtResult 8083 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8084 OMPDistributeParallelForSimdDirective *D) { 8085 DeclarationNameInfo DirName; 8086 getDerived().getSema().StartOpenMPDSABlock( 8087 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8088 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8089 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8090 return Res; 8091 } 8092 8093 template <typename Derived> 8094 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8095 OMPDistributeSimdDirective *D) { 8096 DeclarationNameInfo DirName; 8097 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8098 nullptr, D->getBeginLoc()); 8099 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8101 return Res; 8102 } 8103 8104 template <typename Derived> 8105 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8106 OMPTargetParallelForSimdDirective *D) { 8107 DeclarationNameInfo DirName; 8108 getDerived().getSema().StartOpenMPDSABlock( 8109 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8110 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8111 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8112 return Res; 8113 } 8114 8115 template <typename Derived> 8116 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8117 OMPTargetSimdDirective *D) { 8118 DeclarationNameInfo DirName; 8119 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8120 D->getBeginLoc()); 8121 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8122 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8123 return Res; 8124 } 8125 8126 template <typename Derived> 8127 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8128 OMPTeamsDistributeDirective *D) { 8129 DeclarationNameInfo DirName; 8130 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8131 nullptr, D->getBeginLoc()); 8132 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8133 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8134 return Res; 8135 } 8136 8137 template <typename Derived> 8138 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8139 OMPTeamsDistributeSimdDirective *D) { 8140 DeclarationNameInfo DirName; 8141 getDerived().getSema().StartOpenMPDSABlock( 8142 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8143 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8144 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8145 return Res; 8146 } 8147 8148 template <typename Derived> 8149 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8150 OMPTeamsDistributeParallelForSimdDirective *D) { 8151 DeclarationNameInfo DirName; 8152 getDerived().getSema().StartOpenMPDSABlock( 8153 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8154 D->getBeginLoc()); 8155 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8156 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8157 return Res; 8158 } 8159 8160 template <typename Derived> 8161 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8162 OMPTeamsDistributeParallelForDirective *D) { 8163 DeclarationNameInfo DirName; 8164 getDerived().getSema().StartOpenMPDSABlock( 8165 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8166 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8167 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8168 return Res; 8169 } 8170 8171 template <typename Derived> 8172 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8173 OMPTargetTeamsDirective *D) { 8174 DeclarationNameInfo DirName; 8175 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8176 nullptr, D->getBeginLoc()); 8177 auto Res = getDerived().TransformOMPExecutableDirective(D); 8178 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8179 return Res; 8180 } 8181 8182 template <typename Derived> 8183 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8184 OMPTargetTeamsDistributeDirective *D) { 8185 DeclarationNameInfo DirName; 8186 getDerived().getSema().StartOpenMPDSABlock( 8187 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8188 auto Res = getDerived().TransformOMPExecutableDirective(D); 8189 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8190 return Res; 8191 } 8192 8193 template <typename Derived> 8194 StmtResult 8195 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8196 OMPTargetTeamsDistributeParallelForDirective *D) { 8197 DeclarationNameInfo DirName; 8198 getDerived().getSema().StartOpenMPDSABlock( 8199 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8200 D->getBeginLoc()); 8201 auto Res = getDerived().TransformOMPExecutableDirective(D); 8202 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8203 return Res; 8204 } 8205 8206 template <typename Derived> 8207 StmtResult TreeTransform<Derived>:: 8208 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8209 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8210 DeclarationNameInfo DirName; 8211 getDerived().getSema().StartOpenMPDSABlock( 8212 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8213 D->getBeginLoc()); 8214 auto Res = getDerived().TransformOMPExecutableDirective(D); 8215 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8216 return Res; 8217 } 8218 8219 template <typename Derived> 8220 StmtResult 8221 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8222 OMPTargetTeamsDistributeSimdDirective *D) { 8223 DeclarationNameInfo DirName; 8224 getDerived().getSema().StartOpenMPDSABlock( 8225 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8226 auto Res = getDerived().TransformOMPExecutableDirective(D); 8227 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8228 return Res; 8229 } 8230 8231 8232 //===----------------------------------------------------------------------===// 8233 // OpenMP clause transformation 8234 //===----------------------------------------------------------------------===// 8235 template <typename Derived> 8236 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8237 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8238 if (Cond.isInvalid()) 8239 return nullptr; 8240 return getDerived().RebuildOMPIfClause( 8241 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8242 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8243 } 8244 8245 template <typename Derived> 8246 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8247 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8248 if (Cond.isInvalid()) 8249 return nullptr; 8250 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8251 C->getLParenLoc(), C->getEndLoc()); 8252 } 8253 8254 template <typename Derived> 8255 OMPClause * 8256 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8257 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8258 if (NumThreads.isInvalid()) 8259 return nullptr; 8260 return getDerived().RebuildOMPNumThreadsClause( 8261 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8262 } 8263 8264 template <typename Derived> 8265 OMPClause * 8266 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8267 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8268 if (E.isInvalid()) 8269 return nullptr; 8270 return getDerived().RebuildOMPSafelenClause( 8271 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8272 } 8273 8274 template <typename Derived> 8275 OMPClause * 8276 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8277 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8278 if (E.isInvalid()) 8279 return nullptr; 8280 return getDerived().RebuildOMPSimdlenClause( 8281 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8282 } 8283 8284 template <typename Derived> 8285 OMPClause * 8286 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8287 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8288 if (E.isInvalid()) 8289 return nullptr; 8290 return getDerived().RebuildOMPCollapseClause( 8291 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8292 } 8293 8294 template <typename Derived> 8295 OMPClause * 8296 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8297 return getDerived().RebuildOMPDefaultClause( 8298 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8299 C->getLParenLoc(), C->getEndLoc()); 8300 } 8301 8302 template <typename Derived> 8303 OMPClause * 8304 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8305 return getDerived().RebuildOMPProcBindClause( 8306 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8307 C->getLParenLoc(), C->getEndLoc()); 8308 } 8309 8310 template <typename Derived> 8311 OMPClause * 8312 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8313 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8314 if (E.isInvalid()) 8315 return nullptr; 8316 return getDerived().RebuildOMPScheduleClause( 8317 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8318 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8319 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8320 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8321 } 8322 8323 template <typename Derived> 8324 OMPClause * 8325 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8326 ExprResult E; 8327 if (auto *Num = C->getNumForLoops()) { 8328 E = getDerived().TransformExpr(Num); 8329 if (E.isInvalid()) 8330 return nullptr; 8331 } 8332 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8333 C->getLParenLoc(), E.get()); 8334 } 8335 8336 template <typename Derived> 8337 OMPClause * 8338 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8339 // No need to rebuild this clause, no template-dependent parameters. 8340 return C; 8341 } 8342 8343 template <typename Derived> 8344 OMPClause * 8345 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8346 // No need to rebuild this clause, no template-dependent parameters. 8347 return C; 8348 } 8349 8350 template <typename Derived> 8351 OMPClause * 8352 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8353 // No need to rebuild this clause, no template-dependent parameters. 8354 return C; 8355 } 8356 8357 template <typename Derived> 8358 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8359 // No need to rebuild this clause, no template-dependent parameters. 8360 return C; 8361 } 8362 8363 template <typename Derived> 8364 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8365 // No need to rebuild this clause, no template-dependent parameters. 8366 return C; 8367 } 8368 8369 template <typename Derived> 8370 OMPClause * 8371 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8372 // No need to rebuild this clause, no template-dependent parameters. 8373 return C; 8374 } 8375 8376 template <typename Derived> 8377 OMPClause * 8378 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8379 // No need to rebuild this clause, no template-dependent parameters. 8380 return C; 8381 } 8382 8383 template <typename Derived> 8384 OMPClause * 8385 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8386 // No need to rebuild this clause, no template-dependent parameters. 8387 return C; 8388 } 8389 8390 template <typename Derived> 8391 OMPClause * 8392 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8393 // No need to rebuild this clause, no template-dependent parameters. 8394 return C; 8395 } 8396 8397 template <typename Derived> 8398 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8399 // No need to rebuild this clause, no template-dependent parameters. 8400 return C; 8401 } 8402 8403 template <typename Derived> 8404 OMPClause * 8405 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8406 // No need to rebuild this clause, no template-dependent parameters. 8407 return C; 8408 } 8409 8410 template <typename Derived> 8411 OMPClause * 8412 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8413 llvm::SmallVector<Expr *, 16> Vars; 8414 Vars.reserve(C->varlist_size()); 8415 for (auto *VE : C->varlists()) { 8416 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8417 if (EVar.isInvalid()) 8418 return nullptr; 8419 Vars.push_back(EVar.get()); 8420 } 8421 return getDerived().RebuildOMPPrivateClause( 8422 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8423 } 8424 8425 template <typename Derived> 8426 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8427 OMPFirstprivateClause *C) { 8428 llvm::SmallVector<Expr *, 16> Vars; 8429 Vars.reserve(C->varlist_size()); 8430 for (auto *VE : C->varlists()) { 8431 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8432 if (EVar.isInvalid()) 8433 return nullptr; 8434 Vars.push_back(EVar.get()); 8435 } 8436 return getDerived().RebuildOMPFirstprivateClause( 8437 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8438 } 8439 8440 template <typename Derived> 8441 OMPClause * 8442 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8443 llvm::SmallVector<Expr *, 16> Vars; 8444 Vars.reserve(C->varlist_size()); 8445 for (auto *VE : C->varlists()) { 8446 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8447 if (EVar.isInvalid()) 8448 return nullptr; 8449 Vars.push_back(EVar.get()); 8450 } 8451 return getDerived().RebuildOMPLastprivateClause( 8452 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8453 } 8454 8455 template <typename Derived> 8456 OMPClause * 8457 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8458 llvm::SmallVector<Expr *, 16> Vars; 8459 Vars.reserve(C->varlist_size()); 8460 for (auto *VE : C->varlists()) { 8461 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8462 if (EVar.isInvalid()) 8463 return nullptr; 8464 Vars.push_back(EVar.get()); 8465 } 8466 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8467 C->getLParenLoc(), C->getEndLoc()); 8468 } 8469 8470 template <typename Derived> 8471 OMPClause * 8472 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8473 llvm::SmallVector<Expr *, 16> Vars; 8474 Vars.reserve(C->varlist_size()); 8475 for (auto *VE : C->varlists()) { 8476 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8477 if (EVar.isInvalid()) 8478 return nullptr; 8479 Vars.push_back(EVar.get()); 8480 } 8481 CXXScopeSpec ReductionIdScopeSpec; 8482 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8483 8484 DeclarationNameInfo NameInfo = C->getNameInfo(); 8485 if (NameInfo.getName()) { 8486 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8487 if (!NameInfo.getName()) 8488 return nullptr; 8489 } 8490 // Build a list of all UDR decls with the same names ranged by the Scopes. 8491 // The Scope boundary is a duplication of the previous decl. 8492 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8493 for (auto *E : C->reduction_ops()) { 8494 // Transform all the decls. 8495 if (E) { 8496 auto *ULE = cast<UnresolvedLookupExpr>(E); 8497 UnresolvedSet<8> Decls; 8498 for (auto *D : ULE->decls()) { 8499 NamedDecl *InstD = 8500 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8501 Decls.addDecl(InstD, InstD->getAccess()); 8502 } 8503 UnresolvedReductions.push_back( 8504 UnresolvedLookupExpr::Create( 8505 SemaRef.Context, /*NamingClass=*/nullptr, 8506 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8507 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8508 Decls.begin(), Decls.end())); 8509 } else 8510 UnresolvedReductions.push_back(nullptr); 8511 } 8512 return getDerived().RebuildOMPReductionClause( 8513 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8514 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8515 } 8516 8517 template <typename Derived> 8518 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8519 OMPTaskReductionClause *C) { 8520 llvm::SmallVector<Expr *, 16> Vars; 8521 Vars.reserve(C->varlist_size()); 8522 for (auto *VE : C->varlists()) { 8523 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8524 if (EVar.isInvalid()) 8525 return nullptr; 8526 Vars.push_back(EVar.get()); 8527 } 8528 CXXScopeSpec ReductionIdScopeSpec; 8529 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8530 8531 DeclarationNameInfo NameInfo = C->getNameInfo(); 8532 if (NameInfo.getName()) { 8533 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8534 if (!NameInfo.getName()) 8535 return nullptr; 8536 } 8537 // Build a list of all UDR decls with the same names ranged by the Scopes. 8538 // The Scope boundary is a duplication of the previous decl. 8539 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8540 for (auto *E : C->reduction_ops()) { 8541 // Transform all the decls. 8542 if (E) { 8543 auto *ULE = cast<UnresolvedLookupExpr>(E); 8544 UnresolvedSet<8> Decls; 8545 for (auto *D : ULE->decls()) { 8546 NamedDecl *InstD = 8547 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8548 Decls.addDecl(InstD, InstD->getAccess()); 8549 } 8550 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8551 SemaRef.Context, /*NamingClass=*/nullptr, 8552 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8553 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8554 } else 8555 UnresolvedReductions.push_back(nullptr); 8556 } 8557 return getDerived().RebuildOMPTaskReductionClause( 8558 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8559 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8560 } 8561 8562 template <typename Derived> 8563 OMPClause * 8564 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8565 llvm::SmallVector<Expr *, 16> Vars; 8566 Vars.reserve(C->varlist_size()); 8567 for (auto *VE : C->varlists()) { 8568 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8569 if (EVar.isInvalid()) 8570 return nullptr; 8571 Vars.push_back(EVar.get()); 8572 } 8573 CXXScopeSpec ReductionIdScopeSpec; 8574 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8575 8576 DeclarationNameInfo NameInfo = C->getNameInfo(); 8577 if (NameInfo.getName()) { 8578 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8579 if (!NameInfo.getName()) 8580 return nullptr; 8581 } 8582 // Build a list of all UDR decls with the same names ranged by the Scopes. 8583 // The Scope boundary is a duplication of the previous decl. 8584 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8585 for (auto *E : C->reduction_ops()) { 8586 // Transform all the decls. 8587 if (E) { 8588 auto *ULE = cast<UnresolvedLookupExpr>(E); 8589 UnresolvedSet<8> Decls; 8590 for (auto *D : ULE->decls()) { 8591 NamedDecl *InstD = 8592 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8593 Decls.addDecl(InstD, InstD->getAccess()); 8594 } 8595 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8596 SemaRef.Context, /*NamingClass=*/nullptr, 8597 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8598 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8599 } else 8600 UnresolvedReductions.push_back(nullptr); 8601 } 8602 return getDerived().RebuildOMPInReductionClause( 8603 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8604 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8605 } 8606 8607 template <typename Derived> 8608 OMPClause * 8609 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8610 llvm::SmallVector<Expr *, 16> Vars; 8611 Vars.reserve(C->varlist_size()); 8612 for (auto *VE : C->varlists()) { 8613 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8614 if (EVar.isInvalid()) 8615 return nullptr; 8616 Vars.push_back(EVar.get()); 8617 } 8618 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8619 if (Step.isInvalid()) 8620 return nullptr; 8621 return getDerived().RebuildOMPLinearClause( 8622 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8623 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8624 } 8625 8626 template <typename Derived> 8627 OMPClause * 8628 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8629 llvm::SmallVector<Expr *, 16> Vars; 8630 Vars.reserve(C->varlist_size()); 8631 for (auto *VE : C->varlists()) { 8632 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8633 if (EVar.isInvalid()) 8634 return nullptr; 8635 Vars.push_back(EVar.get()); 8636 } 8637 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8638 if (Alignment.isInvalid()) 8639 return nullptr; 8640 return getDerived().RebuildOMPAlignedClause( 8641 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8642 C->getColonLoc(), C->getEndLoc()); 8643 } 8644 8645 template <typename Derived> 8646 OMPClause * 8647 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8648 llvm::SmallVector<Expr *, 16> Vars; 8649 Vars.reserve(C->varlist_size()); 8650 for (auto *VE : C->varlists()) { 8651 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8652 if (EVar.isInvalid()) 8653 return nullptr; 8654 Vars.push_back(EVar.get()); 8655 } 8656 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8657 C->getLParenLoc(), C->getEndLoc()); 8658 } 8659 8660 template <typename Derived> 8661 OMPClause * 8662 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8663 llvm::SmallVector<Expr *, 16> Vars; 8664 Vars.reserve(C->varlist_size()); 8665 for (auto *VE : C->varlists()) { 8666 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8667 if (EVar.isInvalid()) 8668 return nullptr; 8669 Vars.push_back(EVar.get()); 8670 } 8671 return getDerived().RebuildOMPCopyprivateClause( 8672 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8673 } 8674 8675 template <typename Derived> 8676 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8677 llvm::SmallVector<Expr *, 16> Vars; 8678 Vars.reserve(C->varlist_size()); 8679 for (auto *VE : C->varlists()) { 8680 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8681 if (EVar.isInvalid()) 8682 return nullptr; 8683 Vars.push_back(EVar.get()); 8684 } 8685 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8686 C->getLParenLoc(), C->getEndLoc()); 8687 } 8688 8689 template <typename Derived> 8690 OMPClause * 8691 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8692 llvm::SmallVector<Expr *, 16> Vars; 8693 Vars.reserve(C->varlist_size()); 8694 for (auto *VE : C->varlists()) { 8695 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8696 if (EVar.isInvalid()) 8697 return nullptr; 8698 Vars.push_back(EVar.get()); 8699 } 8700 return getDerived().RebuildOMPDependClause( 8701 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8702 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8703 } 8704 8705 template <typename Derived> 8706 OMPClause * 8707 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8708 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8709 if (E.isInvalid()) 8710 return nullptr; 8711 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8712 C->getLParenLoc(), C->getEndLoc()); 8713 } 8714 8715 template <typename Derived> 8716 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8717 llvm::SmallVector<Expr *, 16> Vars; 8718 Vars.reserve(C->varlist_size()); 8719 for (auto *VE : C->varlists()) { 8720 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8721 if (EVar.isInvalid()) 8722 return nullptr; 8723 Vars.push_back(EVar.get()); 8724 } 8725 return getDerived().RebuildOMPMapClause( 8726 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8727 C->getMapLoc(), C->getColonLoc(), Vars, C->getBeginLoc(), 8728 C->getLParenLoc(), C->getEndLoc()); 8729 } 8730 8731 template <typename Derived> 8732 OMPClause * 8733 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8734 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8735 if (E.isInvalid()) 8736 return nullptr; 8737 return getDerived().RebuildOMPNumTeamsClause( 8738 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8739 } 8740 8741 template <typename Derived> 8742 OMPClause * 8743 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8744 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8745 if (E.isInvalid()) 8746 return nullptr; 8747 return getDerived().RebuildOMPThreadLimitClause( 8748 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8749 } 8750 8751 template <typename Derived> 8752 OMPClause * 8753 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8754 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8755 if (E.isInvalid()) 8756 return nullptr; 8757 return getDerived().RebuildOMPPriorityClause( 8758 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8759 } 8760 8761 template <typename Derived> 8762 OMPClause * 8763 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8764 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8765 if (E.isInvalid()) 8766 return nullptr; 8767 return getDerived().RebuildOMPGrainsizeClause( 8768 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8769 } 8770 8771 template <typename Derived> 8772 OMPClause * 8773 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8774 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8775 if (E.isInvalid()) 8776 return nullptr; 8777 return getDerived().RebuildOMPNumTasksClause( 8778 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8779 } 8780 8781 template <typename Derived> 8782 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8783 ExprResult E = getDerived().TransformExpr(C->getHint()); 8784 if (E.isInvalid()) 8785 return nullptr; 8786 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 8787 C->getLParenLoc(), C->getEndLoc()); 8788 } 8789 8790 template <typename Derived> 8791 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8792 OMPDistScheduleClause *C) { 8793 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8794 if (E.isInvalid()) 8795 return nullptr; 8796 return getDerived().RebuildOMPDistScheduleClause( 8797 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8798 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8799 } 8800 8801 template <typename Derived> 8802 OMPClause * 8803 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8804 return C; 8805 } 8806 8807 template <typename Derived> 8808 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8809 llvm::SmallVector<Expr *, 16> Vars; 8810 Vars.reserve(C->varlist_size()); 8811 for (auto *VE : C->varlists()) { 8812 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8813 if (EVar.isInvalid()) 8814 return 0; 8815 Vars.push_back(EVar.get()); 8816 } 8817 return getDerived().RebuildOMPToClause(Vars, C->getBeginLoc(), 8818 C->getLParenLoc(), C->getEndLoc()); 8819 } 8820 8821 template <typename Derived> 8822 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8823 llvm::SmallVector<Expr *, 16> Vars; 8824 Vars.reserve(C->varlist_size()); 8825 for (auto *VE : C->varlists()) { 8826 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8827 if (EVar.isInvalid()) 8828 return 0; 8829 Vars.push_back(EVar.get()); 8830 } 8831 return getDerived().RebuildOMPFromClause(Vars, C->getBeginLoc(), 8832 C->getLParenLoc(), C->getEndLoc()); 8833 } 8834 8835 template <typename Derived> 8836 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8837 OMPUseDevicePtrClause *C) { 8838 llvm::SmallVector<Expr *, 16> Vars; 8839 Vars.reserve(C->varlist_size()); 8840 for (auto *VE : C->varlists()) { 8841 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8842 if (EVar.isInvalid()) 8843 return nullptr; 8844 Vars.push_back(EVar.get()); 8845 } 8846 return getDerived().RebuildOMPUseDevicePtrClause( 8847 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8848 } 8849 8850 template <typename Derived> 8851 OMPClause * 8852 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8853 llvm::SmallVector<Expr *, 16> Vars; 8854 Vars.reserve(C->varlist_size()); 8855 for (auto *VE : C->varlists()) { 8856 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8857 if (EVar.isInvalid()) 8858 return nullptr; 8859 Vars.push_back(EVar.get()); 8860 } 8861 return getDerived().RebuildOMPIsDevicePtrClause( 8862 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8863 } 8864 8865 //===----------------------------------------------------------------------===// 8866 // Expression transformation 8867 //===----------------------------------------------------------------------===// 8868 template<typename Derived> 8869 ExprResult 8870 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8871 if (!E->isTypeDependent()) 8872 return E; 8873 8874 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8875 E->getIdentType()); 8876 } 8877 8878 template<typename Derived> 8879 ExprResult 8880 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8881 NestedNameSpecifierLoc QualifierLoc; 8882 if (E->getQualifierLoc()) { 8883 QualifierLoc 8884 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8885 if (!QualifierLoc) 8886 return ExprError(); 8887 } 8888 8889 ValueDecl *ND 8890 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8891 E->getDecl())); 8892 if (!ND) 8893 return ExprError(); 8894 8895 DeclarationNameInfo NameInfo = E->getNameInfo(); 8896 if (NameInfo.getName()) { 8897 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8898 if (!NameInfo.getName()) 8899 return ExprError(); 8900 } 8901 8902 if (!getDerived().AlwaysRebuild() && 8903 QualifierLoc == E->getQualifierLoc() && 8904 ND == E->getDecl() && 8905 NameInfo.getName() == E->getDecl()->getDeclName() && 8906 !E->hasExplicitTemplateArgs()) { 8907 8908 // Mark it referenced in the new context regardless. 8909 // FIXME: this is a bit instantiation-specific. 8910 SemaRef.MarkDeclRefReferenced(E); 8911 8912 return E; 8913 } 8914 8915 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8916 if (E->hasExplicitTemplateArgs()) { 8917 TemplateArgs = &TransArgs; 8918 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8919 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8920 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8921 E->getNumTemplateArgs(), 8922 TransArgs)) 8923 return ExprError(); 8924 } 8925 8926 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8927 TemplateArgs); 8928 } 8929 8930 template<typename Derived> 8931 ExprResult 8932 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8933 return E; 8934 } 8935 8936 template <typename Derived> 8937 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 8938 FixedPointLiteral *E) { 8939 return E; 8940 } 8941 8942 template<typename Derived> 8943 ExprResult 8944 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8945 return E; 8946 } 8947 8948 template<typename Derived> 8949 ExprResult 8950 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8951 return E; 8952 } 8953 8954 template<typename Derived> 8955 ExprResult 8956 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8957 return E; 8958 } 8959 8960 template<typename Derived> 8961 ExprResult 8962 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8963 return E; 8964 } 8965 8966 template<typename Derived> 8967 ExprResult 8968 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8969 if (FunctionDecl *FD = E->getDirectCallee()) 8970 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 8971 return SemaRef.MaybeBindToTemporary(E); 8972 } 8973 8974 template<typename Derived> 8975 ExprResult 8976 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8977 ExprResult ControllingExpr = 8978 getDerived().TransformExpr(E->getControllingExpr()); 8979 if (ControllingExpr.isInvalid()) 8980 return ExprError(); 8981 8982 SmallVector<Expr *, 4> AssocExprs; 8983 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8984 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8985 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8986 if (TS) { 8987 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8988 if (!AssocType) 8989 return ExprError(); 8990 AssocTypes.push_back(AssocType); 8991 } else { 8992 AssocTypes.push_back(nullptr); 8993 } 8994 8995 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8996 if (AssocExpr.isInvalid()) 8997 return ExprError(); 8998 AssocExprs.push_back(AssocExpr.get()); 8999 } 9000 9001 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9002 E->getDefaultLoc(), 9003 E->getRParenLoc(), 9004 ControllingExpr.get(), 9005 AssocTypes, 9006 AssocExprs); 9007 } 9008 9009 template<typename Derived> 9010 ExprResult 9011 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9012 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9013 if (SubExpr.isInvalid()) 9014 return ExprError(); 9015 9016 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9017 return E; 9018 9019 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9020 E->getRParen()); 9021 } 9022 9023 /// The operand of a unary address-of operator has special rules: it's 9024 /// allowed to refer to a non-static member of a class even if there's no 'this' 9025 /// object available. 9026 template<typename Derived> 9027 ExprResult 9028 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9029 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9030 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9031 else 9032 return getDerived().TransformExpr(E); 9033 } 9034 9035 template<typename Derived> 9036 ExprResult 9037 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9038 ExprResult SubExpr; 9039 if (E->getOpcode() == UO_AddrOf) 9040 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9041 else 9042 SubExpr = TransformExpr(E->getSubExpr()); 9043 if (SubExpr.isInvalid()) 9044 return ExprError(); 9045 9046 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9047 return E; 9048 9049 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9050 E->getOpcode(), 9051 SubExpr.get()); 9052 } 9053 9054 template<typename Derived> 9055 ExprResult 9056 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9057 // Transform the type. 9058 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9059 if (!Type) 9060 return ExprError(); 9061 9062 // Transform all of the components into components similar to what the 9063 // parser uses. 9064 // FIXME: It would be slightly more efficient in the non-dependent case to 9065 // just map FieldDecls, rather than requiring the rebuilder to look for 9066 // the fields again. However, __builtin_offsetof is rare enough in 9067 // template code that we don't care. 9068 bool ExprChanged = false; 9069 typedef Sema::OffsetOfComponent Component; 9070 SmallVector<Component, 4> Components; 9071 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9072 const OffsetOfNode &ON = E->getComponent(I); 9073 Component Comp; 9074 Comp.isBrackets = true; 9075 Comp.LocStart = ON.getSourceRange().getBegin(); 9076 Comp.LocEnd = ON.getSourceRange().getEnd(); 9077 switch (ON.getKind()) { 9078 case OffsetOfNode::Array: { 9079 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9080 ExprResult Index = getDerived().TransformExpr(FromIndex); 9081 if (Index.isInvalid()) 9082 return ExprError(); 9083 9084 ExprChanged = ExprChanged || Index.get() != FromIndex; 9085 Comp.isBrackets = true; 9086 Comp.U.E = Index.get(); 9087 break; 9088 } 9089 9090 case OffsetOfNode::Field: 9091 case OffsetOfNode::Identifier: 9092 Comp.isBrackets = false; 9093 Comp.U.IdentInfo = ON.getFieldName(); 9094 if (!Comp.U.IdentInfo) 9095 continue; 9096 9097 break; 9098 9099 case OffsetOfNode::Base: 9100 // Will be recomputed during the rebuild. 9101 continue; 9102 } 9103 9104 Components.push_back(Comp); 9105 } 9106 9107 // If nothing changed, retain the existing expression. 9108 if (!getDerived().AlwaysRebuild() && 9109 Type == E->getTypeSourceInfo() && 9110 !ExprChanged) 9111 return E; 9112 9113 // Build a new offsetof expression. 9114 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9115 Components, E->getRParenLoc()); 9116 } 9117 9118 template<typename Derived> 9119 ExprResult 9120 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9121 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9122 "opaque value expression requires transformation"); 9123 return E; 9124 } 9125 9126 template<typename Derived> 9127 ExprResult 9128 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9129 return E; 9130 } 9131 9132 template<typename Derived> 9133 ExprResult 9134 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9135 // Rebuild the syntactic form. The original syntactic form has 9136 // opaque-value expressions in it, so strip those away and rebuild 9137 // the result. This is a really awful way of doing this, but the 9138 // better solution (rebuilding the semantic expressions and 9139 // rebinding OVEs as necessary) doesn't work; we'd need 9140 // TreeTransform to not strip away implicit conversions. 9141 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9142 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9143 if (result.isInvalid()) return ExprError(); 9144 9145 // If that gives us a pseudo-object result back, the pseudo-object 9146 // expression must have been an lvalue-to-rvalue conversion which we 9147 // should reapply. 9148 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9149 result = SemaRef.checkPseudoObjectRValue(result.get()); 9150 9151 return result; 9152 } 9153 9154 template<typename Derived> 9155 ExprResult 9156 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9157 UnaryExprOrTypeTraitExpr *E) { 9158 if (E->isArgumentType()) { 9159 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9160 9161 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9162 if (!NewT) 9163 return ExprError(); 9164 9165 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9166 return E; 9167 9168 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9169 E->getKind(), 9170 E->getSourceRange()); 9171 } 9172 9173 // C++0x [expr.sizeof]p1: 9174 // The operand is either an expression, which is an unevaluated operand 9175 // [...] 9176 EnterExpressionEvaluationContext Unevaluated( 9177 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9178 Sema::ReuseLambdaContextDecl); 9179 9180 // Try to recover if we have something like sizeof(T::X) where X is a type. 9181 // Notably, there must be *exactly* one set of parens if X is a type. 9182 TypeSourceInfo *RecoveryTSI = nullptr; 9183 ExprResult SubExpr; 9184 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9185 if (auto *DRE = 9186 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9187 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9188 PE, DRE, false, &RecoveryTSI); 9189 else 9190 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9191 9192 if (RecoveryTSI) { 9193 return getDerived().RebuildUnaryExprOrTypeTrait( 9194 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9195 } else if (SubExpr.isInvalid()) 9196 return ExprError(); 9197 9198 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9199 return E; 9200 9201 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9202 E->getOperatorLoc(), 9203 E->getKind(), 9204 E->getSourceRange()); 9205 } 9206 9207 template<typename Derived> 9208 ExprResult 9209 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9210 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9211 if (LHS.isInvalid()) 9212 return ExprError(); 9213 9214 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9215 if (RHS.isInvalid()) 9216 return ExprError(); 9217 9218 9219 if (!getDerived().AlwaysRebuild() && 9220 LHS.get() == E->getLHS() && 9221 RHS.get() == E->getRHS()) 9222 return E; 9223 9224 return getDerived().RebuildArraySubscriptExpr( 9225 LHS.get(), 9226 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9227 } 9228 9229 template <typename Derived> 9230 ExprResult 9231 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9232 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9233 if (Base.isInvalid()) 9234 return ExprError(); 9235 9236 ExprResult LowerBound; 9237 if (E->getLowerBound()) { 9238 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9239 if (LowerBound.isInvalid()) 9240 return ExprError(); 9241 } 9242 9243 ExprResult Length; 9244 if (E->getLength()) { 9245 Length = getDerived().TransformExpr(E->getLength()); 9246 if (Length.isInvalid()) 9247 return ExprError(); 9248 } 9249 9250 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9251 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9252 return E; 9253 9254 return getDerived().RebuildOMPArraySectionExpr( 9255 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9256 Length.get(), E->getRBracketLoc()); 9257 } 9258 9259 template<typename Derived> 9260 ExprResult 9261 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9262 // Transform the callee. 9263 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9264 if (Callee.isInvalid()) 9265 return ExprError(); 9266 9267 // Transform arguments. 9268 bool ArgChanged = false; 9269 SmallVector<Expr*, 8> Args; 9270 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9271 &ArgChanged)) 9272 return ExprError(); 9273 9274 if (!getDerived().AlwaysRebuild() && 9275 Callee.get() == E->getCallee() && 9276 !ArgChanged) 9277 return SemaRef.MaybeBindToTemporary(E); 9278 9279 // FIXME: Wrong source location information for the '('. 9280 SourceLocation FakeLParenLoc 9281 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9282 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9283 Args, 9284 E->getRParenLoc()); 9285 } 9286 9287 template<typename Derived> 9288 ExprResult 9289 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9290 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9291 if (Base.isInvalid()) 9292 return ExprError(); 9293 9294 NestedNameSpecifierLoc QualifierLoc; 9295 if (E->hasQualifier()) { 9296 QualifierLoc 9297 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9298 9299 if (!QualifierLoc) 9300 return ExprError(); 9301 } 9302 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9303 9304 ValueDecl *Member 9305 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9306 E->getMemberDecl())); 9307 if (!Member) 9308 return ExprError(); 9309 9310 NamedDecl *FoundDecl = E->getFoundDecl(); 9311 if (FoundDecl == E->getMemberDecl()) { 9312 FoundDecl = Member; 9313 } else { 9314 FoundDecl = cast_or_null<NamedDecl>( 9315 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9316 if (!FoundDecl) 9317 return ExprError(); 9318 } 9319 9320 if (!getDerived().AlwaysRebuild() && 9321 Base.get() == E->getBase() && 9322 QualifierLoc == E->getQualifierLoc() && 9323 Member == E->getMemberDecl() && 9324 FoundDecl == E->getFoundDecl() && 9325 !E->hasExplicitTemplateArgs()) { 9326 9327 // Mark it referenced in the new context regardless. 9328 // FIXME: this is a bit instantiation-specific. 9329 SemaRef.MarkMemberReferenced(E); 9330 9331 return E; 9332 } 9333 9334 TemplateArgumentListInfo TransArgs; 9335 if (E->hasExplicitTemplateArgs()) { 9336 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9337 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9338 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9339 E->getNumTemplateArgs(), 9340 TransArgs)) 9341 return ExprError(); 9342 } 9343 9344 // FIXME: Bogus source location for the operator 9345 SourceLocation FakeOperatorLoc = 9346 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9347 9348 // FIXME: to do this check properly, we will need to preserve the 9349 // first-qualifier-in-scope here, just in case we had a dependent 9350 // base (and therefore couldn't do the check) and a 9351 // nested-name-qualifier (and therefore could do the lookup). 9352 NamedDecl *FirstQualifierInScope = nullptr; 9353 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9354 if (MemberNameInfo.getName()) { 9355 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9356 if (!MemberNameInfo.getName()) 9357 return ExprError(); 9358 } 9359 9360 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9361 E->isArrow(), 9362 QualifierLoc, 9363 TemplateKWLoc, 9364 MemberNameInfo, 9365 Member, 9366 FoundDecl, 9367 (E->hasExplicitTemplateArgs() 9368 ? &TransArgs : nullptr), 9369 FirstQualifierInScope); 9370 } 9371 9372 template<typename Derived> 9373 ExprResult 9374 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9375 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9376 if (LHS.isInvalid()) 9377 return ExprError(); 9378 9379 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9380 if (RHS.isInvalid()) 9381 return ExprError(); 9382 9383 if (!getDerived().AlwaysRebuild() && 9384 LHS.get() == E->getLHS() && 9385 RHS.get() == E->getRHS()) 9386 return E; 9387 9388 Sema::FPContractStateRAII FPContractState(getSema()); 9389 getSema().FPFeatures = E->getFPFeatures(); 9390 9391 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9392 LHS.get(), RHS.get()); 9393 } 9394 9395 template<typename Derived> 9396 ExprResult 9397 TreeTransform<Derived>::TransformCompoundAssignOperator( 9398 CompoundAssignOperator *E) { 9399 return getDerived().TransformBinaryOperator(E); 9400 } 9401 9402 template<typename Derived> 9403 ExprResult TreeTransform<Derived>:: 9404 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9405 // Just rebuild the common and RHS expressions and see whether we 9406 // get any changes. 9407 9408 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9409 if (commonExpr.isInvalid()) 9410 return ExprError(); 9411 9412 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9413 if (rhs.isInvalid()) 9414 return ExprError(); 9415 9416 if (!getDerived().AlwaysRebuild() && 9417 commonExpr.get() == e->getCommon() && 9418 rhs.get() == e->getFalseExpr()) 9419 return e; 9420 9421 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9422 e->getQuestionLoc(), 9423 nullptr, 9424 e->getColonLoc(), 9425 rhs.get()); 9426 } 9427 9428 template<typename Derived> 9429 ExprResult 9430 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9431 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9432 if (Cond.isInvalid()) 9433 return ExprError(); 9434 9435 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9436 if (LHS.isInvalid()) 9437 return ExprError(); 9438 9439 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9440 if (RHS.isInvalid()) 9441 return ExprError(); 9442 9443 if (!getDerived().AlwaysRebuild() && 9444 Cond.get() == E->getCond() && 9445 LHS.get() == E->getLHS() && 9446 RHS.get() == E->getRHS()) 9447 return E; 9448 9449 return getDerived().RebuildConditionalOperator(Cond.get(), 9450 E->getQuestionLoc(), 9451 LHS.get(), 9452 E->getColonLoc(), 9453 RHS.get()); 9454 } 9455 9456 template<typename Derived> 9457 ExprResult 9458 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9459 // Implicit casts are eliminated during transformation, since they 9460 // will be recomputed by semantic analysis after transformation. 9461 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9462 } 9463 9464 template<typename Derived> 9465 ExprResult 9466 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9467 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9468 if (!Type) 9469 return ExprError(); 9470 9471 ExprResult SubExpr 9472 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9473 if (SubExpr.isInvalid()) 9474 return ExprError(); 9475 9476 if (!getDerived().AlwaysRebuild() && 9477 Type == E->getTypeInfoAsWritten() && 9478 SubExpr.get() == E->getSubExpr()) 9479 return E; 9480 9481 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9482 Type, 9483 E->getRParenLoc(), 9484 SubExpr.get()); 9485 } 9486 9487 template<typename Derived> 9488 ExprResult 9489 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9490 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9491 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9492 if (!NewT) 9493 return ExprError(); 9494 9495 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9496 if (Init.isInvalid()) 9497 return ExprError(); 9498 9499 if (!getDerived().AlwaysRebuild() && 9500 OldT == NewT && 9501 Init.get() == E->getInitializer()) 9502 return SemaRef.MaybeBindToTemporary(E); 9503 9504 // Note: the expression type doesn't necessarily match the 9505 // type-as-written, but that's okay, because it should always be 9506 // derivable from the initializer. 9507 9508 return getDerived().RebuildCompoundLiteralExpr( 9509 E->getLParenLoc(), NewT, 9510 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9511 } 9512 9513 template<typename Derived> 9514 ExprResult 9515 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9516 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9517 if (Base.isInvalid()) 9518 return ExprError(); 9519 9520 if (!getDerived().AlwaysRebuild() && 9521 Base.get() == E->getBase()) 9522 return E; 9523 9524 // FIXME: Bad source location 9525 SourceLocation FakeOperatorLoc = 9526 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9527 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9528 E->getAccessorLoc(), 9529 E->getAccessor()); 9530 } 9531 9532 template<typename Derived> 9533 ExprResult 9534 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9535 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9536 E = Syntactic; 9537 9538 bool InitChanged = false; 9539 9540 SmallVector<Expr*, 4> Inits; 9541 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9542 Inits, &InitChanged)) 9543 return ExprError(); 9544 9545 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9546 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9547 // in some cases. We can't reuse it in general, because the syntactic and 9548 // semantic forms are linked, and we can't know that semantic form will 9549 // match even if the syntactic form does. 9550 } 9551 9552 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9553 E->getRBraceLoc()); 9554 } 9555 9556 template<typename Derived> 9557 ExprResult 9558 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9559 Designation Desig; 9560 9561 // transform the initializer value 9562 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9563 if (Init.isInvalid()) 9564 return ExprError(); 9565 9566 // transform the designators. 9567 SmallVector<Expr*, 4> ArrayExprs; 9568 bool ExprChanged = false; 9569 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9570 if (D.isFieldDesignator()) { 9571 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9572 D.getDotLoc(), 9573 D.getFieldLoc())); 9574 if (D.getField()) { 9575 FieldDecl *Field = cast_or_null<FieldDecl>( 9576 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9577 if (Field != D.getField()) 9578 // Rebuild the expression when the transformed FieldDecl is 9579 // different to the already assigned FieldDecl. 9580 ExprChanged = true; 9581 } else { 9582 // Ensure that the designator expression is rebuilt when there isn't 9583 // a resolved FieldDecl in the designator as we don't want to assign 9584 // a FieldDecl to a pattern designator that will be instantiated again. 9585 ExprChanged = true; 9586 } 9587 continue; 9588 } 9589 9590 if (D.isArrayDesignator()) { 9591 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9592 if (Index.isInvalid()) 9593 return ExprError(); 9594 9595 Desig.AddDesignator( 9596 Designator::getArray(Index.get(), D.getLBracketLoc())); 9597 9598 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9599 ArrayExprs.push_back(Index.get()); 9600 continue; 9601 } 9602 9603 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9604 ExprResult Start 9605 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9606 if (Start.isInvalid()) 9607 return ExprError(); 9608 9609 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9610 if (End.isInvalid()) 9611 return ExprError(); 9612 9613 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9614 End.get(), 9615 D.getLBracketLoc(), 9616 D.getEllipsisLoc())); 9617 9618 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9619 End.get() != E->getArrayRangeEnd(D); 9620 9621 ArrayExprs.push_back(Start.get()); 9622 ArrayExprs.push_back(End.get()); 9623 } 9624 9625 if (!getDerived().AlwaysRebuild() && 9626 Init.get() == E->getInit() && 9627 !ExprChanged) 9628 return E; 9629 9630 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9631 E->getEqualOrColonLoc(), 9632 E->usesGNUSyntax(), Init.get()); 9633 } 9634 9635 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9636 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9637 template<typename Derived> 9638 ExprResult 9639 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9640 DesignatedInitUpdateExpr *E) { 9641 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9642 "initializer"); 9643 return ExprError(); 9644 } 9645 9646 template<typename Derived> 9647 ExprResult 9648 TreeTransform<Derived>::TransformNoInitExpr( 9649 NoInitExpr *E) { 9650 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9651 return ExprError(); 9652 } 9653 9654 template<typename Derived> 9655 ExprResult 9656 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9657 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9658 return ExprError(); 9659 } 9660 9661 template<typename Derived> 9662 ExprResult 9663 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9664 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9665 return ExprError(); 9666 } 9667 9668 template<typename Derived> 9669 ExprResult 9670 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9671 ImplicitValueInitExpr *E) { 9672 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9673 9674 // FIXME: Will we ever have proper type location here? Will we actually 9675 // need to transform the type? 9676 QualType T = getDerived().TransformType(E->getType()); 9677 if (T.isNull()) 9678 return ExprError(); 9679 9680 if (!getDerived().AlwaysRebuild() && 9681 T == E->getType()) 9682 return E; 9683 9684 return getDerived().RebuildImplicitValueInitExpr(T); 9685 } 9686 9687 template<typename Derived> 9688 ExprResult 9689 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9690 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9691 if (!TInfo) 9692 return ExprError(); 9693 9694 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9695 if (SubExpr.isInvalid()) 9696 return ExprError(); 9697 9698 if (!getDerived().AlwaysRebuild() && 9699 TInfo == E->getWrittenTypeInfo() && 9700 SubExpr.get() == E->getSubExpr()) 9701 return E; 9702 9703 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9704 TInfo, E->getRParenLoc()); 9705 } 9706 9707 template<typename Derived> 9708 ExprResult 9709 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9710 bool ArgumentChanged = false; 9711 SmallVector<Expr*, 4> Inits; 9712 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9713 &ArgumentChanged)) 9714 return ExprError(); 9715 9716 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9717 Inits, 9718 E->getRParenLoc()); 9719 } 9720 9721 /// Transform an address-of-label expression. 9722 /// 9723 /// By default, the transformation of an address-of-label expression always 9724 /// rebuilds the expression, so that the label identifier can be resolved to 9725 /// the corresponding label statement by semantic analysis. 9726 template<typename Derived> 9727 ExprResult 9728 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9729 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9730 E->getLabel()); 9731 if (!LD) 9732 return ExprError(); 9733 9734 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9735 cast<LabelDecl>(LD)); 9736 } 9737 9738 template<typename Derived> 9739 ExprResult 9740 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9741 SemaRef.ActOnStartStmtExpr(); 9742 StmtResult SubStmt 9743 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9744 if (SubStmt.isInvalid()) { 9745 SemaRef.ActOnStmtExprError(); 9746 return ExprError(); 9747 } 9748 9749 if (!getDerived().AlwaysRebuild() && 9750 SubStmt.get() == E->getSubStmt()) { 9751 // Calling this an 'error' is unintuitive, but it does the right thing. 9752 SemaRef.ActOnStmtExprError(); 9753 return SemaRef.MaybeBindToTemporary(E); 9754 } 9755 9756 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9757 SubStmt.get(), 9758 E->getRParenLoc()); 9759 } 9760 9761 template<typename Derived> 9762 ExprResult 9763 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9764 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9765 if (Cond.isInvalid()) 9766 return ExprError(); 9767 9768 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9769 if (LHS.isInvalid()) 9770 return ExprError(); 9771 9772 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9773 if (RHS.isInvalid()) 9774 return ExprError(); 9775 9776 if (!getDerived().AlwaysRebuild() && 9777 Cond.get() == E->getCond() && 9778 LHS.get() == E->getLHS() && 9779 RHS.get() == E->getRHS()) 9780 return E; 9781 9782 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9783 Cond.get(), LHS.get(), RHS.get(), 9784 E->getRParenLoc()); 9785 } 9786 9787 template<typename Derived> 9788 ExprResult 9789 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9790 return E; 9791 } 9792 9793 template<typename Derived> 9794 ExprResult 9795 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9796 switch (E->getOperator()) { 9797 case OO_New: 9798 case OO_Delete: 9799 case OO_Array_New: 9800 case OO_Array_Delete: 9801 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9802 9803 case OO_Call: { 9804 // This is a call to an object's operator(). 9805 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9806 9807 // Transform the object itself. 9808 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9809 if (Object.isInvalid()) 9810 return ExprError(); 9811 9812 // FIXME: Poor location information 9813 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9814 static_cast<Expr *>(Object.get())->getEndLoc()); 9815 9816 // Transform the call arguments. 9817 SmallVector<Expr*, 8> Args; 9818 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9819 Args)) 9820 return ExprError(); 9821 9822 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 9823 E->getEndLoc()); 9824 } 9825 9826 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9827 case OO_##Name: 9828 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9829 #include "clang/Basic/OperatorKinds.def" 9830 case OO_Subscript: 9831 // Handled below. 9832 break; 9833 9834 case OO_Conditional: 9835 llvm_unreachable("conditional operator is not actually overloadable"); 9836 9837 case OO_None: 9838 case NUM_OVERLOADED_OPERATORS: 9839 llvm_unreachable("not an overloaded operator?"); 9840 } 9841 9842 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9843 if (Callee.isInvalid()) 9844 return ExprError(); 9845 9846 ExprResult First; 9847 if (E->getOperator() == OO_Amp) 9848 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9849 else 9850 First = getDerived().TransformExpr(E->getArg(0)); 9851 if (First.isInvalid()) 9852 return ExprError(); 9853 9854 ExprResult Second; 9855 if (E->getNumArgs() == 2) { 9856 Second = getDerived().TransformExpr(E->getArg(1)); 9857 if (Second.isInvalid()) 9858 return ExprError(); 9859 } 9860 9861 if (!getDerived().AlwaysRebuild() && 9862 Callee.get() == E->getCallee() && 9863 First.get() == E->getArg(0) && 9864 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9865 return SemaRef.MaybeBindToTemporary(E); 9866 9867 Sema::FPContractStateRAII FPContractState(getSema()); 9868 getSema().FPFeatures = E->getFPFeatures(); 9869 9870 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9871 E->getOperatorLoc(), 9872 Callee.get(), 9873 First.get(), 9874 Second.get()); 9875 } 9876 9877 template<typename Derived> 9878 ExprResult 9879 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9880 return getDerived().TransformCallExpr(E); 9881 } 9882 9883 template<typename Derived> 9884 ExprResult 9885 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9886 // Transform the callee. 9887 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9888 if (Callee.isInvalid()) 9889 return ExprError(); 9890 9891 // Transform exec config. 9892 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9893 if (EC.isInvalid()) 9894 return ExprError(); 9895 9896 // Transform arguments. 9897 bool ArgChanged = false; 9898 SmallVector<Expr*, 8> Args; 9899 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9900 &ArgChanged)) 9901 return ExprError(); 9902 9903 if (!getDerived().AlwaysRebuild() && 9904 Callee.get() == E->getCallee() && 9905 !ArgChanged) 9906 return SemaRef.MaybeBindToTemporary(E); 9907 9908 // FIXME: Wrong source location information for the '('. 9909 SourceLocation FakeLParenLoc 9910 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9911 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9912 Args, 9913 E->getRParenLoc(), EC.get()); 9914 } 9915 9916 template<typename Derived> 9917 ExprResult 9918 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9919 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9920 if (!Type) 9921 return ExprError(); 9922 9923 ExprResult SubExpr 9924 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9925 if (SubExpr.isInvalid()) 9926 return ExprError(); 9927 9928 if (!getDerived().AlwaysRebuild() && 9929 Type == E->getTypeInfoAsWritten() && 9930 SubExpr.get() == E->getSubExpr()) 9931 return E; 9932 return getDerived().RebuildCXXNamedCastExpr( 9933 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9934 Type, E->getAngleBrackets().getEnd(), 9935 // FIXME. this should be '(' location 9936 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9937 } 9938 9939 template<typename Derived> 9940 ExprResult 9941 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9942 return getDerived().TransformCXXNamedCastExpr(E); 9943 } 9944 9945 template<typename Derived> 9946 ExprResult 9947 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9948 return getDerived().TransformCXXNamedCastExpr(E); 9949 } 9950 9951 template<typename Derived> 9952 ExprResult 9953 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9954 CXXReinterpretCastExpr *E) { 9955 return getDerived().TransformCXXNamedCastExpr(E); 9956 } 9957 9958 template<typename Derived> 9959 ExprResult 9960 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9961 return getDerived().TransformCXXNamedCastExpr(E); 9962 } 9963 9964 template<typename Derived> 9965 ExprResult 9966 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9967 CXXFunctionalCastExpr *E) { 9968 TypeSourceInfo *Type = 9969 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 9970 if (!Type) 9971 return ExprError(); 9972 9973 ExprResult SubExpr 9974 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9975 if (SubExpr.isInvalid()) 9976 return ExprError(); 9977 9978 if (!getDerived().AlwaysRebuild() && 9979 Type == E->getTypeInfoAsWritten() && 9980 SubExpr.get() == E->getSubExpr()) 9981 return E; 9982 9983 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9984 E->getLParenLoc(), 9985 SubExpr.get(), 9986 E->getRParenLoc(), 9987 E->isListInitialization()); 9988 } 9989 9990 template<typename Derived> 9991 ExprResult 9992 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9993 if (E->isTypeOperand()) { 9994 TypeSourceInfo *TInfo 9995 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9996 if (!TInfo) 9997 return ExprError(); 9998 9999 if (!getDerived().AlwaysRebuild() && 10000 TInfo == E->getTypeOperandSourceInfo()) 10001 return E; 10002 10003 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10004 TInfo, E->getEndLoc()); 10005 } 10006 10007 // We don't know whether the subexpression is potentially evaluated until 10008 // after we perform semantic analysis. We speculatively assume it is 10009 // unevaluated; it will get fixed later if the subexpression is in fact 10010 // potentially evaluated. 10011 EnterExpressionEvaluationContext Unevaluated( 10012 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10013 Sema::ReuseLambdaContextDecl); 10014 10015 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10016 if (SubExpr.isInvalid()) 10017 return ExprError(); 10018 10019 if (!getDerived().AlwaysRebuild() && 10020 SubExpr.get() == E->getExprOperand()) 10021 return E; 10022 10023 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10024 SubExpr.get(), E->getEndLoc()); 10025 } 10026 10027 template<typename Derived> 10028 ExprResult 10029 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10030 if (E->isTypeOperand()) { 10031 TypeSourceInfo *TInfo 10032 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10033 if (!TInfo) 10034 return ExprError(); 10035 10036 if (!getDerived().AlwaysRebuild() && 10037 TInfo == E->getTypeOperandSourceInfo()) 10038 return E; 10039 10040 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10041 TInfo, E->getEndLoc()); 10042 } 10043 10044 EnterExpressionEvaluationContext Unevaluated( 10045 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10046 10047 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10048 if (SubExpr.isInvalid()) 10049 return ExprError(); 10050 10051 if (!getDerived().AlwaysRebuild() && 10052 SubExpr.get() == E->getExprOperand()) 10053 return E; 10054 10055 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10056 SubExpr.get(), E->getEndLoc()); 10057 } 10058 10059 template<typename Derived> 10060 ExprResult 10061 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10062 return E; 10063 } 10064 10065 template<typename Derived> 10066 ExprResult 10067 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10068 CXXNullPtrLiteralExpr *E) { 10069 return E; 10070 } 10071 10072 template<typename Derived> 10073 ExprResult 10074 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10075 QualType T = getSema().getCurrentThisType(); 10076 10077 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10078 // Make sure that we capture 'this'. 10079 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10080 return E; 10081 } 10082 10083 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10084 } 10085 10086 template<typename Derived> 10087 ExprResult 10088 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10089 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10090 if (SubExpr.isInvalid()) 10091 return ExprError(); 10092 10093 if (!getDerived().AlwaysRebuild() && 10094 SubExpr.get() == E->getSubExpr()) 10095 return E; 10096 10097 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10098 E->isThrownVariableInScope()); 10099 } 10100 10101 template<typename Derived> 10102 ExprResult 10103 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10104 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10105 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10106 if (!Param) 10107 return ExprError(); 10108 10109 if (!getDerived().AlwaysRebuild() && 10110 Param == E->getParam()) 10111 return E; 10112 10113 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10114 } 10115 10116 template<typename Derived> 10117 ExprResult 10118 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10119 FieldDecl *Field = cast_or_null<FieldDecl>( 10120 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10121 if (!Field) 10122 return ExprError(); 10123 10124 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10125 return E; 10126 10127 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10128 } 10129 10130 template<typename Derived> 10131 ExprResult 10132 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10133 CXXScalarValueInitExpr *E) { 10134 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10135 if (!T) 10136 return ExprError(); 10137 10138 if (!getDerived().AlwaysRebuild() && 10139 T == E->getTypeSourceInfo()) 10140 return E; 10141 10142 return getDerived().RebuildCXXScalarValueInitExpr(T, 10143 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10144 E->getRParenLoc()); 10145 } 10146 10147 template<typename Derived> 10148 ExprResult 10149 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10150 // Transform the type that we're allocating 10151 TypeSourceInfo *AllocTypeInfo = 10152 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10153 if (!AllocTypeInfo) 10154 return ExprError(); 10155 10156 // Transform the size of the array we're allocating (if any). 10157 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10158 if (ArraySize.isInvalid()) 10159 return ExprError(); 10160 10161 // Transform the placement arguments (if any). 10162 bool ArgumentChanged = false; 10163 SmallVector<Expr*, 8> PlacementArgs; 10164 if (getDerived().TransformExprs(E->getPlacementArgs(), 10165 E->getNumPlacementArgs(), true, 10166 PlacementArgs, &ArgumentChanged)) 10167 return ExprError(); 10168 10169 // Transform the initializer (if any). 10170 Expr *OldInit = E->getInitializer(); 10171 ExprResult NewInit; 10172 if (OldInit) 10173 NewInit = getDerived().TransformInitializer(OldInit, true); 10174 if (NewInit.isInvalid()) 10175 return ExprError(); 10176 10177 // Transform new operator and delete operator. 10178 FunctionDecl *OperatorNew = nullptr; 10179 if (E->getOperatorNew()) { 10180 OperatorNew = cast_or_null<FunctionDecl>( 10181 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10182 if (!OperatorNew) 10183 return ExprError(); 10184 } 10185 10186 FunctionDecl *OperatorDelete = nullptr; 10187 if (E->getOperatorDelete()) { 10188 OperatorDelete = cast_or_null<FunctionDecl>( 10189 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10190 if (!OperatorDelete) 10191 return ExprError(); 10192 } 10193 10194 if (!getDerived().AlwaysRebuild() && 10195 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10196 ArraySize.get() == E->getArraySize() && 10197 NewInit.get() == OldInit && 10198 OperatorNew == E->getOperatorNew() && 10199 OperatorDelete == E->getOperatorDelete() && 10200 !ArgumentChanged) { 10201 // Mark any declarations we need as referenced. 10202 // FIXME: instantiation-specific. 10203 if (OperatorNew) 10204 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10205 if (OperatorDelete) 10206 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10207 10208 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10209 QualType ElementType 10210 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10211 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10212 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10213 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10214 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10215 } 10216 } 10217 } 10218 10219 return E; 10220 } 10221 10222 QualType AllocType = AllocTypeInfo->getType(); 10223 if (!ArraySize.get()) { 10224 // If no array size was specified, but the new expression was 10225 // instantiated with an array type (e.g., "new T" where T is 10226 // instantiated with "int[4]"), extract the outer bound from the 10227 // array type as our array size. We do this with constant and 10228 // dependently-sized array types. 10229 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10230 if (!ArrayT) { 10231 // Do nothing 10232 } else if (const ConstantArrayType *ConsArrayT 10233 = dyn_cast<ConstantArrayType>(ArrayT)) { 10234 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10235 SemaRef.Context.getSizeType(), 10236 /*FIXME:*/ E->getBeginLoc()); 10237 AllocType = ConsArrayT->getElementType(); 10238 } else if (const DependentSizedArrayType *DepArrayT 10239 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10240 if (DepArrayT->getSizeExpr()) { 10241 ArraySize = DepArrayT->getSizeExpr(); 10242 AllocType = DepArrayT->getElementType(); 10243 } 10244 } 10245 } 10246 10247 return getDerived().RebuildCXXNewExpr( 10248 E->getBeginLoc(), E->isGlobalNew(), 10249 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10250 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10251 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10252 } 10253 10254 template<typename Derived> 10255 ExprResult 10256 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10257 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10258 if (Operand.isInvalid()) 10259 return ExprError(); 10260 10261 // Transform the delete operator, if known. 10262 FunctionDecl *OperatorDelete = nullptr; 10263 if (E->getOperatorDelete()) { 10264 OperatorDelete = cast_or_null<FunctionDecl>( 10265 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10266 if (!OperatorDelete) 10267 return ExprError(); 10268 } 10269 10270 if (!getDerived().AlwaysRebuild() && 10271 Operand.get() == E->getArgument() && 10272 OperatorDelete == E->getOperatorDelete()) { 10273 // Mark any declarations we need as referenced. 10274 // FIXME: instantiation-specific. 10275 if (OperatorDelete) 10276 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10277 10278 if (!E->getArgument()->isTypeDependent()) { 10279 QualType Destroyed = SemaRef.Context.getBaseElementType( 10280 E->getDestroyedType()); 10281 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10282 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10283 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10284 SemaRef.LookupDestructor(Record)); 10285 } 10286 } 10287 10288 return E; 10289 } 10290 10291 return getDerived().RebuildCXXDeleteExpr( 10292 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10293 } 10294 10295 template<typename Derived> 10296 ExprResult 10297 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10298 CXXPseudoDestructorExpr *E) { 10299 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10300 if (Base.isInvalid()) 10301 return ExprError(); 10302 10303 ParsedType ObjectTypePtr; 10304 bool MayBePseudoDestructor = false; 10305 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10306 E->getOperatorLoc(), 10307 E->isArrow()? tok::arrow : tok::period, 10308 ObjectTypePtr, 10309 MayBePseudoDestructor); 10310 if (Base.isInvalid()) 10311 return ExprError(); 10312 10313 QualType ObjectType = ObjectTypePtr.get(); 10314 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10315 if (QualifierLoc) { 10316 QualifierLoc 10317 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10318 if (!QualifierLoc) 10319 return ExprError(); 10320 } 10321 CXXScopeSpec SS; 10322 SS.Adopt(QualifierLoc); 10323 10324 PseudoDestructorTypeStorage Destroyed; 10325 if (E->getDestroyedTypeInfo()) { 10326 TypeSourceInfo *DestroyedTypeInfo 10327 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10328 ObjectType, nullptr, SS); 10329 if (!DestroyedTypeInfo) 10330 return ExprError(); 10331 Destroyed = DestroyedTypeInfo; 10332 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10333 // We aren't likely to be able to resolve the identifier down to a type 10334 // now anyway, so just retain the identifier. 10335 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10336 E->getDestroyedTypeLoc()); 10337 } else { 10338 // Look for a destructor known with the given name. 10339 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10340 *E->getDestroyedTypeIdentifier(), 10341 E->getDestroyedTypeLoc(), 10342 /*Scope=*/nullptr, 10343 SS, ObjectTypePtr, 10344 false); 10345 if (!T) 10346 return ExprError(); 10347 10348 Destroyed 10349 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10350 E->getDestroyedTypeLoc()); 10351 } 10352 10353 TypeSourceInfo *ScopeTypeInfo = nullptr; 10354 if (E->getScopeTypeInfo()) { 10355 CXXScopeSpec EmptySS; 10356 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10357 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10358 if (!ScopeTypeInfo) 10359 return ExprError(); 10360 } 10361 10362 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10363 E->getOperatorLoc(), 10364 E->isArrow(), 10365 SS, 10366 ScopeTypeInfo, 10367 E->getColonColonLoc(), 10368 E->getTildeLoc(), 10369 Destroyed); 10370 } 10371 10372 template <typename Derived> 10373 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10374 bool RequiresADL, 10375 LookupResult &R) { 10376 // Transform all the decls. 10377 bool AllEmptyPacks = true; 10378 for (auto *OldD : Old->decls()) { 10379 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10380 if (!InstD) { 10381 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10382 // This can happen because of dependent hiding. 10383 if (isa<UsingShadowDecl>(OldD)) 10384 continue; 10385 else { 10386 R.clear(); 10387 return true; 10388 } 10389 } 10390 10391 // Expand using pack declarations. 10392 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10393 ArrayRef<NamedDecl*> Decls = SingleDecl; 10394 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10395 Decls = UPD->expansions(); 10396 10397 // Expand using declarations. 10398 for (auto *D : Decls) { 10399 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10400 for (auto *SD : UD->shadows()) 10401 R.addDecl(SD); 10402 } else { 10403 R.addDecl(D); 10404 } 10405 } 10406 10407 AllEmptyPacks &= Decls.empty(); 10408 }; 10409 10410 // C++ [temp.res]/8.4.2: 10411 // The program is ill-formed, no diagnostic required, if [...] lookup for 10412 // a name in the template definition found a using-declaration, but the 10413 // lookup in the corresponding scope in the instantiation odoes not find 10414 // any declarations because the using-declaration was a pack expansion and 10415 // the corresponding pack is empty 10416 if (AllEmptyPacks && !RequiresADL) { 10417 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10418 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10419 return true; 10420 } 10421 10422 // Resolve a kind, but don't do any further analysis. If it's 10423 // ambiguous, the callee needs to deal with it. 10424 R.resolveKind(); 10425 return false; 10426 } 10427 10428 template<typename Derived> 10429 ExprResult 10430 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10431 UnresolvedLookupExpr *Old) { 10432 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10433 Sema::LookupOrdinaryName); 10434 10435 // Transform the declaration set. 10436 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10437 return ExprError(); 10438 10439 // Rebuild the nested-name qualifier, if present. 10440 CXXScopeSpec SS; 10441 if (Old->getQualifierLoc()) { 10442 NestedNameSpecifierLoc QualifierLoc 10443 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10444 if (!QualifierLoc) 10445 return ExprError(); 10446 10447 SS.Adopt(QualifierLoc); 10448 } 10449 10450 if (Old->getNamingClass()) { 10451 CXXRecordDecl *NamingClass 10452 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10453 Old->getNameLoc(), 10454 Old->getNamingClass())); 10455 if (!NamingClass) { 10456 R.clear(); 10457 return ExprError(); 10458 } 10459 10460 R.setNamingClass(NamingClass); 10461 } 10462 10463 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10464 10465 // If we have neither explicit template arguments, nor the template keyword, 10466 // it's a normal declaration name or member reference. 10467 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10468 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10469 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10470 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10471 // give a good diagnostic. 10472 if (D && D->isCXXInstanceMember()) { 10473 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10474 /*TemplateArgs=*/nullptr, 10475 /*Scope=*/nullptr); 10476 } 10477 10478 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10479 } 10480 10481 // If we have template arguments, rebuild them, then rebuild the 10482 // templateid expression. 10483 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10484 if (Old->hasExplicitTemplateArgs() && 10485 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10486 Old->getNumTemplateArgs(), 10487 TransArgs)) { 10488 R.clear(); 10489 return ExprError(); 10490 } 10491 10492 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10493 Old->requiresADL(), &TransArgs); 10494 } 10495 10496 template<typename Derived> 10497 ExprResult 10498 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10499 bool ArgChanged = false; 10500 SmallVector<TypeSourceInfo *, 4> Args; 10501 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10502 TypeSourceInfo *From = E->getArg(I); 10503 TypeLoc FromTL = From->getTypeLoc(); 10504 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10505 TypeLocBuilder TLB; 10506 TLB.reserve(FromTL.getFullDataSize()); 10507 QualType To = getDerived().TransformType(TLB, FromTL); 10508 if (To.isNull()) 10509 return ExprError(); 10510 10511 if (To == From->getType()) 10512 Args.push_back(From); 10513 else { 10514 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10515 ArgChanged = true; 10516 } 10517 continue; 10518 } 10519 10520 ArgChanged = true; 10521 10522 // We have a pack expansion. Instantiate it. 10523 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10524 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10525 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10526 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10527 10528 // Determine whether the set of unexpanded parameter packs can and should 10529 // be expanded. 10530 bool Expand = true; 10531 bool RetainExpansion = false; 10532 Optional<unsigned> OrigNumExpansions = 10533 ExpansionTL.getTypePtr()->getNumExpansions(); 10534 Optional<unsigned> NumExpansions = OrigNumExpansions; 10535 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10536 PatternTL.getSourceRange(), 10537 Unexpanded, 10538 Expand, RetainExpansion, 10539 NumExpansions)) 10540 return ExprError(); 10541 10542 if (!Expand) { 10543 // The transform has determined that we should perform a simple 10544 // transformation on the pack expansion, producing another pack 10545 // expansion. 10546 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10547 10548 TypeLocBuilder TLB; 10549 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10550 10551 QualType To = getDerived().TransformType(TLB, PatternTL); 10552 if (To.isNull()) 10553 return ExprError(); 10554 10555 To = getDerived().RebuildPackExpansionType(To, 10556 PatternTL.getSourceRange(), 10557 ExpansionTL.getEllipsisLoc(), 10558 NumExpansions); 10559 if (To.isNull()) 10560 return ExprError(); 10561 10562 PackExpansionTypeLoc ToExpansionTL 10563 = TLB.push<PackExpansionTypeLoc>(To); 10564 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10565 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10566 continue; 10567 } 10568 10569 // Expand the pack expansion by substituting for each argument in the 10570 // pack(s). 10571 for (unsigned I = 0; I != *NumExpansions; ++I) { 10572 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10573 TypeLocBuilder TLB; 10574 TLB.reserve(PatternTL.getFullDataSize()); 10575 QualType To = getDerived().TransformType(TLB, PatternTL); 10576 if (To.isNull()) 10577 return ExprError(); 10578 10579 if (To->containsUnexpandedParameterPack()) { 10580 To = getDerived().RebuildPackExpansionType(To, 10581 PatternTL.getSourceRange(), 10582 ExpansionTL.getEllipsisLoc(), 10583 NumExpansions); 10584 if (To.isNull()) 10585 return ExprError(); 10586 10587 PackExpansionTypeLoc ToExpansionTL 10588 = TLB.push<PackExpansionTypeLoc>(To); 10589 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10590 } 10591 10592 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10593 } 10594 10595 if (!RetainExpansion) 10596 continue; 10597 10598 // If we're supposed to retain a pack expansion, do so by temporarily 10599 // forgetting the partially-substituted parameter pack. 10600 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10601 10602 TypeLocBuilder TLB; 10603 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10604 10605 QualType To = getDerived().TransformType(TLB, PatternTL); 10606 if (To.isNull()) 10607 return ExprError(); 10608 10609 To = getDerived().RebuildPackExpansionType(To, 10610 PatternTL.getSourceRange(), 10611 ExpansionTL.getEllipsisLoc(), 10612 NumExpansions); 10613 if (To.isNull()) 10614 return ExprError(); 10615 10616 PackExpansionTypeLoc ToExpansionTL 10617 = TLB.push<PackExpansionTypeLoc>(To); 10618 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10619 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10620 } 10621 10622 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10623 return E; 10624 10625 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10626 E->getEndLoc()); 10627 } 10628 10629 template<typename Derived> 10630 ExprResult 10631 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10632 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10633 if (!T) 10634 return ExprError(); 10635 10636 if (!getDerived().AlwaysRebuild() && 10637 T == E->getQueriedTypeSourceInfo()) 10638 return E; 10639 10640 ExprResult SubExpr; 10641 { 10642 EnterExpressionEvaluationContext Unevaluated( 10643 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10644 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10645 if (SubExpr.isInvalid()) 10646 return ExprError(); 10647 10648 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10649 return E; 10650 } 10651 10652 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10653 SubExpr.get(), E->getEndLoc()); 10654 } 10655 10656 template<typename Derived> 10657 ExprResult 10658 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10659 ExprResult SubExpr; 10660 { 10661 EnterExpressionEvaluationContext Unevaluated( 10662 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10663 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10664 if (SubExpr.isInvalid()) 10665 return ExprError(); 10666 10667 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10668 return E; 10669 } 10670 10671 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10672 SubExpr.get(), E->getEndLoc()); 10673 } 10674 10675 template <typename Derived> 10676 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10677 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10678 TypeSourceInfo **RecoveryTSI) { 10679 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10680 DRE, AddrTaken, RecoveryTSI); 10681 10682 // Propagate both errors and recovered types, which return ExprEmpty. 10683 if (!NewDRE.isUsable()) 10684 return NewDRE; 10685 10686 // We got an expr, wrap it up in parens. 10687 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10688 return PE; 10689 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10690 PE->getRParen()); 10691 } 10692 10693 template <typename Derived> 10694 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10695 DependentScopeDeclRefExpr *E) { 10696 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10697 nullptr); 10698 } 10699 10700 template<typename Derived> 10701 ExprResult 10702 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10703 DependentScopeDeclRefExpr *E, 10704 bool IsAddressOfOperand, 10705 TypeSourceInfo **RecoveryTSI) { 10706 assert(E->getQualifierLoc()); 10707 NestedNameSpecifierLoc QualifierLoc 10708 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10709 if (!QualifierLoc) 10710 return ExprError(); 10711 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10712 10713 // TODO: If this is a conversion-function-id, verify that the 10714 // destination type name (if present) resolves the same way after 10715 // instantiation as it did in the local scope. 10716 10717 DeclarationNameInfo NameInfo 10718 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10719 if (!NameInfo.getName()) 10720 return ExprError(); 10721 10722 if (!E->hasExplicitTemplateArgs()) { 10723 if (!getDerived().AlwaysRebuild() && 10724 QualifierLoc == E->getQualifierLoc() && 10725 // Note: it is sufficient to compare the Name component of NameInfo: 10726 // if name has not changed, DNLoc has not changed either. 10727 NameInfo.getName() == E->getDeclName()) 10728 return E; 10729 10730 return getDerived().RebuildDependentScopeDeclRefExpr( 10731 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10732 IsAddressOfOperand, RecoveryTSI); 10733 } 10734 10735 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10736 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10737 E->getNumTemplateArgs(), 10738 TransArgs)) 10739 return ExprError(); 10740 10741 return getDerived().RebuildDependentScopeDeclRefExpr( 10742 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10743 RecoveryTSI); 10744 } 10745 10746 template<typename Derived> 10747 ExprResult 10748 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10749 // CXXConstructExprs other than for list-initialization and 10750 // CXXTemporaryObjectExpr are always implicit, so when we have 10751 // a 1-argument construction we just transform that argument. 10752 if ((E->getNumArgs() == 1 || 10753 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10754 (!getDerived().DropCallArgument(E->getArg(0))) && 10755 !E->isListInitialization()) 10756 return getDerived().TransformExpr(E->getArg(0)); 10757 10758 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10759 10760 QualType T = getDerived().TransformType(E->getType()); 10761 if (T.isNull()) 10762 return ExprError(); 10763 10764 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10765 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10766 if (!Constructor) 10767 return ExprError(); 10768 10769 bool ArgumentChanged = false; 10770 SmallVector<Expr*, 8> Args; 10771 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10772 &ArgumentChanged)) 10773 return ExprError(); 10774 10775 if (!getDerived().AlwaysRebuild() && 10776 T == E->getType() && 10777 Constructor == E->getConstructor() && 10778 !ArgumentChanged) { 10779 // Mark the constructor as referenced. 10780 // FIXME: Instantiation-specific 10781 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10782 return E; 10783 } 10784 10785 return getDerived().RebuildCXXConstructExpr( 10786 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 10787 E->hadMultipleCandidates(), E->isListInitialization(), 10788 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 10789 E->getConstructionKind(), E->getParenOrBraceRange()); 10790 } 10791 10792 template<typename Derived> 10793 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10794 CXXInheritedCtorInitExpr *E) { 10795 QualType T = getDerived().TransformType(E->getType()); 10796 if (T.isNull()) 10797 return ExprError(); 10798 10799 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10800 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10801 if (!Constructor) 10802 return ExprError(); 10803 10804 if (!getDerived().AlwaysRebuild() && 10805 T == E->getType() && 10806 Constructor == E->getConstructor()) { 10807 // Mark the constructor as referenced. 10808 // FIXME: Instantiation-specific 10809 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10810 return E; 10811 } 10812 10813 return getDerived().RebuildCXXInheritedCtorInitExpr( 10814 T, E->getLocation(), Constructor, 10815 E->constructsVBase(), E->inheritedFromVBase()); 10816 } 10817 10818 /// Transform a C++ temporary-binding expression. 10819 /// 10820 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10821 /// transform the subexpression and return that. 10822 template<typename Derived> 10823 ExprResult 10824 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10825 return getDerived().TransformExpr(E->getSubExpr()); 10826 } 10827 10828 /// Transform a C++ expression that contains cleanups that should 10829 /// be run after the expression is evaluated. 10830 /// 10831 /// Since ExprWithCleanups nodes are implicitly generated, we 10832 /// just transform the subexpression and return that. 10833 template<typename Derived> 10834 ExprResult 10835 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10836 return getDerived().TransformExpr(E->getSubExpr()); 10837 } 10838 10839 template<typename Derived> 10840 ExprResult 10841 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10842 CXXTemporaryObjectExpr *E) { 10843 TypeSourceInfo *T = 10844 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10845 if (!T) 10846 return ExprError(); 10847 10848 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10849 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10850 if (!Constructor) 10851 return ExprError(); 10852 10853 bool ArgumentChanged = false; 10854 SmallVector<Expr*, 8> Args; 10855 Args.reserve(E->getNumArgs()); 10856 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10857 &ArgumentChanged)) 10858 return ExprError(); 10859 10860 if (!getDerived().AlwaysRebuild() && 10861 T == E->getTypeSourceInfo() && 10862 Constructor == E->getConstructor() && 10863 !ArgumentChanged) { 10864 // FIXME: Instantiation-specific 10865 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10866 return SemaRef.MaybeBindToTemporary(E); 10867 } 10868 10869 // FIXME: We should just pass E->isListInitialization(), but we're not 10870 // prepared to handle list-initialization without a child InitListExpr. 10871 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 10872 return getDerived().RebuildCXXTemporaryObjectExpr( 10873 T, LParenLoc, Args, E->getEndLoc(), 10874 /*ListInitialization=*/LParenLoc.isInvalid()); 10875 } 10876 10877 template<typename Derived> 10878 ExprResult 10879 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10880 // Transform any init-capture expressions before entering the scope of the 10881 // lambda body, because they are not semantically within that scope. 10882 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10883 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10884 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10885 E->explicit_capture_begin()); 10886 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10887 CEnd = E->capture_end(); 10888 C != CEnd; ++C) { 10889 if (!E->isInitCapture(C)) 10890 continue; 10891 EnterExpressionEvaluationContext EEEC( 10892 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10893 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10894 C->getCapturedVar()->getInit(), 10895 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10896 10897 if (NewExprInitResult.isInvalid()) 10898 return ExprError(); 10899 Expr *NewExprInit = NewExprInitResult.get(); 10900 10901 VarDecl *OldVD = C->getCapturedVar(); 10902 QualType NewInitCaptureType = 10903 getSema().buildLambdaInitCaptureInitialization( 10904 C->getLocation(), OldVD->getType()->isReferenceType(), 10905 OldVD->getIdentifier(), 10906 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10907 NewExprInitResult = NewExprInit; 10908 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10909 std::make_pair(NewExprInitResult, NewInitCaptureType); 10910 } 10911 10912 // Transform the template parameters, and add them to the current 10913 // instantiation scope. The null case is handled correctly. 10914 auto TPL = getDerived().TransformTemplateParameterList( 10915 E->getTemplateParameterList()); 10916 10917 // Transform the type of the original lambda's call operator. 10918 // The transformation MUST be done in the CurrentInstantiationScope since 10919 // it introduces a mapping of the original to the newly created 10920 // transformed parameters. 10921 TypeSourceInfo *NewCallOpTSI = nullptr; 10922 { 10923 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10924 FunctionProtoTypeLoc OldCallOpFPTL = 10925 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10926 10927 TypeLocBuilder NewCallOpTLBuilder; 10928 SmallVector<QualType, 4> ExceptionStorage; 10929 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10930 QualType NewCallOpType = TransformFunctionProtoType( 10931 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10932 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10933 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10934 ExceptionStorage, Changed); 10935 }); 10936 if (NewCallOpType.isNull()) 10937 return ExprError(); 10938 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10939 NewCallOpType); 10940 } 10941 10942 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10943 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10944 LSI->GLTemplateParameterList = TPL; 10945 10946 // Create the local class that will describe the lambda. 10947 CXXRecordDecl *Class 10948 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10949 NewCallOpTSI, 10950 /*KnownDependent=*/false, 10951 E->getCaptureDefault()); 10952 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10953 10954 // Build the call operator. 10955 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10956 Class, E->getIntroducerRange(), NewCallOpTSI, 10957 E->getCallOperator()->getEndLoc(), 10958 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10959 E->getCallOperator()->isConstexpr()); 10960 10961 LSI->CallOperator = NewCallOperator; 10962 10963 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 10964 I != NumParams; ++I) { 10965 auto *P = NewCallOperator->getParamDecl(I); 10966 if (P->hasUninstantiatedDefaultArg()) { 10967 EnterExpressionEvaluationContext Eval( 10968 getSema(), 10969 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 10970 ExprResult R = getDerived().TransformExpr( 10971 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 10972 P->setDefaultArg(R.get()); 10973 } 10974 } 10975 10976 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10977 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10978 10979 // Introduce the context of the call operator. 10980 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10981 /*NewThisContext*/false); 10982 10983 // Enter the scope of the lambda. 10984 getSema().buildLambdaScope(LSI, NewCallOperator, 10985 E->getIntroducerRange(), 10986 E->getCaptureDefault(), 10987 E->getCaptureDefaultLoc(), 10988 E->hasExplicitParameters(), 10989 E->hasExplicitResultType(), 10990 E->isMutable()); 10991 10992 bool Invalid = false; 10993 10994 // Transform captures. 10995 bool FinishedExplicitCaptures = false; 10996 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10997 CEnd = E->capture_end(); 10998 C != CEnd; ++C) { 10999 // When we hit the first implicit capture, tell Sema that we've finished 11000 // the list of explicit captures. 11001 if (!FinishedExplicitCaptures && C->isImplicit()) { 11002 getSema().finishLambdaExplicitCaptures(LSI); 11003 FinishedExplicitCaptures = true; 11004 } 11005 11006 // Capturing 'this' is trivial. 11007 if (C->capturesThis()) { 11008 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11009 /*BuildAndDiagnose*/ true, nullptr, 11010 C->getCaptureKind() == LCK_StarThis); 11011 continue; 11012 } 11013 // Captured expression will be recaptured during captured variables 11014 // rebuilding. 11015 if (C->capturesVLAType()) 11016 continue; 11017 11018 // Rebuild init-captures, including the implied field declaration. 11019 if (E->isInitCapture(C)) { 11020 InitCaptureInfoTy InitExprTypePair = 11021 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11022 ExprResult Init = InitExprTypePair.first; 11023 QualType InitQualType = InitExprTypePair.second; 11024 if (Init.isInvalid() || InitQualType.isNull()) { 11025 Invalid = true; 11026 continue; 11027 } 11028 VarDecl *OldVD = C->getCapturedVar(); 11029 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11030 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11031 OldVD->getInitStyle(), Init.get()); 11032 if (!NewVD) 11033 Invalid = true; 11034 else { 11035 getDerived().transformedLocalDecl(OldVD, NewVD); 11036 } 11037 getSema().buildInitCaptureField(LSI, NewVD); 11038 continue; 11039 } 11040 11041 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11042 11043 // Determine the capture kind for Sema. 11044 Sema::TryCaptureKind Kind 11045 = C->isImplicit()? Sema::TryCapture_Implicit 11046 : C->getCaptureKind() == LCK_ByCopy 11047 ? Sema::TryCapture_ExplicitByVal 11048 : Sema::TryCapture_ExplicitByRef; 11049 SourceLocation EllipsisLoc; 11050 if (C->isPackExpansion()) { 11051 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11052 bool ShouldExpand = false; 11053 bool RetainExpansion = false; 11054 Optional<unsigned> NumExpansions; 11055 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11056 C->getLocation(), 11057 Unexpanded, 11058 ShouldExpand, RetainExpansion, 11059 NumExpansions)) { 11060 Invalid = true; 11061 continue; 11062 } 11063 11064 if (ShouldExpand) { 11065 // The transform has determined that we should perform an expansion; 11066 // transform and capture each of the arguments. 11067 // expansion of the pattern. Do so. 11068 VarDecl *Pack = C->getCapturedVar(); 11069 for (unsigned I = 0; I != *NumExpansions; ++I) { 11070 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11071 VarDecl *CapturedVar 11072 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11073 Pack)); 11074 if (!CapturedVar) { 11075 Invalid = true; 11076 continue; 11077 } 11078 11079 // Capture the transformed variable. 11080 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11081 } 11082 11083 // FIXME: Retain a pack expansion if RetainExpansion is true. 11084 11085 continue; 11086 } 11087 11088 EllipsisLoc = C->getEllipsisLoc(); 11089 } 11090 11091 // Transform the captured variable. 11092 VarDecl *CapturedVar 11093 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11094 C->getCapturedVar())); 11095 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11096 Invalid = true; 11097 continue; 11098 } 11099 11100 // Capture the transformed variable. 11101 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11102 EllipsisLoc); 11103 } 11104 if (!FinishedExplicitCaptures) 11105 getSema().finishLambdaExplicitCaptures(LSI); 11106 11107 // Enter a new evaluation context to insulate the lambda from any 11108 // cleanups from the enclosing full-expression. 11109 getSema().PushExpressionEvaluationContext( 11110 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11111 11112 // Instantiate the body of the lambda expression. 11113 StmtResult Body = 11114 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11115 11116 // ActOnLambda* will pop the function scope for us. 11117 FuncScopeCleanup.disable(); 11118 11119 if (Body.isInvalid()) { 11120 SavedContext.pop(); 11121 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11122 /*IsInstantiation=*/true); 11123 return ExprError(); 11124 } 11125 11126 // Copy the LSI before ActOnFinishFunctionBody removes it. 11127 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11128 // the call operator. 11129 auto LSICopy = *LSI; 11130 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11131 /*IsInstantiation*/ true); 11132 SavedContext.pop(); 11133 11134 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11135 &LSICopy); 11136 } 11137 11138 template<typename Derived> 11139 ExprResult 11140 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11141 CXXUnresolvedConstructExpr *E) { 11142 TypeSourceInfo *T = 11143 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11144 if (!T) 11145 return ExprError(); 11146 11147 bool ArgumentChanged = false; 11148 SmallVector<Expr*, 8> Args; 11149 Args.reserve(E->arg_size()); 11150 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11151 &ArgumentChanged)) 11152 return ExprError(); 11153 11154 if (!getDerived().AlwaysRebuild() && 11155 T == E->getTypeSourceInfo() && 11156 !ArgumentChanged) 11157 return E; 11158 11159 // FIXME: we're faking the locations of the commas 11160 return getDerived().RebuildCXXUnresolvedConstructExpr( 11161 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11162 } 11163 11164 template<typename Derived> 11165 ExprResult 11166 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11167 CXXDependentScopeMemberExpr *E) { 11168 // Transform the base of the expression. 11169 ExprResult Base((Expr*) nullptr); 11170 Expr *OldBase; 11171 QualType BaseType; 11172 QualType ObjectType; 11173 if (!E->isImplicitAccess()) { 11174 OldBase = E->getBase(); 11175 Base = getDerived().TransformExpr(OldBase); 11176 if (Base.isInvalid()) 11177 return ExprError(); 11178 11179 // Start the member reference and compute the object's type. 11180 ParsedType ObjectTy; 11181 bool MayBePseudoDestructor = false; 11182 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11183 E->getOperatorLoc(), 11184 E->isArrow()? tok::arrow : tok::period, 11185 ObjectTy, 11186 MayBePseudoDestructor); 11187 if (Base.isInvalid()) 11188 return ExprError(); 11189 11190 ObjectType = ObjectTy.get(); 11191 BaseType = ((Expr*) Base.get())->getType(); 11192 } else { 11193 OldBase = nullptr; 11194 BaseType = getDerived().TransformType(E->getBaseType()); 11195 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11196 } 11197 11198 // Transform the first part of the nested-name-specifier that qualifies 11199 // the member name. 11200 NamedDecl *FirstQualifierInScope 11201 = getDerived().TransformFirstQualifierInScope( 11202 E->getFirstQualifierFoundInScope(), 11203 E->getQualifierLoc().getBeginLoc()); 11204 11205 NestedNameSpecifierLoc QualifierLoc; 11206 if (E->getQualifier()) { 11207 QualifierLoc 11208 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11209 ObjectType, 11210 FirstQualifierInScope); 11211 if (!QualifierLoc) 11212 return ExprError(); 11213 } 11214 11215 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11216 11217 // TODO: If this is a conversion-function-id, verify that the 11218 // destination type name (if present) resolves the same way after 11219 // instantiation as it did in the local scope. 11220 11221 DeclarationNameInfo NameInfo 11222 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11223 if (!NameInfo.getName()) 11224 return ExprError(); 11225 11226 if (!E->hasExplicitTemplateArgs()) { 11227 // This is a reference to a member without an explicitly-specified 11228 // template argument list. Optimize for this common case. 11229 if (!getDerived().AlwaysRebuild() && 11230 Base.get() == OldBase && 11231 BaseType == E->getBaseType() && 11232 QualifierLoc == E->getQualifierLoc() && 11233 NameInfo.getName() == E->getMember() && 11234 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11235 return E; 11236 11237 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11238 BaseType, 11239 E->isArrow(), 11240 E->getOperatorLoc(), 11241 QualifierLoc, 11242 TemplateKWLoc, 11243 FirstQualifierInScope, 11244 NameInfo, 11245 /*TemplateArgs*/nullptr); 11246 } 11247 11248 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11249 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11250 E->getNumTemplateArgs(), 11251 TransArgs)) 11252 return ExprError(); 11253 11254 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11255 BaseType, 11256 E->isArrow(), 11257 E->getOperatorLoc(), 11258 QualifierLoc, 11259 TemplateKWLoc, 11260 FirstQualifierInScope, 11261 NameInfo, 11262 &TransArgs); 11263 } 11264 11265 template<typename Derived> 11266 ExprResult 11267 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11268 // Transform the base of the expression. 11269 ExprResult Base((Expr*) nullptr); 11270 QualType BaseType; 11271 if (!Old->isImplicitAccess()) { 11272 Base = getDerived().TransformExpr(Old->getBase()); 11273 if (Base.isInvalid()) 11274 return ExprError(); 11275 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11276 Old->isArrow()); 11277 if (Base.isInvalid()) 11278 return ExprError(); 11279 BaseType = Base.get()->getType(); 11280 } else { 11281 BaseType = getDerived().TransformType(Old->getBaseType()); 11282 } 11283 11284 NestedNameSpecifierLoc QualifierLoc; 11285 if (Old->getQualifierLoc()) { 11286 QualifierLoc 11287 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11288 if (!QualifierLoc) 11289 return ExprError(); 11290 } 11291 11292 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11293 11294 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11295 Sema::LookupOrdinaryName); 11296 11297 // Transform the declaration set. 11298 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11299 return ExprError(); 11300 11301 // Determine the naming class. 11302 if (Old->getNamingClass()) { 11303 CXXRecordDecl *NamingClass 11304 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11305 Old->getMemberLoc(), 11306 Old->getNamingClass())); 11307 if (!NamingClass) 11308 return ExprError(); 11309 11310 R.setNamingClass(NamingClass); 11311 } 11312 11313 TemplateArgumentListInfo TransArgs; 11314 if (Old->hasExplicitTemplateArgs()) { 11315 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11316 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11317 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11318 Old->getNumTemplateArgs(), 11319 TransArgs)) 11320 return ExprError(); 11321 } 11322 11323 // FIXME: to do this check properly, we will need to preserve the 11324 // first-qualifier-in-scope here, just in case we had a dependent 11325 // base (and therefore couldn't do the check) and a 11326 // nested-name-qualifier (and therefore could do the lookup). 11327 NamedDecl *FirstQualifierInScope = nullptr; 11328 11329 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11330 BaseType, 11331 Old->getOperatorLoc(), 11332 Old->isArrow(), 11333 QualifierLoc, 11334 TemplateKWLoc, 11335 FirstQualifierInScope, 11336 R, 11337 (Old->hasExplicitTemplateArgs() 11338 ? &TransArgs : nullptr)); 11339 } 11340 11341 template<typename Derived> 11342 ExprResult 11343 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11344 EnterExpressionEvaluationContext Unevaluated( 11345 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11346 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11347 if (SubExpr.isInvalid()) 11348 return ExprError(); 11349 11350 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11351 return E; 11352 11353 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11354 } 11355 11356 template<typename Derived> 11357 ExprResult 11358 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11359 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11360 if (Pattern.isInvalid()) 11361 return ExprError(); 11362 11363 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11364 return E; 11365 11366 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11367 E->getNumExpansions()); 11368 } 11369 11370 template<typename Derived> 11371 ExprResult 11372 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11373 // If E is not value-dependent, then nothing will change when we transform it. 11374 // Note: This is an instantiation-centric view. 11375 if (!E->isValueDependent()) 11376 return E; 11377 11378 EnterExpressionEvaluationContext Unevaluated( 11379 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11380 11381 ArrayRef<TemplateArgument> PackArgs; 11382 TemplateArgument ArgStorage; 11383 11384 // Find the argument list to transform. 11385 if (E->isPartiallySubstituted()) { 11386 PackArgs = E->getPartialArguments(); 11387 } else if (E->isValueDependent()) { 11388 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11389 bool ShouldExpand = false; 11390 bool RetainExpansion = false; 11391 Optional<unsigned> NumExpansions; 11392 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11393 Unexpanded, 11394 ShouldExpand, RetainExpansion, 11395 NumExpansions)) 11396 return ExprError(); 11397 11398 // If we need to expand the pack, build a template argument from it and 11399 // expand that. 11400 if (ShouldExpand) { 11401 auto *Pack = E->getPack(); 11402 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11403 ArgStorage = getSema().Context.getPackExpansionType( 11404 getSema().Context.getTypeDeclType(TTPD), None); 11405 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11406 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11407 } else { 11408 auto *VD = cast<ValueDecl>(Pack); 11409 ExprResult DRE = getSema().BuildDeclRefExpr( 11410 VD, VD->getType().getNonLValueExprType(getSema().Context), 11411 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11412 E->getPackLoc()); 11413 if (DRE.isInvalid()) 11414 return ExprError(); 11415 ArgStorage = new (getSema().Context) PackExpansionExpr( 11416 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11417 } 11418 PackArgs = ArgStorage; 11419 } 11420 } 11421 11422 // If we're not expanding the pack, just transform the decl. 11423 if (!PackArgs.size()) { 11424 auto *Pack = cast_or_null<NamedDecl>( 11425 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11426 if (!Pack) 11427 return ExprError(); 11428 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11429 E->getPackLoc(), 11430 E->getRParenLoc(), None, None); 11431 } 11432 11433 // Try to compute the result without performing a partial substitution. 11434 Optional<unsigned> Result = 0; 11435 for (const TemplateArgument &Arg : PackArgs) { 11436 if (!Arg.isPackExpansion()) { 11437 Result = *Result + 1; 11438 continue; 11439 } 11440 11441 TemplateArgumentLoc ArgLoc; 11442 InventTemplateArgumentLoc(Arg, ArgLoc); 11443 11444 // Find the pattern of the pack expansion. 11445 SourceLocation Ellipsis; 11446 Optional<unsigned> OrigNumExpansions; 11447 TemplateArgumentLoc Pattern = 11448 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11449 OrigNumExpansions); 11450 11451 // Substitute under the pack expansion. Do not expand the pack (yet). 11452 TemplateArgumentLoc OutPattern; 11453 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11454 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11455 /*Uneval*/ true)) 11456 return true; 11457 11458 // See if we can determine the number of arguments from the result. 11459 Optional<unsigned> NumExpansions = 11460 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11461 if (!NumExpansions) { 11462 // No: we must be in an alias template expansion, and we're going to need 11463 // to actually expand the packs. 11464 Result = None; 11465 break; 11466 } 11467 11468 Result = *Result + *NumExpansions; 11469 } 11470 11471 // Common case: we could determine the number of expansions without 11472 // substituting. 11473 if (Result) 11474 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11475 E->getPackLoc(), 11476 E->getRParenLoc(), *Result, None); 11477 11478 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11479 E->getPackLoc()); 11480 { 11481 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11482 typedef TemplateArgumentLocInventIterator< 11483 Derived, const TemplateArgument*> PackLocIterator; 11484 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11485 PackLocIterator(*this, PackArgs.end()), 11486 TransformedPackArgs, /*Uneval*/true)) 11487 return ExprError(); 11488 } 11489 11490 // Check whether we managed to fully-expand the pack. 11491 // FIXME: Is it possible for us to do so and not hit the early exit path? 11492 SmallVector<TemplateArgument, 8> Args; 11493 bool PartialSubstitution = false; 11494 for (auto &Loc : TransformedPackArgs.arguments()) { 11495 Args.push_back(Loc.getArgument()); 11496 if (Loc.getArgument().isPackExpansion()) 11497 PartialSubstitution = true; 11498 } 11499 11500 if (PartialSubstitution) 11501 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11502 E->getPackLoc(), 11503 E->getRParenLoc(), None, Args); 11504 11505 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11506 E->getPackLoc(), E->getRParenLoc(), 11507 Args.size(), None); 11508 } 11509 11510 template<typename Derived> 11511 ExprResult 11512 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11513 SubstNonTypeTemplateParmPackExpr *E) { 11514 // Default behavior is to do nothing with this transformation. 11515 return E; 11516 } 11517 11518 template<typename Derived> 11519 ExprResult 11520 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11521 SubstNonTypeTemplateParmExpr *E) { 11522 // Default behavior is to do nothing with this transformation. 11523 return E; 11524 } 11525 11526 template<typename Derived> 11527 ExprResult 11528 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11529 // Default behavior is to do nothing with this transformation. 11530 return E; 11531 } 11532 11533 template<typename Derived> 11534 ExprResult 11535 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11536 MaterializeTemporaryExpr *E) { 11537 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11538 } 11539 11540 template<typename Derived> 11541 ExprResult 11542 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11543 Expr *Pattern = E->getPattern(); 11544 11545 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11546 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11547 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11548 11549 // Determine whether the set of unexpanded parameter packs can and should 11550 // be expanded. 11551 bool Expand = true; 11552 bool RetainExpansion = false; 11553 Optional<unsigned> NumExpansions; 11554 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11555 Pattern->getSourceRange(), 11556 Unexpanded, 11557 Expand, RetainExpansion, 11558 NumExpansions)) 11559 return true; 11560 11561 if (!Expand) { 11562 // Do not expand any packs here, just transform and rebuild a fold 11563 // expression. 11564 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11565 11566 ExprResult LHS = 11567 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11568 if (LHS.isInvalid()) 11569 return true; 11570 11571 ExprResult RHS = 11572 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11573 if (RHS.isInvalid()) 11574 return true; 11575 11576 if (!getDerived().AlwaysRebuild() && 11577 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11578 return E; 11579 11580 return getDerived().RebuildCXXFoldExpr( 11581 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11582 RHS.get(), E->getEndLoc()); 11583 } 11584 11585 // The transform has determined that we should perform an elementwise 11586 // expansion of the pattern. Do so. 11587 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11588 if (Result.isInvalid()) 11589 return true; 11590 bool LeftFold = E->isLeftFold(); 11591 11592 // If we're retaining an expansion for a right fold, it is the innermost 11593 // component and takes the init (if any). 11594 if (!LeftFold && RetainExpansion) { 11595 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11596 11597 ExprResult Out = getDerived().TransformExpr(Pattern); 11598 if (Out.isInvalid()) 11599 return true; 11600 11601 Result = getDerived().RebuildCXXFoldExpr( 11602 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11603 Result.get(), E->getEndLoc()); 11604 if (Result.isInvalid()) 11605 return true; 11606 } 11607 11608 for (unsigned I = 0; I != *NumExpansions; ++I) { 11609 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11610 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11611 ExprResult Out = getDerived().TransformExpr(Pattern); 11612 if (Out.isInvalid()) 11613 return true; 11614 11615 if (Out.get()->containsUnexpandedParameterPack()) { 11616 // We still have a pack; retain a pack expansion for this slice. 11617 Result = getDerived().RebuildCXXFoldExpr( 11618 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11619 E->getOperator(), E->getEllipsisLoc(), 11620 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11621 } else if (Result.isUsable()) { 11622 // We've got down to a single element; build a binary operator. 11623 Result = getDerived().RebuildBinaryOperator( 11624 E->getEllipsisLoc(), E->getOperator(), 11625 LeftFold ? Result.get() : Out.get(), 11626 LeftFold ? Out.get() : Result.get()); 11627 } else 11628 Result = Out; 11629 11630 if (Result.isInvalid()) 11631 return true; 11632 } 11633 11634 // If we're retaining an expansion for a left fold, it is the outermost 11635 // component and takes the complete expansion so far as its init (if any). 11636 if (LeftFold && RetainExpansion) { 11637 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11638 11639 ExprResult Out = getDerived().TransformExpr(Pattern); 11640 if (Out.isInvalid()) 11641 return true; 11642 11643 Result = getDerived().RebuildCXXFoldExpr( 11644 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11645 Out.get(), E->getEndLoc()); 11646 if (Result.isInvalid()) 11647 return true; 11648 } 11649 11650 // If we had no init and an empty pack, and we're not retaining an expansion, 11651 // then produce a fallback value or error. 11652 if (Result.isUnset()) 11653 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11654 E->getOperator()); 11655 11656 return Result; 11657 } 11658 11659 template<typename Derived> 11660 ExprResult 11661 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11662 CXXStdInitializerListExpr *E) { 11663 return getDerived().TransformExpr(E->getSubExpr()); 11664 } 11665 11666 template<typename Derived> 11667 ExprResult 11668 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11669 return SemaRef.MaybeBindToTemporary(E); 11670 } 11671 11672 template<typename Derived> 11673 ExprResult 11674 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11675 return E; 11676 } 11677 11678 template<typename Derived> 11679 ExprResult 11680 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11681 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11682 if (SubExpr.isInvalid()) 11683 return ExprError(); 11684 11685 if (!getDerived().AlwaysRebuild() && 11686 SubExpr.get() == E->getSubExpr()) 11687 return E; 11688 11689 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11690 } 11691 11692 template<typename Derived> 11693 ExprResult 11694 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11695 // Transform each of the elements. 11696 SmallVector<Expr *, 8> Elements; 11697 bool ArgChanged = false; 11698 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11699 /*IsCall=*/false, Elements, &ArgChanged)) 11700 return ExprError(); 11701 11702 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11703 return SemaRef.MaybeBindToTemporary(E); 11704 11705 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11706 Elements.data(), 11707 Elements.size()); 11708 } 11709 11710 template<typename Derived> 11711 ExprResult 11712 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11713 ObjCDictionaryLiteral *E) { 11714 // Transform each of the elements. 11715 SmallVector<ObjCDictionaryElement, 8> Elements; 11716 bool ArgChanged = false; 11717 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11718 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11719 11720 if (OrigElement.isPackExpansion()) { 11721 // This key/value element is a pack expansion. 11722 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11723 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11724 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11725 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11726 11727 // Determine whether the set of unexpanded parameter packs can 11728 // and should be expanded. 11729 bool Expand = true; 11730 bool RetainExpansion = false; 11731 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11732 Optional<unsigned> NumExpansions = OrigNumExpansions; 11733 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11734 OrigElement.Value->getEndLoc()); 11735 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11736 PatternRange, Unexpanded, Expand, 11737 RetainExpansion, NumExpansions)) 11738 return ExprError(); 11739 11740 if (!Expand) { 11741 // The transform has determined that we should perform a simple 11742 // transformation on the pack expansion, producing another pack 11743 // expansion. 11744 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11745 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11746 if (Key.isInvalid()) 11747 return ExprError(); 11748 11749 if (Key.get() != OrigElement.Key) 11750 ArgChanged = true; 11751 11752 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11753 if (Value.isInvalid()) 11754 return ExprError(); 11755 11756 if (Value.get() != OrigElement.Value) 11757 ArgChanged = true; 11758 11759 ObjCDictionaryElement Expansion = { 11760 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11761 }; 11762 Elements.push_back(Expansion); 11763 continue; 11764 } 11765 11766 // Record right away that the argument was changed. This needs 11767 // to happen even if the array expands to nothing. 11768 ArgChanged = true; 11769 11770 // The transform has determined that we should perform an elementwise 11771 // expansion of the pattern. Do so. 11772 for (unsigned I = 0; I != *NumExpansions; ++I) { 11773 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11774 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11775 if (Key.isInvalid()) 11776 return ExprError(); 11777 11778 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11779 if (Value.isInvalid()) 11780 return ExprError(); 11781 11782 ObjCDictionaryElement Element = { 11783 Key.get(), Value.get(), SourceLocation(), NumExpansions 11784 }; 11785 11786 // If any unexpanded parameter packs remain, we still have a 11787 // pack expansion. 11788 // FIXME: Can this really happen? 11789 if (Key.get()->containsUnexpandedParameterPack() || 11790 Value.get()->containsUnexpandedParameterPack()) 11791 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11792 11793 Elements.push_back(Element); 11794 } 11795 11796 // FIXME: Retain a pack expansion if RetainExpansion is true. 11797 11798 // We've finished with this pack expansion. 11799 continue; 11800 } 11801 11802 // Transform and check key. 11803 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11804 if (Key.isInvalid()) 11805 return ExprError(); 11806 11807 if (Key.get() != OrigElement.Key) 11808 ArgChanged = true; 11809 11810 // Transform and check value. 11811 ExprResult Value 11812 = getDerived().TransformExpr(OrigElement.Value); 11813 if (Value.isInvalid()) 11814 return ExprError(); 11815 11816 if (Value.get() != OrigElement.Value) 11817 ArgChanged = true; 11818 11819 ObjCDictionaryElement Element = { 11820 Key.get(), Value.get(), SourceLocation(), None 11821 }; 11822 Elements.push_back(Element); 11823 } 11824 11825 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11826 return SemaRef.MaybeBindToTemporary(E); 11827 11828 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11829 Elements); 11830 } 11831 11832 template<typename Derived> 11833 ExprResult 11834 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11835 TypeSourceInfo *EncodedTypeInfo 11836 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11837 if (!EncodedTypeInfo) 11838 return ExprError(); 11839 11840 if (!getDerived().AlwaysRebuild() && 11841 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11842 return E; 11843 11844 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11845 EncodedTypeInfo, 11846 E->getRParenLoc()); 11847 } 11848 11849 template<typename Derived> 11850 ExprResult TreeTransform<Derived>:: 11851 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11852 // This is a kind of implicit conversion, and it needs to get dropped 11853 // and recomputed for the same general reasons that ImplicitCastExprs 11854 // do, as well a more specific one: this expression is only valid when 11855 // it appears *immediately* as an argument expression. 11856 return getDerived().TransformExpr(E->getSubExpr()); 11857 } 11858 11859 template<typename Derived> 11860 ExprResult TreeTransform<Derived>:: 11861 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11862 TypeSourceInfo *TSInfo 11863 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11864 if (!TSInfo) 11865 return ExprError(); 11866 11867 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11868 if (Result.isInvalid()) 11869 return ExprError(); 11870 11871 if (!getDerived().AlwaysRebuild() && 11872 TSInfo == E->getTypeInfoAsWritten() && 11873 Result.get() == E->getSubExpr()) 11874 return E; 11875 11876 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11877 E->getBridgeKeywordLoc(), TSInfo, 11878 Result.get()); 11879 } 11880 11881 template <typename Derived> 11882 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11883 ObjCAvailabilityCheckExpr *E) { 11884 return E; 11885 } 11886 11887 template<typename Derived> 11888 ExprResult 11889 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11890 // Transform arguments. 11891 bool ArgChanged = false; 11892 SmallVector<Expr*, 8> Args; 11893 Args.reserve(E->getNumArgs()); 11894 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11895 &ArgChanged)) 11896 return ExprError(); 11897 11898 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11899 // Class message: transform the receiver type. 11900 TypeSourceInfo *ReceiverTypeInfo 11901 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11902 if (!ReceiverTypeInfo) 11903 return ExprError(); 11904 11905 // If nothing changed, just retain the existing message send. 11906 if (!getDerived().AlwaysRebuild() && 11907 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11908 return SemaRef.MaybeBindToTemporary(E); 11909 11910 // Build a new class message send. 11911 SmallVector<SourceLocation, 16> SelLocs; 11912 E->getSelectorLocs(SelLocs); 11913 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11914 E->getSelector(), 11915 SelLocs, 11916 E->getMethodDecl(), 11917 E->getLeftLoc(), 11918 Args, 11919 E->getRightLoc()); 11920 } 11921 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11922 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11923 if (!E->getMethodDecl()) 11924 return ExprError(); 11925 11926 // Build a new class message send to 'super'. 11927 SmallVector<SourceLocation, 16> SelLocs; 11928 E->getSelectorLocs(SelLocs); 11929 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11930 E->getSelector(), 11931 SelLocs, 11932 E->getReceiverType(), 11933 E->getMethodDecl(), 11934 E->getLeftLoc(), 11935 Args, 11936 E->getRightLoc()); 11937 } 11938 11939 // Instance message: transform the receiver 11940 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 11941 "Only class and instance messages may be instantiated"); 11942 ExprResult Receiver 11943 = getDerived().TransformExpr(E->getInstanceReceiver()); 11944 if (Receiver.isInvalid()) 11945 return ExprError(); 11946 11947 // If nothing changed, just retain the existing message send. 11948 if (!getDerived().AlwaysRebuild() && 11949 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11950 return SemaRef.MaybeBindToTemporary(E); 11951 11952 // Build a new instance message send. 11953 SmallVector<SourceLocation, 16> SelLocs; 11954 E->getSelectorLocs(SelLocs); 11955 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11956 E->getSelector(), 11957 SelLocs, 11958 E->getMethodDecl(), 11959 E->getLeftLoc(), 11960 Args, 11961 E->getRightLoc()); 11962 } 11963 11964 template<typename Derived> 11965 ExprResult 11966 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11967 return E; 11968 } 11969 11970 template<typename Derived> 11971 ExprResult 11972 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11973 return E; 11974 } 11975 11976 template<typename Derived> 11977 ExprResult 11978 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11979 // Transform the base expression. 11980 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11981 if (Base.isInvalid()) 11982 return ExprError(); 11983 11984 // We don't need to transform the ivar; it will never change. 11985 11986 // If nothing changed, just retain the existing expression. 11987 if (!getDerived().AlwaysRebuild() && 11988 Base.get() == E->getBase()) 11989 return E; 11990 11991 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11992 E->getLocation(), 11993 E->isArrow(), E->isFreeIvar()); 11994 } 11995 11996 template<typename Derived> 11997 ExprResult 11998 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11999 // 'super' and types never change. Property never changes. Just 12000 // retain the existing expression. 12001 if (!E->isObjectReceiver()) 12002 return E; 12003 12004 // Transform the base expression. 12005 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12006 if (Base.isInvalid()) 12007 return ExprError(); 12008 12009 // We don't need to transform the property; it will never change. 12010 12011 // If nothing changed, just retain the existing expression. 12012 if (!getDerived().AlwaysRebuild() && 12013 Base.get() == E->getBase()) 12014 return E; 12015 12016 if (E->isExplicitProperty()) 12017 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12018 E->getExplicitProperty(), 12019 E->getLocation()); 12020 12021 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12022 SemaRef.Context.PseudoObjectTy, 12023 E->getImplicitPropertyGetter(), 12024 E->getImplicitPropertySetter(), 12025 E->getLocation()); 12026 } 12027 12028 template<typename Derived> 12029 ExprResult 12030 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12031 // Transform the base expression. 12032 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12033 if (Base.isInvalid()) 12034 return ExprError(); 12035 12036 // Transform the key expression. 12037 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12038 if (Key.isInvalid()) 12039 return ExprError(); 12040 12041 // If nothing changed, just retain the existing expression. 12042 if (!getDerived().AlwaysRebuild() && 12043 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12044 return E; 12045 12046 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12047 Base.get(), Key.get(), 12048 E->getAtIndexMethodDecl(), 12049 E->setAtIndexMethodDecl()); 12050 } 12051 12052 template<typename Derived> 12053 ExprResult 12054 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12055 // Transform the base expression. 12056 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12057 if (Base.isInvalid()) 12058 return ExprError(); 12059 12060 // If nothing changed, just retain the existing expression. 12061 if (!getDerived().AlwaysRebuild() && 12062 Base.get() == E->getBase()) 12063 return E; 12064 12065 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12066 E->getOpLoc(), 12067 E->isArrow()); 12068 } 12069 12070 template<typename Derived> 12071 ExprResult 12072 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12073 bool ArgumentChanged = false; 12074 SmallVector<Expr*, 8> SubExprs; 12075 SubExprs.reserve(E->getNumSubExprs()); 12076 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12077 SubExprs, &ArgumentChanged)) 12078 return ExprError(); 12079 12080 if (!getDerived().AlwaysRebuild() && 12081 !ArgumentChanged) 12082 return E; 12083 12084 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12085 SubExprs, 12086 E->getRParenLoc()); 12087 } 12088 12089 template<typename Derived> 12090 ExprResult 12091 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12092 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12093 if (SrcExpr.isInvalid()) 12094 return ExprError(); 12095 12096 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12097 if (!Type) 12098 return ExprError(); 12099 12100 if (!getDerived().AlwaysRebuild() && 12101 Type == E->getTypeSourceInfo() && 12102 SrcExpr.get() == E->getSrcExpr()) 12103 return E; 12104 12105 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12106 SrcExpr.get(), Type, 12107 E->getRParenLoc()); 12108 } 12109 12110 template<typename Derived> 12111 ExprResult 12112 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12113 BlockDecl *oldBlock = E->getBlockDecl(); 12114 12115 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12116 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12117 12118 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12119 blockScope->TheDecl->setBlockMissingReturnType( 12120 oldBlock->blockMissingReturnType()); 12121 12122 SmallVector<ParmVarDecl*, 4> params; 12123 SmallVector<QualType, 4> paramTypes; 12124 12125 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12126 12127 // Parameter substitution. 12128 Sema::ExtParameterInfoBuilder extParamInfos; 12129 if (getDerived().TransformFunctionTypeParams( 12130 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12131 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12132 extParamInfos)) { 12133 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12134 return ExprError(); 12135 } 12136 12137 QualType exprResultType = 12138 getDerived().TransformType(exprFunctionType->getReturnType()); 12139 12140 auto epi = exprFunctionType->getExtProtoInfo(); 12141 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12142 12143 QualType functionType = 12144 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12145 blockScope->FunctionType = functionType; 12146 12147 // Set the parameters on the block decl. 12148 if (!params.empty()) 12149 blockScope->TheDecl->setParams(params); 12150 12151 if (!oldBlock->blockMissingReturnType()) { 12152 blockScope->HasImplicitReturnType = false; 12153 blockScope->ReturnType = exprResultType; 12154 } 12155 12156 // Transform the body 12157 StmtResult body = getDerived().TransformStmt(E->getBody()); 12158 if (body.isInvalid()) { 12159 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12160 return ExprError(); 12161 } 12162 12163 #ifndef NDEBUG 12164 // In builds with assertions, make sure that we captured everything we 12165 // captured before. 12166 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12167 for (const auto &I : oldBlock->captures()) { 12168 VarDecl *oldCapture = I.getVariable(); 12169 12170 // Ignore parameter packs. 12171 if (isa<ParmVarDecl>(oldCapture) && 12172 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12173 continue; 12174 12175 VarDecl *newCapture = 12176 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12177 oldCapture)); 12178 assert(blockScope->CaptureMap.count(newCapture)); 12179 } 12180 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12181 } 12182 #endif 12183 12184 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12185 /*Scope=*/nullptr); 12186 } 12187 12188 template<typename Derived> 12189 ExprResult 12190 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12191 llvm_unreachable("Cannot transform asType expressions yet"); 12192 } 12193 12194 template<typename Derived> 12195 ExprResult 12196 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12197 QualType RetTy = getDerived().TransformType(E->getType()); 12198 bool ArgumentChanged = false; 12199 SmallVector<Expr*, 8> SubExprs; 12200 SubExprs.reserve(E->getNumSubExprs()); 12201 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12202 SubExprs, &ArgumentChanged)) 12203 return ExprError(); 12204 12205 if (!getDerived().AlwaysRebuild() && 12206 !ArgumentChanged) 12207 return E; 12208 12209 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12210 RetTy, E->getOp(), E->getRParenLoc()); 12211 } 12212 12213 //===----------------------------------------------------------------------===// 12214 // Type reconstruction 12215 //===----------------------------------------------------------------------===// 12216 12217 template<typename Derived> 12218 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12219 SourceLocation Star) { 12220 return SemaRef.BuildPointerType(PointeeType, Star, 12221 getDerived().getBaseEntity()); 12222 } 12223 12224 template<typename Derived> 12225 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12226 SourceLocation Star) { 12227 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12228 getDerived().getBaseEntity()); 12229 } 12230 12231 template<typename Derived> 12232 QualType 12233 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12234 bool WrittenAsLValue, 12235 SourceLocation Sigil) { 12236 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12237 Sigil, getDerived().getBaseEntity()); 12238 } 12239 12240 template<typename Derived> 12241 QualType 12242 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12243 QualType ClassType, 12244 SourceLocation Sigil) { 12245 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12246 getDerived().getBaseEntity()); 12247 } 12248 12249 template<typename Derived> 12250 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12251 const ObjCTypeParamDecl *Decl, 12252 SourceLocation ProtocolLAngleLoc, 12253 ArrayRef<ObjCProtocolDecl *> Protocols, 12254 ArrayRef<SourceLocation> ProtocolLocs, 12255 SourceLocation ProtocolRAngleLoc) { 12256 return SemaRef.BuildObjCTypeParamType(Decl, 12257 ProtocolLAngleLoc, Protocols, 12258 ProtocolLocs, ProtocolRAngleLoc, 12259 /*FailOnError=*/true); 12260 } 12261 12262 template<typename Derived> 12263 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12264 QualType BaseType, 12265 SourceLocation Loc, 12266 SourceLocation TypeArgsLAngleLoc, 12267 ArrayRef<TypeSourceInfo *> TypeArgs, 12268 SourceLocation TypeArgsRAngleLoc, 12269 SourceLocation ProtocolLAngleLoc, 12270 ArrayRef<ObjCProtocolDecl *> Protocols, 12271 ArrayRef<SourceLocation> ProtocolLocs, 12272 SourceLocation ProtocolRAngleLoc) { 12273 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12274 TypeArgs, TypeArgsRAngleLoc, 12275 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12276 ProtocolRAngleLoc, 12277 /*FailOnError=*/true); 12278 } 12279 12280 template<typename Derived> 12281 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12282 QualType PointeeType, 12283 SourceLocation Star) { 12284 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12285 } 12286 12287 template<typename Derived> 12288 QualType 12289 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12290 ArrayType::ArraySizeModifier SizeMod, 12291 const llvm::APInt *Size, 12292 Expr *SizeExpr, 12293 unsigned IndexTypeQuals, 12294 SourceRange BracketsRange) { 12295 if (SizeExpr || !Size) 12296 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12297 IndexTypeQuals, BracketsRange, 12298 getDerived().getBaseEntity()); 12299 12300 QualType Types[] = { 12301 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12302 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12303 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12304 }; 12305 const unsigned NumTypes = llvm::array_lengthof(Types); 12306 QualType SizeType; 12307 for (unsigned I = 0; I != NumTypes; ++I) 12308 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12309 SizeType = Types[I]; 12310 break; 12311 } 12312 12313 // Note that we can return a VariableArrayType here in the case where 12314 // the element type was a dependent VariableArrayType. 12315 IntegerLiteral *ArraySize 12316 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12317 /*FIXME*/BracketsRange.getBegin()); 12318 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12319 IndexTypeQuals, BracketsRange, 12320 getDerived().getBaseEntity()); 12321 } 12322 12323 template<typename Derived> 12324 QualType 12325 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12326 ArrayType::ArraySizeModifier SizeMod, 12327 const llvm::APInt &Size, 12328 unsigned IndexTypeQuals, 12329 SourceRange BracketsRange) { 12330 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12331 IndexTypeQuals, BracketsRange); 12332 } 12333 12334 template<typename Derived> 12335 QualType 12336 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12337 ArrayType::ArraySizeModifier SizeMod, 12338 unsigned IndexTypeQuals, 12339 SourceRange BracketsRange) { 12340 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12341 IndexTypeQuals, BracketsRange); 12342 } 12343 12344 template<typename Derived> 12345 QualType 12346 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12347 ArrayType::ArraySizeModifier SizeMod, 12348 Expr *SizeExpr, 12349 unsigned IndexTypeQuals, 12350 SourceRange BracketsRange) { 12351 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12352 SizeExpr, 12353 IndexTypeQuals, BracketsRange); 12354 } 12355 12356 template<typename Derived> 12357 QualType 12358 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12359 ArrayType::ArraySizeModifier SizeMod, 12360 Expr *SizeExpr, 12361 unsigned IndexTypeQuals, 12362 SourceRange BracketsRange) { 12363 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12364 SizeExpr, 12365 IndexTypeQuals, BracketsRange); 12366 } 12367 12368 template <typename Derived> 12369 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12370 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12371 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12372 AttributeLoc); 12373 } 12374 12375 template <typename Derived> 12376 QualType 12377 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12378 unsigned NumElements, 12379 VectorType::VectorKind VecKind) { 12380 // FIXME: semantic checking! 12381 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12382 } 12383 12384 template <typename Derived> 12385 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12386 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12387 VectorType::VectorKind VecKind) { 12388 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12389 } 12390 12391 template<typename Derived> 12392 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12393 unsigned NumElements, 12394 SourceLocation AttributeLoc) { 12395 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12396 NumElements, true); 12397 IntegerLiteral *VectorSize 12398 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12399 AttributeLoc); 12400 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12401 } 12402 12403 template<typename Derived> 12404 QualType 12405 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12406 Expr *SizeExpr, 12407 SourceLocation AttributeLoc) { 12408 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12409 } 12410 12411 template<typename Derived> 12412 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12413 QualType T, 12414 MutableArrayRef<QualType> ParamTypes, 12415 const FunctionProtoType::ExtProtoInfo &EPI) { 12416 return SemaRef.BuildFunctionType(T, ParamTypes, 12417 getDerived().getBaseLocation(), 12418 getDerived().getBaseEntity(), 12419 EPI); 12420 } 12421 12422 template<typename Derived> 12423 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12424 return SemaRef.Context.getFunctionNoProtoType(T); 12425 } 12426 12427 template<typename Derived> 12428 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12429 Decl *D) { 12430 assert(D && "no decl found"); 12431 if (D->isInvalidDecl()) return QualType(); 12432 12433 // FIXME: Doesn't account for ObjCInterfaceDecl! 12434 TypeDecl *Ty; 12435 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12436 // A valid resolved using typename pack expansion decl can have multiple 12437 // UsingDecls, but they must each have exactly one type, and it must be 12438 // the same type in every case. But we must have at least one expansion! 12439 if (UPD->expansions().empty()) { 12440 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12441 << UPD->isCXXClassMember() << UPD; 12442 return QualType(); 12443 } 12444 12445 // We might still have some unresolved types. Try to pick a resolved type 12446 // if we can. The final instantiation will check that the remaining 12447 // unresolved types instantiate to the type we pick. 12448 QualType FallbackT; 12449 QualType T; 12450 for (auto *E : UPD->expansions()) { 12451 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12452 if (ThisT.isNull()) 12453 continue; 12454 else if (ThisT->getAs<UnresolvedUsingType>()) 12455 FallbackT = ThisT; 12456 else if (T.isNull()) 12457 T = ThisT; 12458 else 12459 assert(getSema().Context.hasSameType(ThisT, T) && 12460 "mismatched resolved types in using pack expansion"); 12461 } 12462 return T.isNull() ? FallbackT : T; 12463 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12464 assert(Using->hasTypename() && 12465 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12466 12467 // A valid resolved using typename decl points to exactly one type decl. 12468 assert(++Using->shadow_begin() == Using->shadow_end()); 12469 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12470 } else { 12471 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12472 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12473 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12474 } 12475 12476 return SemaRef.Context.getTypeDeclType(Ty); 12477 } 12478 12479 template<typename Derived> 12480 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12481 SourceLocation Loc) { 12482 return SemaRef.BuildTypeofExprType(E, Loc); 12483 } 12484 12485 template<typename Derived> 12486 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12487 return SemaRef.Context.getTypeOfType(Underlying); 12488 } 12489 12490 template<typename Derived> 12491 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12492 SourceLocation Loc) { 12493 return SemaRef.BuildDecltypeType(E, Loc); 12494 } 12495 12496 template<typename Derived> 12497 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12498 UnaryTransformType::UTTKind UKind, 12499 SourceLocation Loc) { 12500 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12501 } 12502 12503 template<typename Derived> 12504 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12505 TemplateName Template, 12506 SourceLocation TemplateNameLoc, 12507 TemplateArgumentListInfo &TemplateArgs) { 12508 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12509 } 12510 12511 template<typename Derived> 12512 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12513 SourceLocation KWLoc) { 12514 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12515 } 12516 12517 template<typename Derived> 12518 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12519 SourceLocation KWLoc, 12520 bool isReadPipe) { 12521 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12522 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12523 } 12524 12525 template<typename Derived> 12526 TemplateName 12527 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12528 bool TemplateKW, 12529 TemplateDecl *Template) { 12530 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12531 Template); 12532 } 12533 12534 template<typename Derived> 12535 TemplateName 12536 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12537 SourceLocation TemplateKWLoc, 12538 const IdentifierInfo &Name, 12539 SourceLocation NameLoc, 12540 QualType ObjectType, 12541 NamedDecl *FirstQualifierInScope, 12542 bool AllowInjectedClassName) { 12543 UnqualifiedId TemplateName; 12544 TemplateName.setIdentifier(&Name, NameLoc); 12545 Sema::TemplateTy Template; 12546 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12547 SS, TemplateKWLoc, TemplateName, 12548 ParsedType::make(ObjectType), 12549 /*EnteringContext=*/false, 12550 Template, AllowInjectedClassName); 12551 return Template.get(); 12552 } 12553 12554 template<typename Derived> 12555 TemplateName 12556 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12557 SourceLocation TemplateKWLoc, 12558 OverloadedOperatorKind Operator, 12559 SourceLocation NameLoc, 12560 QualType ObjectType, 12561 bool AllowInjectedClassName) { 12562 UnqualifiedId Name; 12563 // FIXME: Bogus location information. 12564 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12565 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12566 Sema::TemplateTy Template; 12567 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12568 SS, TemplateKWLoc, Name, 12569 ParsedType::make(ObjectType), 12570 /*EnteringContext=*/false, 12571 Template, AllowInjectedClassName); 12572 return Template.get(); 12573 } 12574 12575 template<typename Derived> 12576 ExprResult 12577 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12578 SourceLocation OpLoc, 12579 Expr *OrigCallee, 12580 Expr *First, 12581 Expr *Second) { 12582 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12583 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12584 12585 if (First->getObjectKind() == OK_ObjCProperty) { 12586 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12587 if (BinaryOperator::isAssignmentOp(Opc)) 12588 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12589 First, Second); 12590 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12591 if (Result.isInvalid()) 12592 return ExprError(); 12593 First = Result.get(); 12594 } 12595 12596 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12597 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12598 if (Result.isInvalid()) 12599 return ExprError(); 12600 Second = Result.get(); 12601 } 12602 12603 // Determine whether this should be a builtin operation. 12604 if (Op == OO_Subscript) { 12605 if (!First->getType()->isOverloadableType() && 12606 !Second->getType()->isOverloadableType()) 12607 return getSema().CreateBuiltinArraySubscriptExpr( 12608 First, Callee->getBeginLoc(), Second, OpLoc); 12609 } else if (Op == OO_Arrow) { 12610 // -> is never a builtin operation. 12611 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12612 } else if (Second == nullptr || isPostIncDec) { 12613 if (!First->getType()->isOverloadableType() || 12614 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12615 // The argument is not of overloadable type, or this is an expression 12616 // of the form &Class::member, so try to create a built-in unary 12617 // operation. 12618 UnaryOperatorKind Opc 12619 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12620 12621 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12622 } 12623 } else { 12624 if (!First->getType()->isOverloadableType() && 12625 !Second->getType()->isOverloadableType()) { 12626 // Neither of the arguments is an overloadable type, so try to 12627 // create a built-in binary operation. 12628 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12629 ExprResult Result 12630 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12631 if (Result.isInvalid()) 12632 return ExprError(); 12633 12634 return Result; 12635 } 12636 } 12637 12638 // Compute the transformed set of functions (and function templates) to be 12639 // used during overload resolution. 12640 UnresolvedSet<16> Functions; 12641 bool RequiresADL; 12642 12643 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12644 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12645 // If the overload could not be resolved in the template definition 12646 // (because we had a dependent argument), ADL is performed as part of 12647 // template instantiation. 12648 RequiresADL = ULE->requiresADL(); 12649 } else { 12650 // If we've resolved this to a particular non-member function, just call 12651 // that function. If we resolved it to a member function, 12652 // CreateOverloaded* will find that function for us. 12653 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12654 if (!isa<CXXMethodDecl>(ND)) 12655 Functions.addDecl(ND); 12656 RequiresADL = false; 12657 } 12658 12659 // Add any functions found via argument-dependent lookup. 12660 Expr *Args[2] = { First, Second }; 12661 unsigned NumArgs = 1 + (Second != nullptr); 12662 12663 // Create the overloaded operator invocation for unary operators. 12664 if (NumArgs == 1 || isPostIncDec) { 12665 UnaryOperatorKind Opc 12666 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12667 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12668 RequiresADL); 12669 } 12670 12671 if (Op == OO_Subscript) { 12672 SourceLocation LBrace; 12673 SourceLocation RBrace; 12674 12675 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12676 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12677 LBrace = SourceLocation::getFromRawEncoding( 12678 NameLoc.CXXOperatorName.BeginOpNameLoc); 12679 RBrace = SourceLocation::getFromRawEncoding( 12680 NameLoc.CXXOperatorName.EndOpNameLoc); 12681 } else { 12682 LBrace = Callee->getBeginLoc(); 12683 RBrace = OpLoc; 12684 } 12685 12686 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12687 First, Second); 12688 } 12689 12690 // Create the overloaded operator invocation for binary operators. 12691 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12692 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12693 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12694 if (Result.isInvalid()) 12695 return ExprError(); 12696 12697 return Result; 12698 } 12699 12700 template<typename Derived> 12701 ExprResult 12702 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12703 SourceLocation OperatorLoc, 12704 bool isArrow, 12705 CXXScopeSpec &SS, 12706 TypeSourceInfo *ScopeType, 12707 SourceLocation CCLoc, 12708 SourceLocation TildeLoc, 12709 PseudoDestructorTypeStorage Destroyed) { 12710 QualType BaseType = Base->getType(); 12711 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12712 (!isArrow && !BaseType->getAs<RecordType>()) || 12713 (isArrow && BaseType->getAs<PointerType>() && 12714 !BaseType->getAs<PointerType>()->getPointeeType() 12715 ->template getAs<RecordType>())){ 12716 // This pseudo-destructor expression is still a pseudo-destructor. 12717 return SemaRef.BuildPseudoDestructorExpr( 12718 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12719 CCLoc, TildeLoc, Destroyed); 12720 } 12721 12722 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12723 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12724 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12725 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12726 NameInfo.setNamedTypeInfo(DestroyedType); 12727 12728 // The scope type is now known to be a valid nested name specifier 12729 // component. Tack it on to the end of the nested name specifier. 12730 if (ScopeType) { 12731 if (!ScopeType->getType()->getAs<TagType>()) { 12732 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12733 diag::err_expected_class_or_namespace) 12734 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12735 return ExprError(); 12736 } 12737 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12738 CCLoc); 12739 } 12740 12741 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12742 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12743 OperatorLoc, isArrow, 12744 SS, TemplateKWLoc, 12745 /*FIXME: FirstQualifier*/ nullptr, 12746 NameInfo, 12747 /*TemplateArgs*/ nullptr, 12748 /*S*/nullptr); 12749 } 12750 12751 template<typename Derived> 12752 StmtResult 12753 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12754 SourceLocation Loc = S->getBeginLoc(); 12755 CapturedDecl *CD = S->getCapturedDecl(); 12756 unsigned NumParams = CD->getNumParams(); 12757 unsigned ContextParamPos = CD->getContextParamPosition(); 12758 SmallVector<Sema::CapturedParamNameType, 4> Params; 12759 for (unsigned I = 0; I < NumParams; ++I) { 12760 if (I != ContextParamPos) { 12761 Params.push_back( 12762 std::make_pair( 12763 CD->getParam(I)->getName(), 12764 getDerived().TransformType(CD->getParam(I)->getType()))); 12765 } else { 12766 Params.push_back(std::make_pair(StringRef(), QualType())); 12767 } 12768 } 12769 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12770 S->getCapturedRegionKind(), Params); 12771 StmtResult Body; 12772 { 12773 Sema::CompoundScopeRAII CompoundScope(getSema()); 12774 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12775 } 12776 12777 if (Body.isInvalid()) { 12778 getSema().ActOnCapturedRegionError(); 12779 return StmtError(); 12780 } 12781 12782 return getSema().ActOnCapturedRegionEnd(Body.get()); 12783 } 12784 12785 } // end namespace clang 12786 12787 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12788