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, Stmt *Init, 2025 SourceLocation ColonLoc, Stmt *Range, 2026 Stmt *Begin, Stmt *End, Expr *Cond, 2027 Expr *Inc, Stmt *LoopVar, 2028 SourceLocation RParenLoc) { 2029 // If we've just learned that the range is actually an Objective-C 2030 // collection, treat this as an Objective-C fast enumeration loop. 2031 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2032 if (RangeStmt->isSingleDecl()) { 2033 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2034 if (RangeVar->isInvalidDecl()) 2035 return StmtError(); 2036 2037 Expr *RangeExpr = RangeVar->getInit(); 2038 if (!RangeExpr->isTypeDependent() && 2039 RangeExpr->getType()->isObjCObjectPointerType()) { 2040 // FIXME: Support init-statements in Objective-C++20 ranged for 2041 // statement. 2042 if (Init) { 2043 return SemaRef.Diag(Init->getBeginLoc(), 2044 diag::err_objc_for_range_init_stmt) 2045 << Init->getSourceRange(); 2046 } 2047 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2048 RangeExpr, RParenLoc); 2049 } 2050 } 2051 } 2052 } 2053 2054 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2055 Range, Begin, End, Cond, Inc, LoopVar, 2056 RParenLoc, Sema::BFRK_Rebuild); 2057 } 2058 2059 /// Build a new C++0x range-based for statement. 2060 /// 2061 /// By default, performs semantic analysis to build the new statement. 2062 /// Subclasses may override this routine to provide different behavior. 2063 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2064 bool IsIfExists, 2065 NestedNameSpecifierLoc QualifierLoc, 2066 DeclarationNameInfo NameInfo, 2067 Stmt *Nested) { 2068 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2069 QualifierLoc, NameInfo, Nested); 2070 } 2071 2072 /// Attach body to a C++0x range-based for statement. 2073 /// 2074 /// By default, performs semantic analysis to finish the new statement. 2075 /// Subclasses may override this routine to provide different behavior. 2076 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2077 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2078 } 2079 2080 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2081 Stmt *TryBlock, Stmt *Handler) { 2082 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2083 } 2084 2085 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2086 Stmt *Block) { 2087 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2088 } 2089 2090 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2091 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2092 } 2093 2094 /// Build a new predefined expression. 2095 /// 2096 /// By default, performs semantic analysis to build the new expression. 2097 /// Subclasses may override this routine to provide different behavior. 2098 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2099 PredefinedExpr::IdentKind IK) { 2100 return getSema().BuildPredefinedExpr(Loc, IK); 2101 } 2102 2103 /// Build a new expression that references a declaration. 2104 /// 2105 /// By default, performs semantic analysis to build the new expression. 2106 /// Subclasses may override this routine to provide different behavior. 2107 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2108 LookupResult &R, 2109 bool RequiresADL) { 2110 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2111 } 2112 2113 2114 /// Build a new expression that references a declaration. 2115 /// 2116 /// By default, performs semantic analysis to build the new expression. 2117 /// Subclasses may override this routine to provide different behavior. 2118 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2119 ValueDecl *VD, 2120 const DeclarationNameInfo &NameInfo, 2121 TemplateArgumentListInfo *TemplateArgs) { 2122 CXXScopeSpec SS; 2123 SS.Adopt(QualifierLoc); 2124 2125 // FIXME: loses template args. 2126 2127 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2128 } 2129 2130 /// Build a new expression in parentheses. 2131 /// 2132 /// By default, performs semantic analysis to build the new expression. 2133 /// Subclasses may override this routine to provide different behavior. 2134 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2135 SourceLocation RParen) { 2136 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2137 } 2138 2139 /// Build a new pseudo-destructor expression. 2140 /// 2141 /// By default, performs semantic analysis to build the new expression. 2142 /// Subclasses may override this routine to provide different behavior. 2143 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2144 SourceLocation OperatorLoc, 2145 bool isArrow, 2146 CXXScopeSpec &SS, 2147 TypeSourceInfo *ScopeType, 2148 SourceLocation CCLoc, 2149 SourceLocation TildeLoc, 2150 PseudoDestructorTypeStorage Destroyed); 2151 2152 /// Build a new unary operator expression. 2153 /// 2154 /// By default, performs semantic analysis to build the new expression. 2155 /// Subclasses may override this routine to provide different behavior. 2156 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2157 UnaryOperatorKind Opc, 2158 Expr *SubExpr) { 2159 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2160 } 2161 2162 /// Build a new builtin offsetof expression. 2163 /// 2164 /// By default, performs semantic analysis to build the new expression. 2165 /// Subclasses may override this routine to provide different behavior. 2166 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2167 TypeSourceInfo *Type, 2168 ArrayRef<Sema::OffsetOfComponent> Components, 2169 SourceLocation RParenLoc) { 2170 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2171 RParenLoc); 2172 } 2173 2174 /// Build a new sizeof, alignof or vec_step expression with a 2175 /// type argument. 2176 /// 2177 /// By default, performs semantic analysis to build the new expression. 2178 /// Subclasses may override this routine to provide different behavior. 2179 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2180 SourceLocation OpLoc, 2181 UnaryExprOrTypeTrait ExprKind, 2182 SourceRange R) { 2183 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2184 } 2185 2186 /// Build a new sizeof, alignof or vec step expression with an 2187 /// expression argument. 2188 /// 2189 /// By default, performs semantic analysis to build the new expression. 2190 /// Subclasses may override this routine to provide different behavior. 2191 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2192 UnaryExprOrTypeTrait ExprKind, 2193 SourceRange R) { 2194 ExprResult Result 2195 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2196 if (Result.isInvalid()) 2197 return ExprError(); 2198 2199 return Result; 2200 } 2201 2202 /// Build a new array subscript expression. 2203 /// 2204 /// By default, performs semantic analysis to build the new expression. 2205 /// Subclasses may override this routine to provide different behavior. 2206 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2207 SourceLocation LBracketLoc, 2208 Expr *RHS, 2209 SourceLocation RBracketLoc) { 2210 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2211 LBracketLoc, RHS, 2212 RBracketLoc); 2213 } 2214 2215 /// Build a new array section expression. 2216 /// 2217 /// By default, performs semantic analysis to build the new expression. 2218 /// Subclasses may override this routine to provide different behavior. 2219 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2220 Expr *LowerBound, 2221 SourceLocation ColonLoc, Expr *Length, 2222 SourceLocation RBracketLoc) { 2223 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2224 ColonLoc, Length, RBracketLoc); 2225 } 2226 2227 /// Build a new call expression. 2228 /// 2229 /// By default, performs semantic analysis to build the new expression. 2230 /// Subclasses may override this routine to provide different behavior. 2231 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2232 MultiExprArg Args, 2233 SourceLocation RParenLoc, 2234 Expr *ExecConfig = nullptr) { 2235 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2236 Args, RParenLoc, ExecConfig); 2237 } 2238 2239 /// Build a new member access expression. 2240 /// 2241 /// By default, performs semantic analysis to build the new expression. 2242 /// Subclasses may override this routine to provide different behavior. 2243 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2244 bool isArrow, 2245 NestedNameSpecifierLoc QualifierLoc, 2246 SourceLocation TemplateKWLoc, 2247 const DeclarationNameInfo &MemberNameInfo, 2248 ValueDecl *Member, 2249 NamedDecl *FoundDecl, 2250 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2251 NamedDecl *FirstQualifierInScope) { 2252 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2253 isArrow); 2254 if (!Member->getDeclName()) { 2255 // We have a reference to an unnamed field. This is always the 2256 // base of an anonymous struct/union member access, i.e. the 2257 // field is always of record type. 2258 assert(Member->getType()->isRecordType() && 2259 "unnamed member not of record type?"); 2260 2261 BaseResult = 2262 getSema().PerformObjectMemberConversion(BaseResult.get(), 2263 QualifierLoc.getNestedNameSpecifier(), 2264 FoundDecl, Member); 2265 if (BaseResult.isInvalid()) 2266 return ExprError(); 2267 Base = BaseResult.get(); 2268 2269 CXXScopeSpec EmptySS; 2270 return getSema().BuildFieldReferenceExpr( 2271 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2272 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2273 } 2274 2275 CXXScopeSpec SS; 2276 SS.Adopt(QualifierLoc); 2277 2278 Base = BaseResult.get(); 2279 QualType BaseType = Base->getType(); 2280 2281 if (isArrow && !BaseType->isPointerType()) 2282 return ExprError(); 2283 2284 // FIXME: this involves duplicating earlier analysis in a lot of 2285 // cases; we should avoid this when possible. 2286 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2287 R.addDecl(FoundDecl); 2288 R.resolveKind(); 2289 2290 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2291 SS, TemplateKWLoc, 2292 FirstQualifierInScope, 2293 R, ExplicitTemplateArgs, 2294 /*S*/nullptr); 2295 } 2296 2297 /// Build a new binary operator expression. 2298 /// 2299 /// By default, performs semantic analysis to build the new expression. 2300 /// Subclasses may override this routine to provide different behavior. 2301 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2302 BinaryOperatorKind Opc, 2303 Expr *LHS, Expr *RHS) { 2304 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2305 } 2306 2307 /// Build a new conditional operator expression. 2308 /// 2309 /// By default, performs semantic analysis to build the new expression. 2310 /// Subclasses may override this routine to provide different behavior. 2311 ExprResult RebuildConditionalOperator(Expr *Cond, 2312 SourceLocation QuestionLoc, 2313 Expr *LHS, 2314 SourceLocation ColonLoc, 2315 Expr *RHS) { 2316 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2317 LHS, RHS); 2318 } 2319 2320 /// Build a new C-style cast expression. 2321 /// 2322 /// By default, performs semantic analysis to build the new expression. 2323 /// Subclasses may override this routine to provide different behavior. 2324 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2325 TypeSourceInfo *TInfo, 2326 SourceLocation RParenLoc, 2327 Expr *SubExpr) { 2328 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2329 SubExpr); 2330 } 2331 2332 /// Build a new compound literal expression. 2333 /// 2334 /// By default, performs semantic analysis to build the new expression. 2335 /// Subclasses may override this routine to provide different behavior. 2336 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2337 TypeSourceInfo *TInfo, 2338 SourceLocation RParenLoc, 2339 Expr *Init) { 2340 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2341 Init); 2342 } 2343 2344 /// Build a new extended vector element access expression. 2345 /// 2346 /// By default, performs semantic analysis to build the new expression. 2347 /// Subclasses may override this routine to provide different behavior. 2348 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2349 SourceLocation OpLoc, 2350 SourceLocation AccessorLoc, 2351 IdentifierInfo &Accessor) { 2352 2353 CXXScopeSpec SS; 2354 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2355 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2356 OpLoc, /*IsArrow*/ false, 2357 SS, SourceLocation(), 2358 /*FirstQualifierInScope*/ nullptr, 2359 NameInfo, 2360 /* TemplateArgs */ nullptr, 2361 /*S*/ nullptr); 2362 } 2363 2364 /// Build a new initializer list expression. 2365 /// 2366 /// By default, performs semantic analysis to build the new expression. 2367 /// Subclasses may override this routine to provide different behavior. 2368 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2369 MultiExprArg Inits, 2370 SourceLocation RBraceLoc) { 2371 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2372 } 2373 2374 /// Build a new designated initializer expression. 2375 /// 2376 /// By default, performs semantic analysis to build the new expression. 2377 /// Subclasses may override this routine to provide different behavior. 2378 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2379 MultiExprArg ArrayExprs, 2380 SourceLocation EqualOrColonLoc, 2381 bool GNUSyntax, 2382 Expr *Init) { 2383 ExprResult Result 2384 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2385 Init); 2386 if (Result.isInvalid()) 2387 return ExprError(); 2388 2389 return Result; 2390 } 2391 2392 /// Build a new value-initialized expression. 2393 /// 2394 /// By default, builds the implicit value initialization without performing 2395 /// any semantic analysis. Subclasses may override this routine to provide 2396 /// different behavior. 2397 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2398 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2399 } 2400 2401 /// Build a new \c va_arg expression. 2402 /// 2403 /// By default, performs semantic analysis to build the new expression. 2404 /// Subclasses may override this routine to provide different behavior. 2405 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2406 Expr *SubExpr, TypeSourceInfo *TInfo, 2407 SourceLocation RParenLoc) { 2408 return getSema().BuildVAArgExpr(BuiltinLoc, 2409 SubExpr, TInfo, 2410 RParenLoc); 2411 } 2412 2413 /// Build a new expression list in parentheses. 2414 /// 2415 /// By default, performs semantic analysis to build the new expression. 2416 /// Subclasses may override this routine to provide different behavior. 2417 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2418 MultiExprArg SubExprs, 2419 SourceLocation RParenLoc) { 2420 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2421 } 2422 2423 /// Build a new address-of-label expression. 2424 /// 2425 /// By default, performs semantic analysis, using the name of the label 2426 /// rather than attempting to map the label statement itself. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2429 SourceLocation LabelLoc, LabelDecl *Label) { 2430 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2431 } 2432 2433 /// Build a new GNU statement expression. 2434 /// 2435 /// By default, performs semantic analysis to build the new expression. 2436 /// Subclasses may override this routine to provide different behavior. 2437 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2438 Stmt *SubStmt, 2439 SourceLocation RParenLoc) { 2440 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2441 } 2442 2443 /// Build a new __builtin_choose_expr expression. 2444 /// 2445 /// By default, performs semantic analysis to build the new expression. 2446 /// Subclasses may override this routine to provide different behavior. 2447 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2448 Expr *Cond, Expr *LHS, Expr *RHS, 2449 SourceLocation RParenLoc) { 2450 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2451 Cond, LHS, RHS, 2452 RParenLoc); 2453 } 2454 2455 /// Build a new generic selection expression. 2456 /// 2457 /// By default, performs semantic analysis to build the new expression. 2458 /// Subclasses may override this routine to provide different behavior. 2459 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2460 SourceLocation DefaultLoc, 2461 SourceLocation RParenLoc, 2462 Expr *ControllingExpr, 2463 ArrayRef<TypeSourceInfo *> Types, 2464 ArrayRef<Expr *> Exprs) { 2465 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2466 ControllingExpr, Types, Exprs); 2467 } 2468 2469 /// Build a new overloaded operator call expression. 2470 /// 2471 /// By default, performs semantic analysis to build the new expression. 2472 /// The semantic analysis provides the behavior of template instantiation, 2473 /// copying with transformations that turn what looks like an overloaded 2474 /// operator call into a use of a builtin operator, performing 2475 /// argument-dependent lookup, etc. Subclasses may override this routine to 2476 /// provide different behavior. 2477 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2478 SourceLocation OpLoc, 2479 Expr *Callee, 2480 Expr *First, 2481 Expr *Second); 2482 2483 /// Build a new C++ "named" cast expression, such as static_cast or 2484 /// reinterpret_cast. 2485 /// 2486 /// By default, this routine dispatches to one of the more-specific routines 2487 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2488 /// Subclasses may override this routine to provide different behavior. 2489 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2490 Stmt::StmtClass Class, 2491 SourceLocation LAngleLoc, 2492 TypeSourceInfo *TInfo, 2493 SourceLocation RAngleLoc, 2494 SourceLocation LParenLoc, 2495 Expr *SubExpr, 2496 SourceLocation RParenLoc) { 2497 switch (Class) { 2498 case Stmt::CXXStaticCastExprClass: 2499 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2500 RAngleLoc, LParenLoc, 2501 SubExpr, RParenLoc); 2502 2503 case Stmt::CXXDynamicCastExprClass: 2504 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2505 RAngleLoc, LParenLoc, 2506 SubExpr, RParenLoc); 2507 2508 case Stmt::CXXReinterpretCastExprClass: 2509 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2510 RAngleLoc, LParenLoc, 2511 SubExpr, 2512 RParenLoc); 2513 2514 case Stmt::CXXConstCastExprClass: 2515 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2516 RAngleLoc, LParenLoc, 2517 SubExpr, RParenLoc); 2518 2519 default: 2520 llvm_unreachable("Invalid C++ named cast"); 2521 } 2522 } 2523 2524 /// Build a new C++ static_cast expression. 2525 /// 2526 /// By default, performs semantic analysis to build the new expression. 2527 /// Subclasses may override this routine to provide different behavior. 2528 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2529 SourceLocation LAngleLoc, 2530 TypeSourceInfo *TInfo, 2531 SourceLocation RAngleLoc, 2532 SourceLocation LParenLoc, 2533 Expr *SubExpr, 2534 SourceLocation RParenLoc) { 2535 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2536 TInfo, SubExpr, 2537 SourceRange(LAngleLoc, RAngleLoc), 2538 SourceRange(LParenLoc, RParenLoc)); 2539 } 2540 2541 /// Build a new C++ dynamic_cast expression. 2542 /// 2543 /// By default, performs semantic analysis to build the new expression. 2544 /// Subclasses may override this routine to provide different behavior. 2545 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2546 SourceLocation LAngleLoc, 2547 TypeSourceInfo *TInfo, 2548 SourceLocation RAngleLoc, 2549 SourceLocation LParenLoc, 2550 Expr *SubExpr, 2551 SourceLocation RParenLoc) { 2552 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2553 TInfo, SubExpr, 2554 SourceRange(LAngleLoc, RAngleLoc), 2555 SourceRange(LParenLoc, RParenLoc)); 2556 } 2557 2558 /// Build a new C++ reinterpret_cast expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2563 SourceLocation LAngleLoc, 2564 TypeSourceInfo *TInfo, 2565 SourceLocation RAngleLoc, 2566 SourceLocation LParenLoc, 2567 Expr *SubExpr, 2568 SourceLocation RParenLoc) { 2569 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2570 TInfo, SubExpr, 2571 SourceRange(LAngleLoc, RAngleLoc), 2572 SourceRange(LParenLoc, RParenLoc)); 2573 } 2574 2575 /// Build a new C++ const_cast expression. 2576 /// 2577 /// By default, performs semantic analysis to build the new expression. 2578 /// Subclasses may override this routine to provide different behavior. 2579 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2580 SourceLocation LAngleLoc, 2581 TypeSourceInfo *TInfo, 2582 SourceLocation RAngleLoc, 2583 SourceLocation LParenLoc, 2584 Expr *SubExpr, 2585 SourceLocation RParenLoc) { 2586 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2587 TInfo, SubExpr, 2588 SourceRange(LAngleLoc, RAngleLoc), 2589 SourceRange(LParenLoc, RParenLoc)); 2590 } 2591 2592 /// Build a new C++ functional-style cast expression. 2593 /// 2594 /// By default, performs semantic analysis to build the new expression. 2595 /// Subclasses may override this routine to provide different behavior. 2596 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2597 SourceLocation LParenLoc, 2598 Expr *Sub, 2599 SourceLocation RParenLoc, 2600 bool ListInitialization) { 2601 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2602 MultiExprArg(&Sub, 1), RParenLoc, 2603 ListInitialization); 2604 } 2605 2606 /// Build a new C++ typeid(type) expression. 2607 /// 2608 /// By default, performs semantic analysis to build the new expression. 2609 /// Subclasses may override this routine to provide different behavior. 2610 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2611 SourceLocation TypeidLoc, 2612 TypeSourceInfo *Operand, 2613 SourceLocation RParenLoc) { 2614 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2615 RParenLoc); 2616 } 2617 2618 2619 /// Build a new C++ typeid(expr) expression. 2620 /// 2621 /// By default, performs semantic analysis to build the new expression. 2622 /// Subclasses may override this routine to provide different behavior. 2623 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2624 SourceLocation TypeidLoc, 2625 Expr *Operand, 2626 SourceLocation RParenLoc) { 2627 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2628 RParenLoc); 2629 } 2630 2631 /// Build a new C++ __uuidof(type) expression. 2632 /// 2633 /// By default, performs semantic analysis to build the new expression. 2634 /// Subclasses may override this routine to provide different behavior. 2635 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2636 SourceLocation TypeidLoc, 2637 TypeSourceInfo *Operand, 2638 SourceLocation RParenLoc) { 2639 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2640 RParenLoc); 2641 } 2642 2643 /// Build a new C++ __uuidof(expr) expression. 2644 /// 2645 /// By default, performs semantic analysis to build the new expression. 2646 /// Subclasses may override this routine to provide different behavior. 2647 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2648 SourceLocation TypeidLoc, 2649 Expr *Operand, 2650 SourceLocation RParenLoc) { 2651 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2652 RParenLoc); 2653 } 2654 2655 /// Build a new C++ "this" expression. 2656 /// 2657 /// By default, builds a new "this" expression without performing any 2658 /// semantic analysis. Subclasses may override this routine to provide 2659 /// different behavior. 2660 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2661 QualType ThisType, 2662 bool isImplicit) { 2663 getSema().CheckCXXThisCapture(ThisLoc); 2664 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2665 } 2666 2667 /// Build a new C++ throw expression. 2668 /// 2669 /// By default, performs semantic analysis to build the new expression. 2670 /// Subclasses may override this routine to provide different behavior. 2671 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2672 bool IsThrownVariableInScope) { 2673 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2674 } 2675 2676 /// Build a new C++ default-argument expression. 2677 /// 2678 /// By default, builds a new default-argument expression, which does not 2679 /// require any semantic analysis. Subclasses may override this routine to 2680 /// provide different behavior. 2681 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2682 ParmVarDecl *Param) { 2683 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2684 } 2685 2686 /// Build a new C++11 default-initialization expression. 2687 /// 2688 /// By default, builds a new default field initialization expression, which 2689 /// does not require any semantic analysis. Subclasses may override this 2690 /// routine to provide different behavior. 2691 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2692 FieldDecl *Field) { 2693 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2694 } 2695 2696 /// Build a new C++ zero-initialization expression. 2697 /// 2698 /// By default, performs semantic analysis to build the new expression. 2699 /// Subclasses may override this routine to provide different behavior. 2700 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2701 SourceLocation LParenLoc, 2702 SourceLocation RParenLoc) { 2703 return getSema().BuildCXXTypeConstructExpr( 2704 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2705 } 2706 2707 /// Build a new C++ "new" expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2712 bool UseGlobal, 2713 SourceLocation PlacementLParen, 2714 MultiExprArg PlacementArgs, 2715 SourceLocation PlacementRParen, 2716 SourceRange TypeIdParens, 2717 QualType AllocatedType, 2718 TypeSourceInfo *AllocatedTypeInfo, 2719 Expr *ArraySize, 2720 SourceRange DirectInitRange, 2721 Expr *Initializer) { 2722 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2723 PlacementLParen, 2724 PlacementArgs, 2725 PlacementRParen, 2726 TypeIdParens, 2727 AllocatedType, 2728 AllocatedTypeInfo, 2729 ArraySize, 2730 DirectInitRange, 2731 Initializer); 2732 } 2733 2734 /// Build a new C++ "delete" expression. 2735 /// 2736 /// By default, performs semantic analysis to build the new expression. 2737 /// Subclasses may override this routine to provide different behavior. 2738 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2739 bool IsGlobalDelete, 2740 bool IsArrayForm, 2741 Expr *Operand) { 2742 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2743 Operand); 2744 } 2745 2746 /// Build a new type trait expression. 2747 /// 2748 /// By default, performs semantic analysis to build the new expression. 2749 /// Subclasses may override this routine to provide different behavior. 2750 ExprResult RebuildTypeTrait(TypeTrait Trait, 2751 SourceLocation StartLoc, 2752 ArrayRef<TypeSourceInfo *> Args, 2753 SourceLocation RParenLoc) { 2754 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2755 } 2756 2757 /// Build a new array type trait expression. 2758 /// 2759 /// By default, performs semantic analysis to build the new expression. 2760 /// Subclasses may override this routine to provide different behavior. 2761 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2762 SourceLocation StartLoc, 2763 TypeSourceInfo *TSInfo, 2764 Expr *DimExpr, 2765 SourceLocation RParenLoc) { 2766 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2767 } 2768 2769 /// Build a new expression trait expression. 2770 /// 2771 /// By default, performs semantic analysis to build the new expression. 2772 /// Subclasses may override this routine to provide different behavior. 2773 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2774 SourceLocation StartLoc, 2775 Expr *Queried, 2776 SourceLocation RParenLoc) { 2777 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2778 } 2779 2780 /// Build a new (previously unresolved) declaration reference 2781 /// expression. 2782 /// 2783 /// By default, performs semantic analysis to build the new expression. 2784 /// Subclasses may override this routine to provide different behavior. 2785 ExprResult RebuildDependentScopeDeclRefExpr( 2786 NestedNameSpecifierLoc QualifierLoc, 2787 SourceLocation TemplateKWLoc, 2788 const DeclarationNameInfo &NameInfo, 2789 const TemplateArgumentListInfo *TemplateArgs, 2790 bool IsAddressOfOperand, 2791 TypeSourceInfo **RecoveryTSI) { 2792 CXXScopeSpec SS; 2793 SS.Adopt(QualifierLoc); 2794 2795 if (TemplateArgs || TemplateKWLoc.isValid()) 2796 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2797 TemplateArgs); 2798 2799 return getSema().BuildQualifiedDeclarationNameExpr( 2800 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2801 } 2802 2803 /// Build a new template-id expression. 2804 /// 2805 /// By default, performs semantic analysis to build the new expression. 2806 /// Subclasses may override this routine to provide different behavior. 2807 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2808 SourceLocation TemplateKWLoc, 2809 LookupResult &R, 2810 bool RequiresADL, 2811 const TemplateArgumentListInfo *TemplateArgs) { 2812 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2813 TemplateArgs); 2814 } 2815 2816 /// Build a new object-construction expression. 2817 /// 2818 /// By default, performs semantic analysis to build the new expression. 2819 /// Subclasses may override this routine to provide different behavior. 2820 ExprResult RebuildCXXConstructExpr(QualType T, 2821 SourceLocation Loc, 2822 CXXConstructorDecl *Constructor, 2823 bool IsElidable, 2824 MultiExprArg Args, 2825 bool HadMultipleCandidates, 2826 bool ListInitialization, 2827 bool StdInitListInitialization, 2828 bool RequiresZeroInit, 2829 CXXConstructExpr::ConstructionKind ConstructKind, 2830 SourceRange ParenRange) { 2831 SmallVector<Expr*, 8> ConvertedArgs; 2832 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2833 ConvertedArgs)) 2834 return ExprError(); 2835 2836 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2837 IsElidable, 2838 ConvertedArgs, 2839 HadMultipleCandidates, 2840 ListInitialization, 2841 StdInitListInitialization, 2842 RequiresZeroInit, ConstructKind, 2843 ParenRange); 2844 } 2845 2846 /// Build a new implicit construction via inherited constructor 2847 /// expression. 2848 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2849 CXXConstructorDecl *Constructor, 2850 bool ConstructsVBase, 2851 bool InheritedFromVBase) { 2852 return new (getSema().Context) CXXInheritedCtorInitExpr( 2853 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2854 } 2855 2856 /// Build a new object-construction expression. 2857 /// 2858 /// By default, performs semantic analysis to build the new expression. 2859 /// Subclasses may override this routine to provide different behavior. 2860 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2861 SourceLocation LParenOrBraceLoc, 2862 MultiExprArg Args, 2863 SourceLocation RParenOrBraceLoc, 2864 bool ListInitialization) { 2865 return getSema().BuildCXXTypeConstructExpr( 2866 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2867 } 2868 2869 /// Build a new object-construction expression. 2870 /// 2871 /// By default, performs semantic analysis to build the new expression. 2872 /// Subclasses may override this routine to provide different behavior. 2873 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2874 SourceLocation LParenLoc, 2875 MultiExprArg Args, 2876 SourceLocation RParenLoc, 2877 bool ListInitialization) { 2878 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2879 RParenLoc, ListInitialization); 2880 } 2881 2882 /// Build a new member reference expression. 2883 /// 2884 /// By default, performs semantic analysis to build the new expression. 2885 /// Subclasses may override this routine to provide different behavior. 2886 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2887 QualType BaseType, 2888 bool IsArrow, 2889 SourceLocation OperatorLoc, 2890 NestedNameSpecifierLoc QualifierLoc, 2891 SourceLocation TemplateKWLoc, 2892 NamedDecl *FirstQualifierInScope, 2893 const DeclarationNameInfo &MemberNameInfo, 2894 const TemplateArgumentListInfo *TemplateArgs) { 2895 CXXScopeSpec SS; 2896 SS.Adopt(QualifierLoc); 2897 2898 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2899 OperatorLoc, IsArrow, 2900 SS, TemplateKWLoc, 2901 FirstQualifierInScope, 2902 MemberNameInfo, 2903 TemplateArgs, /*S*/nullptr); 2904 } 2905 2906 /// Build a new member reference expression. 2907 /// 2908 /// By default, performs semantic analysis to build the new expression. 2909 /// Subclasses may override this routine to provide different behavior. 2910 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2911 SourceLocation OperatorLoc, 2912 bool IsArrow, 2913 NestedNameSpecifierLoc QualifierLoc, 2914 SourceLocation TemplateKWLoc, 2915 NamedDecl *FirstQualifierInScope, 2916 LookupResult &R, 2917 const TemplateArgumentListInfo *TemplateArgs) { 2918 CXXScopeSpec SS; 2919 SS.Adopt(QualifierLoc); 2920 2921 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2922 OperatorLoc, IsArrow, 2923 SS, TemplateKWLoc, 2924 FirstQualifierInScope, 2925 R, TemplateArgs, /*S*/nullptr); 2926 } 2927 2928 /// Build a new noexcept expression. 2929 /// 2930 /// By default, performs semantic analysis to build the new expression. 2931 /// Subclasses may override this routine to provide different behavior. 2932 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2933 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2934 } 2935 2936 /// Build a new expression to compute the length of a parameter pack. 2937 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2938 NamedDecl *Pack, 2939 SourceLocation PackLoc, 2940 SourceLocation RParenLoc, 2941 Optional<unsigned> Length, 2942 ArrayRef<TemplateArgument> PartialArgs) { 2943 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2944 RParenLoc, Length, PartialArgs); 2945 } 2946 2947 /// Build a new Objective-C boxed expression. 2948 /// 2949 /// By default, performs semantic analysis to build the new expression. 2950 /// Subclasses may override this routine to provide different behavior. 2951 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2952 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2953 } 2954 2955 /// Build a new Objective-C array literal. 2956 /// 2957 /// By default, performs semantic analysis to build the new expression. 2958 /// Subclasses may override this routine to provide different behavior. 2959 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2960 Expr **Elements, unsigned NumElements) { 2961 return getSema().BuildObjCArrayLiteral(Range, 2962 MultiExprArg(Elements, NumElements)); 2963 } 2964 2965 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2966 Expr *Base, Expr *Key, 2967 ObjCMethodDecl *getterMethod, 2968 ObjCMethodDecl *setterMethod) { 2969 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2970 getterMethod, setterMethod); 2971 } 2972 2973 /// Build a new Objective-C dictionary literal. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2978 MutableArrayRef<ObjCDictionaryElement> Elements) { 2979 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2980 } 2981 2982 /// Build a new Objective-C \@encode expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2987 TypeSourceInfo *EncodeTypeInfo, 2988 SourceLocation RParenLoc) { 2989 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2990 } 2991 2992 /// Build a new Objective-C class message. 2993 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2994 Selector Sel, 2995 ArrayRef<SourceLocation> SelectorLocs, 2996 ObjCMethodDecl *Method, 2997 SourceLocation LBracLoc, 2998 MultiExprArg Args, 2999 SourceLocation RBracLoc) { 3000 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3001 ReceiverTypeInfo->getType(), 3002 /*SuperLoc=*/SourceLocation(), 3003 Sel, Method, LBracLoc, SelectorLocs, 3004 RBracLoc, Args); 3005 } 3006 3007 /// Build a new Objective-C instance message. 3008 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3009 Selector Sel, 3010 ArrayRef<SourceLocation> SelectorLocs, 3011 ObjCMethodDecl *Method, 3012 SourceLocation LBracLoc, 3013 MultiExprArg Args, 3014 SourceLocation RBracLoc) { 3015 return SemaRef.BuildInstanceMessage(Receiver, 3016 Receiver->getType(), 3017 /*SuperLoc=*/SourceLocation(), 3018 Sel, Method, LBracLoc, SelectorLocs, 3019 RBracLoc, Args); 3020 } 3021 3022 /// Build a new Objective-C instance/class message to 'super'. 3023 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3024 Selector Sel, 3025 ArrayRef<SourceLocation> SelectorLocs, 3026 QualType SuperType, 3027 ObjCMethodDecl *Method, 3028 SourceLocation LBracLoc, 3029 MultiExprArg Args, 3030 SourceLocation RBracLoc) { 3031 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3032 SuperType, 3033 SuperLoc, 3034 Sel, Method, LBracLoc, SelectorLocs, 3035 RBracLoc, Args) 3036 : SemaRef.BuildClassMessage(nullptr, 3037 SuperType, 3038 SuperLoc, 3039 Sel, Method, LBracLoc, SelectorLocs, 3040 RBracLoc, Args); 3041 3042 3043 } 3044 3045 /// Build a new Objective-C ivar reference expression. 3046 /// 3047 /// By default, performs semantic analysis to build the new expression. 3048 /// Subclasses may override this routine to provide different behavior. 3049 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3050 SourceLocation IvarLoc, 3051 bool IsArrow, bool IsFreeIvar) { 3052 CXXScopeSpec SS; 3053 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3054 ExprResult Result = getSema().BuildMemberReferenceExpr( 3055 BaseArg, BaseArg->getType(), 3056 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3057 /*FirstQualifierInScope=*/nullptr, NameInfo, 3058 /*TemplateArgs=*/nullptr, 3059 /*S=*/nullptr); 3060 if (IsFreeIvar && Result.isUsable()) 3061 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3062 return Result; 3063 } 3064 3065 /// Build a new Objective-C property reference expression. 3066 /// 3067 /// By default, performs semantic analysis to build the new expression. 3068 /// Subclasses may override this routine to provide different behavior. 3069 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3070 ObjCPropertyDecl *Property, 3071 SourceLocation PropertyLoc) { 3072 CXXScopeSpec SS; 3073 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3074 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3075 /*FIXME:*/PropertyLoc, 3076 /*IsArrow=*/false, 3077 SS, SourceLocation(), 3078 /*FirstQualifierInScope=*/nullptr, 3079 NameInfo, 3080 /*TemplateArgs=*/nullptr, 3081 /*S=*/nullptr); 3082 } 3083 3084 /// Build a new Objective-C property reference expression. 3085 /// 3086 /// By default, performs semantic analysis to build the new expression. 3087 /// Subclasses may override this routine to provide different behavior. 3088 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3089 ObjCMethodDecl *Getter, 3090 ObjCMethodDecl *Setter, 3091 SourceLocation PropertyLoc) { 3092 // Since these expressions can only be value-dependent, we do not 3093 // need to perform semantic analysis again. 3094 return Owned( 3095 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3096 VK_LValue, OK_ObjCProperty, 3097 PropertyLoc, Base)); 3098 } 3099 3100 /// Build a new Objective-C "isa" expression. 3101 /// 3102 /// By default, performs semantic analysis to build the new expression. 3103 /// Subclasses may override this routine to provide different behavior. 3104 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3105 SourceLocation OpLoc, bool IsArrow) { 3106 CXXScopeSpec SS; 3107 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3108 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3109 OpLoc, IsArrow, 3110 SS, SourceLocation(), 3111 /*FirstQualifierInScope=*/nullptr, 3112 NameInfo, 3113 /*TemplateArgs=*/nullptr, 3114 /*S=*/nullptr); 3115 } 3116 3117 /// Build a new shuffle vector expression. 3118 /// 3119 /// By default, performs semantic analysis to build the new expression. 3120 /// Subclasses may override this routine to provide different behavior. 3121 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3122 MultiExprArg SubExprs, 3123 SourceLocation RParenLoc) { 3124 // Find the declaration for __builtin_shufflevector 3125 const IdentifierInfo &Name 3126 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3127 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3128 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3129 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3130 3131 // Build a reference to the __builtin_shufflevector builtin 3132 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3133 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3134 SemaRef.Context.BuiltinFnTy, 3135 VK_RValue, BuiltinLoc); 3136 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3137 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3138 CK_BuiltinFnToFnPtr).get(); 3139 3140 // Build the CallExpr 3141 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3142 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3143 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3144 3145 // Type-check the __builtin_shufflevector expression. 3146 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3147 } 3148 3149 /// Build a new convert vector expression. 3150 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3151 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3152 SourceLocation RParenLoc) { 3153 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3154 BuiltinLoc, RParenLoc); 3155 } 3156 3157 /// Build a new template argument pack expansion. 3158 /// 3159 /// By default, performs semantic analysis to build a new pack expansion 3160 /// for a template argument. Subclasses may override this routine to provide 3161 /// different behavior. 3162 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3163 SourceLocation EllipsisLoc, 3164 Optional<unsigned> NumExpansions) { 3165 switch (Pattern.getArgument().getKind()) { 3166 case TemplateArgument::Expression: { 3167 ExprResult Result 3168 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3169 EllipsisLoc, NumExpansions); 3170 if (Result.isInvalid()) 3171 return TemplateArgumentLoc(); 3172 3173 return TemplateArgumentLoc(Result.get(), Result.get()); 3174 } 3175 3176 case TemplateArgument::Template: 3177 return TemplateArgumentLoc(TemplateArgument( 3178 Pattern.getArgument().getAsTemplate(), 3179 NumExpansions), 3180 Pattern.getTemplateQualifierLoc(), 3181 Pattern.getTemplateNameLoc(), 3182 EllipsisLoc); 3183 3184 case TemplateArgument::Null: 3185 case TemplateArgument::Integral: 3186 case TemplateArgument::Declaration: 3187 case TemplateArgument::Pack: 3188 case TemplateArgument::TemplateExpansion: 3189 case TemplateArgument::NullPtr: 3190 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3191 3192 case TemplateArgument::Type: 3193 if (TypeSourceInfo *Expansion 3194 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3195 EllipsisLoc, 3196 NumExpansions)) 3197 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3198 Expansion); 3199 break; 3200 } 3201 3202 return TemplateArgumentLoc(); 3203 } 3204 3205 /// Build a new expression pack expansion. 3206 /// 3207 /// By default, performs semantic analysis to build a new pack expansion 3208 /// for an expression. Subclasses may override this routine to provide 3209 /// different behavior. 3210 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3211 Optional<unsigned> NumExpansions) { 3212 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3213 } 3214 3215 /// Build a new C++1z fold-expression. 3216 /// 3217 /// By default, performs semantic analysis in order to build a new fold 3218 /// expression. 3219 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3220 BinaryOperatorKind Operator, 3221 SourceLocation EllipsisLoc, Expr *RHS, 3222 SourceLocation RParenLoc) { 3223 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3224 RHS, RParenLoc); 3225 } 3226 3227 /// Build an empty C++1z fold-expression with the given operator. 3228 /// 3229 /// By default, produces the fallback value for the fold-expression, or 3230 /// produce an error if there is no fallback value. 3231 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3232 BinaryOperatorKind Operator) { 3233 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3234 } 3235 3236 /// Build a new atomic operation expression. 3237 /// 3238 /// By default, performs semantic analysis to build the new expression. 3239 /// Subclasses may override this routine to provide different behavior. 3240 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3241 MultiExprArg SubExprs, 3242 QualType RetTy, 3243 AtomicExpr::AtomicOp Op, 3244 SourceLocation RParenLoc) { 3245 // Just create the expression; there is not any interesting semantic 3246 // analysis here because we can't actually build an AtomicExpr until 3247 // we are sure it is semantically sound. 3248 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3249 RParenLoc); 3250 } 3251 3252 private: 3253 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3254 QualType ObjectType, 3255 NamedDecl *FirstQualifierInScope, 3256 CXXScopeSpec &SS); 3257 3258 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3259 QualType ObjectType, 3260 NamedDecl *FirstQualifierInScope, 3261 CXXScopeSpec &SS); 3262 3263 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3264 NamedDecl *FirstQualifierInScope, 3265 CXXScopeSpec &SS); 3266 3267 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3268 DependentNameTypeLoc TL, 3269 bool DeducibleTSTContext); 3270 }; 3271 3272 template<typename Derived> 3273 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3274 if (!S) 3275 return S; 3276 3277 switch (S->getStmtClass()) { 3278 case Stmt::NoStmtClass: break; 3279 3280 // Transform individual statement nodes 3281 #define STMT(Node, Parent) \ 3282 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3283 #define ABSTRACT_STMT(Node) 3284 #define EXPR(Node, Parent) 3285 #include "clang/AST/StmtNodes.inc" 3286 3287 // Transform expressions by calling TransformExpr. 3288 #define STMT(Node, Parent) 3289 #define ABSTRACT_STMT(Stmt) 3290 #define EXPR(Node, Parent) case Stmt::Node##Class: 3291 #include "clang/AST/StmtNodes.inc" 3292 { 3293 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3294 if (E.isInvalid()) 3295 return StmtError(); 3296 3297 return getSema().ActOnExprStmt(E); 3298 } 3299 } 3300 3301 return S; 3302 } 3303 3304 template<typename Derived> 3305 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3306 if (!S) 3307 return S; 3308 3309 switch (S->getClauseKind()) { 3310 default: break; 3311 // Transform individual clause nodes 3312 #define OPENMP_CLAUSE(Name, Class) \ 3313 case OMPC_ ## Name : \ 3314 return getDerived().Transform ## Class(cast<Class>(S)); 3315 #include "clang/Basic/OpenMPKinds.def" 3316 } 3317 3318 return S; 3319 } 3320 3321 3322 template<typename Derived> 3323 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3324 if (!E) 3325 return E; 3326 3327 switch (E->getStmtClass()) { 3328 case Stmt::NoStmtClass: break; 3329 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3330 #define ABSTRACT_STMT(Stmt) 3331 #define EXPR(Node, Parent) \ 3332 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3333 #include "clang/AST/StmtNodes.inc" 3334 } 3335 3336 return E; 3337 } 3338 3339 template<typename Derived> 3340 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3341 bool NotCopyInit) { 3342 // Initializers are instantiated like expressions, except that various outer 3343 // layers are stripped. 3344 if (!Init) 3345 return Init; 3346 3347 if (auto *FE = dyn_cast<FullExpr>(Init)) 3348 Init = FE->getSubExpr(); 3349 3350 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3351 Init = AIL->getCommonExpr(); 3352 3353 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3354 Init = MTE->GetTemporaryExpr(); 3355 3356 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3357 Init = Binder->getSubExpr(); 3358 3359 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3360 Init = ICE->getSubExprAsWritten(); 3361 3362 if (CXXStdInitializerListExpr *ILE = 3363 dyn_cast<CXXStdInitializerListExpr>(Init)) 3364 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3365 3366 // If this is copy-initialization, we only need to reconstruct 3367 // InitListExprs. Other forms of copy-initialization will be a no-op if 3368 // the initializer is already the right type. 3369 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3370 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3371 return getDerived().TransformExpr(Init); 3372 3373 // Revert value-initialization back to empty parens. 3374 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3375 SourceRange Parens = VIE->getSourceRange(); 3376 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3377 Parens.getEnd()); 3378 } 3379 3380 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3381 if (isa<ImplicitValueInitExpr>(Init)) 3382 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3383 SourceLocation()); 3384 3385 // Revert initialization by constructor back to a parenthesized or braced list 3386 // of expressions. Any other form of initializer can just be reused directly. 3387 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3388 return getDerived().TransformExpr(Init); 3389 3390 // If the initialization implicitly converted an initializer list to a 3391 // std::initializer_list object, unwrap the std::initializer_list too. 3392 if (Construct && Construct->isStdInitListInitialization()) 3393 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3394 3395 // Enter a list-init context if this was list initialization. 3396 EnterExpressionEvaluationContext Context( 3397 getSema(), EnterExpressionEvaluationContext::InitList, 3398 Construct->isListInitialization()); 3399 3400 SmallVector<Expr*, 8> NewArgs; 3401 bool ArgChanged = false; 3402 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3403 /*IsCall*/true, NewArgs, &ArgChanged)) 3404 return ExprError(); 3405 3406 // If this was list initialization, revert to syntactic list form. 3407 if (Construct->isListInitialization()) 3408 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3409 Construct->getEndLoc()); 3410 3411 // Build a ParenListExpr to represent anything else. 3412 SourceRange Parens = Construct->getParenOrBraceRange(); 3413 if (Parens.isInvalid()) { 3414 // This was a variable declaration's initialization for which no initializer 3415 // was specified. 3416 assert(NewArgs.empty() && 3417 "no parens or braces but have direct init with arguments?"); 3418 return ExprEmpty(); 3419 } 3420 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3421 Parens.getEnd()); 3422 } 3423 3424 template<typename Derived> 3425 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3426 unsigned NumInputs, 3427 bool IsCall, 3428 SmallVectorImpl<Expr *> &Outputs, 3429 bool *ArgChanged) { 3430 for (unsigned I = 0; I != NumInputs; ++I) { 3431 // If requested, drop call arguments that need to be dropped. 3432 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3433 if (ArgChanged) 3434 *ArgChanged = true; 3435 3436 break; 3437 } 3438 3439 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3440 Expr *Pattern = Expansion->getPattern(); 3441 3442 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3443 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3444 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3445 3446 // Determine whether the set of unexpanded parameter packs can and should 3447 // be expanded. 3448 bool Expand = true; 3449 bool RetainExpansion = false; 3450 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3451 Optional<unsigned> NumExpansions = OrigNumExpansions; 3452 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3453 Pattern->getSourceRange(), 3454 Unexpanded, 3455 Expand, RetainExpansion, 3456 NumExpansions)) 3457 return true; 3458 3459 if (!Expand) { 3460 // The transform has determined that we should perform a simple 3461 // transformation on the pack expansion, producing another pack 3462 // expansion. 3463 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3464 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3465 if (OutPattern.isInvalid()) 3466 return true; 3467 3468 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3469 Expansion->getEllipsisLoc(), 3470 NumExpansions); 3471 if (Out.isInvalid()) 3472 return true; 3473 3474 if (ArgChanged) 3475 *ArgChanged = true; 3476 Outputs.push_back(Out.get()); 3477 continue; 3478 } 3479 3480 // Record right away that the argument was changed. This needs 3481 // to happen even if the array expands to nothing. 3482 if (ArgChanged) *ArgChanged = true; 3483 3484 // The transform has determined that we should perform an elementwise 3485 // expansion of the pattern. Do so. 3486 for (unsigned I = 0; I != *NumExpansions; ++I) { 3487 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3488 ExprResult Out = getDerived().TransformExpr(Pattern); 3489 if (Out.isInvalid()) 3490 return true; 3491 3492 if (Out.get()->containsUnexpandedParameterPack()) { 3493 Out = getDerived().RebuildPackExpansion( 3494 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3495 if (Out.isInvalid()) 3496 return true; 3497 } 3498 3499 Outputs.push_back(Out.get()); 3500 } 3501 3502 // If we're supposed to retain a pack expansion, do so by temporarily 3503 // forgetting the partially-substituted parameter pack. 3504 if (RetainExpansion) { 3505 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3506 3507 ExprResult Out = getDerived().TransformExpr(Pattern); 3508 if (Out.isInvalid()) 3509 return true; 3510 3511 Out = getDerived().RebuildPackExpansion( 3512 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3513 if (Out.isInvalid()) 3514 return true; 3515 3516 Outputs.push_back(Out.get()); 3517 } 3518 3519 continue; 3520 } 3521 3522 ExprResult Result = 3523 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3524 : getDerived().TransformExpr(Inputs[I]); 3525 if (Result.isInvalid()) 3526 return true; 3527 3528 if (Result.get() != Inputs[I] && ArgChanged) 3529 *ArgChanged = true; 3530 3531 Outputs.push_back(Result.get()); 3532 } 3533 3534 return false; 3535 } 3536 3537 template <typename Derived> 3538 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3539 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3540 if (Var) { 3541 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3542 getDerived().TransformDefinition(Var->getLocation(), Var)); 3543 3544 if (!ConditionVar) 3545 return Sema::ConditionError(); 3546 3547 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3548 } 3549 3550 if (Expr) { 3551 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3552 3553 if (CondExpr.isInvalid()) 3554 return Sema::ConditionError(); 3555 3556 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3557 } 3558 3559 return Sema::ConditionResult(); 3560 } 3561 3562 template<typename Derived> 3563 NestedNameSpecifierLoc 3564 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3565 NestedNameSpecifierLoc NNS, 3566 QualType ObjectType, 3567 NamedDecl *FirstQualifierInScope) { 3568 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3569 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3570 Qualifier = Qualifier.getPrefix()) 3571 Qualifiers.push_back(Qualifier); 3572 3573 CXXScopeSpec SS; 3574 while (!Qualifiers.empty()) { 3575 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3576 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3577 3578 switch (QNNS->getKind()) { 3579 case NestedNameSpecifier::Identifier: { 3580 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3581 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3582 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3583 SS, FirstQualifierInScope, false)) 3584 return NestedNameSpecifierLoc(); 3585 } 3586 break; 3587 3588 case NestedNameSpecifier::Namespace: { 3589 NamespaceDecl *NS 3590 = cast_or_null<NamespaceDecl>( 3591 getDerived().TransformDecl( 3592 Q.getLocalBeginLoc(), 3593 QNNS->getAsNamespace())); 3594 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3595 break; 3596 } 3597 3598 case NestedNameSpecifier::NamespaceAlias: { 3599 NamespaceAliasDecl *Alias 3600 = cast_or_null<NamespaceAliasDecl>( 3601 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3602 QNNS->getAsNamespaceAlias())); 3603 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3604 Q.getLocalEndLoc()); 3605 break; 3606 } 3607 3608 case NestedNameSpecifier::Global: 3609 // There is no meaningful transformation that one could perform on the 3610 // global scope. 3611 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3612 break; 3613 3614 case NestedNameSpecifier::Super: { 3615 CXXRecordDecl *RD = 3616 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3617 SourceLocation(), QNNS->getAsRecordDecl())); 3618 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3619 break; 3620 } 3621 3622 case NestedNameSpecifier::TypeSpecWithTemplate: 3623 case NestedNameSpecifier::TypeSpec: { 3624 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3625 FirstQualifierInScope, SS); 3626 3627 if (!TL) 3628 return NestedNameSpecifierLoc(); 3629 3630 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3631 (SemaRef.getLangOpts().CPlusPlus11 && 3632 TL.getType()->isEnumeralType())) { 3633 assert(!TL.getType().hasLocalQualifiers() && 3634 "Can't get cv-qualifiers here"); 3635 if (TL.getType()->isEnumeralType()) 3636 SemaRef.Diag(TL.getBeginLoc(), 3637 diag::warn_cxx98_compat_enum_nested_name_spec); 3638 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3639 Q.getLocalEndLoc()); 3640 break; 3641 } 3642 // If the nested-name-specifier is an invalid type def, don't emit an 3643 // error because a previous error should have already been emitted. 3644 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3645 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3646 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3647 << TL.getType() << SS.getRange(); 3648 } 3649 return NestedNameSpecifierLoc(); 3650 } 3651 } 3652 3653 // The qualifier-in-scope and object type only apply to the leftmost entity. 3654 FirstQualifierInScope = nullptr; 3655 ObjectType = QualType(); 3656 } 3657 3658 // Don't rebuild the nested-name-specifier if we don't have to. 3659 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3660 !getDerived().AlwaysRebuild()) 3661 return NNS; 3662 3663 // If we can re-use the source-location data from the original 3664 // nested-name-specifier, do so. 3665 if (SS.location_size() == NNS.getDataLength() && 3666 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3667 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3668 3669 // Allocate new nested-name-specifier location information. 3670 return SS.getWithLocInContext(SemaRef.Context); 3671 } 3672 3673 template<typename Derived> 3674 DeclarationNameInfo 3675 TreeTransform<Derived> 3676 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3677 DeclarationName Name = NameInfo.getName(); 3678 if (!Name) 3679 return DeclarationNameInfo(); 3680 3681 switch (Name.getNameKind()) { 3682 case DeclarationName::Identifier: 3683 case DeclarationName::ObjCZeroArgSelector: 3684 case DeclarationName::ObjCOneArgSelector: 3685 case DeclarationName::ObjCMultiArgSelector: 3686 case DeclarationName::CXXOperatorName: 3687 case DeclarationName::CXXLiteralOperatorName: 3688 case DeclarationName::CXXUsingDirective: 3689 return NameInfo; 3690 3691 case DeclarationName::CXXDeductionGuideName: { 3692 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3693 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3694 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3695 if (!NewTemplate) 3696 return DeclarationNameInfo(); 3697 3698 DeclarationNameInfo NewNameInfo(NameInfo); 3699 NewNameInfo.setName( 3700 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3701 return NewNameInfo; 3702 } 3703 3704 case DeclarationName::CXXConstructorName: 3705 case DeclarationName::CXXDestructorName: 3706 case DeclarationName::CXXConversionFunctionName: { 3707 TypeSourceInfo *NewTInfo; 3708 CanQualType NewCanTy; 3709 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3710 NewTInfo = getDerived().TransformType(OldTInfo); 3711 if (!NewTInfo) 3712 return DeclarationNameInfo(); 3713 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3714 } 3715 else { 3716 NewTInfo = nullptr; 3717 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3718 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3719 if (NewT.isNull()) 3720 return DeclarationNameInfo(); 3721 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3722 } 3723 3724 DeclarationName NewName 3725 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3726 NewCanTy); 3727 DeclarationNameInfo NewNameInfo(NameInfo); 3728 NewNameInfo.setName(NewName); 3729 NewNameInfo.setNamedTypeInfo(NewTInfo); 3730 return NewNameInfo; 3731 } 3732 } 3733 3734 llvm_unreachable("Unknown name kind."); 3735 } 3736 3737 template<typename Derived> 3738 TemplateName 3739 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3740 TemplateName Name, 3741 SourceLocation NameLoc, 3742 QualType ObjectType, 3743 NamedDecl *FirstQualifierInScope, 3744 bool AllowInjectedClassName) { 3745 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3746 TemplateDecl *Template = QTN->getTemplateDecl(); 3747 assert(Template && "qualified template name must refer to a template"); 3748 3749 TemplateDecl *TransTemplate 3750 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3751 Template)); 3752 if (!TransTemplate) 3753 return TemplateName(); 3754 3755 if (!getDerived().AlwaysRebuild() && 3756 SS.getScopeRep() == QTN->getQualifier() && 3757 TransTemplate == Template) 3758 return Name; 3759 3760 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3761 TransTemplate); 3762 } 3763 3764 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3765 if (SS.getScopeRep()) { 3766 // These apply to the scope specifier, not the template. 3767 ObjectType = QualType(); 3768 FirstQualifierInScope = nullptr; 3769 } 3770 3771 if (!getDerived().AlwaysRebuild() && 3772 SS.getScopeRep() == DTN->getQualifier() && 3773 ObjectType.isNull()) 3774 return Name; 3775 3776 // FIXME: Preserve the location of the "template" keyword. 3777 SourceLocation TemplateKWLoc = NameLoc; 3778 3779 if (DTN->isIdentifier()) { 3780 return getDerived().RebuildTemplateName(SS, 3781 TemplateKWLoc, 3782 *DTN->getIdentifier(), 3783 NameLoc, 3784 ObjectType, 3785 FirstQualifierInScope, 3786 AllowInjectedClassName); 3787 } 3788 3789 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3790 DTN->getOperator(), NameLoc, 3791 ObjectType, AllowInjectedClassName); 3792 } 3793 3794 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3795 TemplateDecl *TransTemplate 3796 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3797 Template)); 3798 if (!TransTemplate) 3799 return TemplateName(); 3800 3801 if (!getDerived().AlwaysRebuild() && 3802 TransTemplate == Template) 3803 return Name; 3804 3805 return TemplateName(TransTemplate); 3806 } 3807 3808 if (SubstTemplateTemplateParmPackStorage *SubstPack 3809 = Name.getAsSubstTemplateTemplateParmPack()) { 3810 TemplateTemplateParmDecl *TransParam 3811 = cast_or_null<TemplateTemplateParmDecl>( 3812 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3813 if (!TransParam) 3814 return TemplateName(); 3815 3816 if (!getDerived().AlwaysRebuild() && 3817 TransParam == SubstPack->getParameterPack()) 3818 return Name; 3819 3820 return getDerived().RebuildTemplateName(TransParam, 3821 SubstPack->getArgumentPack()); 3822 } 3823 3824 // These should be getting filtered out before they reach the AST. 3825 llvm_unreachable("overloaded function decl survived to here"); 3826 } 3827 3828 template<typename Derived> 3829 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3830 const TemplateArgument &Arg, 3831 TemplateArgumentLoc &Output) { 3832 SourceLocation Loc = getDerived().getBaseLocation(); 3833 switch (Arg.getKind()) { 3834 case TemplateArgument::Null: 3835 llvm_unreachable("null template argument in TreeTransform"); 3836 break; 3837 3838 case TemplateArgument::Type: 3839 Output = TemplateArgumentLoc(Arg, 3840 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3841 3842 break; 3843 3844 case TemplateArgument::Template: 3845 case TemplateArgument::TemplateExpansion: { 3846 NestedNameSpecifierLocBuilder Builder; 3847 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3848 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3849 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3850 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3851 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3852 3853 if (Arg.getKind() == TemplateArgument::Template) 3854 Output = TemplateArgumentLoc(Arg, 3855 Builder.getWithLocInContext(SemaRef.Context), 3856 Loc); 3857 else 3858 Output = TemplateArgumentLoc(Arg, 3859 Builder.getWithLocInContext(SemaRef.Context), 3860 Loc, Loc); 3861 3862 break; 3863 } 3864 3865 case TemplateArgument::Expression: 3866 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3867 break; 3868 3869 case TemplateArgument::Declaration: 3870 case TemplateArgument::Integral: 3871 case TemplateArgument::Pack: 3872 case TemplateArgument::NullPtr: 3873 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3874 break; 3875 } 3876 } 3877 3878 template<typename Derived> 3879 bool TreeTransform<Derived>::TransformTemplateArgument( 3880 const TemplateArgumentLoc &Input, 3881 TemplateArgumentLoc &Output, bool Uneval) { 3882 EnterExpressionEvaluationContext EEEC( 3883 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated, 3884 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 3885 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 3886 const TemplateArgument &Arg = Input.getArgument(); 3887 switch (Arg.getKind()) { 3888 case TemplateArgument::Null: 3889 case TemplateArgument::Integral: 3890 case TemplateArgument::Pack: 3891 case TemplateArgument::Declaration: 3892 case TemplateArgument::NullPtr: 3893 llvm_unreachable("Unexpected TemplateArgument"); 3894 3895 case TemplateArgument::Type: { 3896 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3897 if (!DI) 3898 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3899 3900 DI = getDerived().TransformType(DI); 3901 if (!DI) return true; 3902 3903 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3904 return false; 3905 } 3906 3907 case TemplateArgument::Template: { 3908 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3909 if (QualifierLoc) { 3910 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3911 if (!QualifierLoc) 3912 return true; 3913 } 3914 3915 CXXScopeSpec SS; 3916 SS.Adopt(QualifierLoc); 3917 TemplateName Template 3918 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3919 Input.getTemplateNameLoc()); 3920 if (Template.isNull()) 3921 return true; 3922 3923 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3924 Input.getTemplateNameLoc()); 3925 return false; 3926 } 3927 3928 case TemplateArgument::TemplateExpansion: 3929 llvm_unreachable("Caller should expand pack expansions"); 3930 3931 case TemplateArgument::Expression: { 3932 // Template argument expressions are constant expressions. 3933 EnterExpressionEvaluationContext Unevaluated( 3934 getSema(), Uneval 3935 ? Sema::ExpressionEvaluationContext::Unevaluated 3936 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3937 3938 Expr *InputExpr = Input.getSourceExpression(); 3939 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3940 3941 ExprResult E = getDerived().TransformExpr(InputExpr); 3942 E = SemaRef.ActOnConstantExpression(E); 3943 if (E.isInvalid()) return true; 3944 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3945 return false; 3946 } 3947 } 3948 3949 // Work around bogus GCC warning 3950 return true; 3951 } 3952 3953 /// Iterator adaptor that invents template argument location information 3954 /// for each of the template arguments in its underlying iterator. 3955 template<typename Derived, typename InputIterator> 3956 class TemplateArgumentLocInventIterator { 3957 TreeTransform<Derived> &Self; 3958 InputIterator Iter; 3959 3960 public: 3961 typedef TemplateArgumentLoc value_type; 3962 typedef TemplateArgumentLoc reference; 3963 typedef typename std::iterator_traits<InputIterator>::difference_type 3964 difference_type; 3965 typedef std::input_iterator_tag iterator_category; 3966 3967 class pointer { 3968 TemplateArgumentLoc Arg; 3969 3970 public: 3971 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3972 3973 const TemplateArgumentLoc *operator->() const { return &Arg; } 3974 }; 3975 3976 TemplateArgumentLocInventIterator() { } 3977 3978 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3979 InputIterator Iter) 3980 : Self(Self), Iter(Iter) { } 3981 3982 TemplateArgumentLocInventIterator &operator++() { 3983 ++Iter; 3984 return *this; 3985 } 3986 3987 TemplateArgumentLocInventIterator operator++(int) { 3988 TemplateArgumentLocInventIterator Old(*this); 3989 ++(*this); 3990 return Old; 3991 } 3992 3993 reference operator*() const { 3994 TemplateArgumentLoc Result; 3995 Self.InventTemplateArgumentLoc(*Iter, Result); 3996 return Result; 3997 } 3998 3999 pointer operator->() const { return pointer(**this); } 4000 4001 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4002 const TemplateArgumentLocInventIterator &Y) { 4003 return X.Iter == Y.Iter; 4004 } 4005 4006 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4007 const TemplateArgumentLocInventIterator &Y) { 4008 return X.Iter != Y.Iter; 4009 } 4010 }; 4011 4012 template<typename Derived> 4013 template<typename InputIterator> 4014 bool TreeTransform<Derived>::TransformTemplateArguments( 4015 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4016 bool Uneval) { 4017 for (; First != Last; ++First) { 4018 TemplateArgumentLoc Out; 4019 TemplateArgumentLoc In = *First; 4020 4021 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4022 // Unpack argument packs, which we translate them into separate 4023 // arguments. 4024 // FIXME: We could do much better if we could guarantee that the 4025 // TemplateArgumentLocInfo for the pack expansion would be usable for 4026 // all of the template arguments in the argument pack. 4027 typedef TemplateArgumentLocInventIterator<Derived, 4028 TemplateArgument::pack_iterator> 4029 PackLocIterator; 4030 if (TransformTemplateArguments(PackLocIterator(*this, 4031 In.getArgument().pack_begin()), 4032 PackLocIterator(*this, 4033 In.getArgument().pack_end()), 4034 Outputs, Uneval)) 4035 return true; 4036 4037 continue; 4038 } 4039 4040 if (In.getArgument().isPackExpansion()) { 4041 // We have a pack expansion, for which we will be substituting into 4042 // the pattern. 4043 SourceLocation Ellipsis; 4044 Optional<unsigned> OrigNumExpansions; 4045 TemplateArgumentLoc Pattern 4046 = getSema().getTemplateArgumentPackExpansionPattern( 4047 In, Ellipsis, OrigNumExpansions); 4048 4049 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4050 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4051 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4052 4053 // Determine whether the set of unexpanded parameter packs can and should 4054 // be expanded. 4055 bool Expand = true; 4056 bool RetainExpansion = false; 4057 Optional<unsigned> NumExpansions = OrigNumExpansions; 4058 if (getDerived().TryExpandParameterPacks(Ellipsis, 4059 Pattern.getSourceRange(), 4060 Unexpanded, 4061 Expand, 4062 RetainExpansion, 4063 NumExpansions)) 4064 return true; 4065 4066 if (!Expand) { 4067 // The transform has determined that we should perform a simple 4068 // transformation on the pack expansion, producing another pack 4069 // expansion. 4070 TemplateArgumentLoc OutPattern; 4071 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4072 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4073 return true; 4074 4075 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4076 NumExpansions); 4077 if (Out.getArgument().isNull()) 4078 return true; 4079 4080 Outputs.addArgument(Out); 4081 continue; 4082 } 4083 4084 // The transform has determined that we should perform an elementwise 4085 // expansion of the pattern. Do so. 4086 for (unsigned I = 0; I != *NumExpansions; ++I) { 4087 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4088 4089 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4090 return true; 4091 4092 if (Out.getArgument().containsUnexpandedParameterPack()) { 4093 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4094 OrigNumExpansions); 4095 if (Out.getArgument().isNull()) 4096 return true; 4097 } 4098 4099 Outputs.addArgument(Out); 4100 } 4101 4102 // If we're supposed to retain a pack expansion, do so by temporarily 4103 // forgetting the partially-substituted parameter pack. 4104 if (RetainExpansion) { 4105 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4106 4107 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4108 return true; 4109 4110 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4111 OrigNumExpansions); 4112 if (Out.getArgument().isNull()) 4113 return true; 4114 4115 Outputs.addArgument(Out); 4116 } 4117 4118 continue; 4119 } 4120 4121 // The simple case: 4122 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4123 return true; 4124 4125 Outputs.addArgument(Out); 4126 } 4127 4128 return false; 4129 4130 } 4131 4132 //===----------------------------------------------------------------------===// 4133 // Type transformation 4134 //===----------------------------------------------------------------------===// 4135 4136 template<typename Derived> 4137 QualType TreeTransform<Derived>::TransformType(QualType T) { 4138 if (getDerived().AlreadyTransformed(T)) 4139 return T; 4140 4141 // Temporary workaround. All of these transformations should 4142 // eventually turn into transformations on TypeLocs. 4143 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4144 getDerived().getBaseLocation()); 4145 4146 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4147 4148 if (!NewDI) 4149 return QualType(); 4150 4151 return NewDI->getType(); 4152 } 4153 4154 template<typename Derived> 4155 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4156 // Refine the base location to the type's location. 4157 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4158 getDerived().getBaseEntity()); 4159 if (getDerived().AlreadyTransformed(DI->getType())) 4160 return DI; 4161 4162 TypeLocBuilder TLB; 4163 4164 TypeLoc TL = DI->getTypeLoc(); 4165 TLB.reserve(TL.getFullDataSize()); 4166 4167 QualType Result = getDerived().TransformType(TLB, TL); 4168 if (Result.isNull()) 4169 return nullptr; 4170 4171 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4172 } 4173 4174 template<typename Derived> 4175 QualType 4176 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4177 switch (T.getTypeLocClass()) { 4178 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4179 #define TYPELOC(CLASS, PARENT) \ 4180 case TypeLoc::CLASS: \ 4181 return getDerived().Transform##CLASS##Type(TLB, \ 4182 T.castAs<CLASS##TypeLoc>()); 4183 #include "clang/AST/TypeLocNodes.def" 4184 } 4185 4186 llvm_unreachable("unhandled type loc!"); 4187 } 4188 4189 template<typename Derived> 4190 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4191 if (!isa<DependentNameType>(T)) 4192 return TransformType(T); 4193 4194 if (getDerived().AlreadyTransformed(T)) 4195 return T; 4196 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4197 getDerived().getBaseLocation()); 4198 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4199 return NewDI ? NewDI->getType() : QualType(); 4200 } 4201 4202 template<typename Derived> 4203 TypeSourceInfo * 4204 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4205 if (!isa<DependentNameType>(DI->getType())) 4206 return TransformType(DI); 4207 4208 // Refine the base location to the type's location. 4209 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4210 getDerived().getBaseEntity()); 4211 if (getDerived().AlreadyTransformed(DI->getType())) 4212 return DI; 4213 4214 TypeLocBuilder TLB; 4215 4216 TypeLoc TL = DI->getTypeLoc(); 4217 TLB.reserve(TL.getFullDataSize()); 4218 4219 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4220 if (QTL) 4221 TL = QTL.getUnqualifiedLoc(); 4222 4223 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4224 4225 QualType Result = getDerived().TransformDependentNameType( 4226 TLB, DNTL, /*DeducedTSTContext*/true); 4227 if (Result.isNull()) 4228 return nullptr; 4229 4230 if (QTL) { 4231 Result = getDerived().RebuildQualifiedType( 4232 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4233 TLB.TypeWasModifiedSafely(Result); 4234 } 4235 4236 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4237 } 4238 4239 template<typename Derived> 4240 QualType 4241 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4242 QualifiedTypeLoc T) { 4243 Qualifiers Quals = T.getType().getLocalQualifiers(); 4244 4245 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4246 if (Result.isNull()) 4247 return QualType(); 4248 4249 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4250 4251 // RebuildQualifiedType might have updated the type, but not in a way 4252 // that invalidates the TypeLoc. (There's no location information for 4253 // qualifiers.) 4254 TLB.TypeWasModifiedSafely(Result); 4255 4256 return Result; 4257 } 4258 4259 template<typename Derived> 4260 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4261 SourceLocation Loc, 4262 Qualifiers Quals) { 4263 // C++ [dcl.fct]p7: 4264 // [When] adding cv-qualifications on top of the function type [...] the 4265 // cv-qualifiers are ignored. 4266 if (T->isFunctionType()) 4267 return T; 4268 4269 // C++ [dcl.ref]p1: 4270 // when the cv-qualifiers are introduced through the use of a typedef-name 4271 // or decltype-specifier [...] the cv-qualifiers are ignored. 4272 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4273 // applied to a reference type. 4274 if (T->isReferenceType()) { 4275 // The only qualifier that applies to a reference type is restrict. 4276 if (!Quals.hasRestrict()) 4277 return T; 4278 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4279 } 4280 4281 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4282 // resulting type. 4283 if (Quals.hasObjCLifetime()) { 4284 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4285 Quals.removeObjCLifetime(); 4286 else if (T.getObjCLifetime()) { 4287 // Objective-C ARC: 4288 // A lifetime qualifier applied to a substituted template parameter 4289 // overrides the lifetime qualifier from the template argument. 4290 const AutoType *AutoTy; 4291 if (const SubstTemplateTypeParmType *SubstTypeParam 4292 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4293 QualType Replacement = SubstTypeParam->getReplacementType(); 4294 Qualifiers Qs = Replacement.getQualifiers(); 4295 Qs.removeObjCLifetime(); 4296 Replacement = SemaRef.Context.getQualifiedType( 4297 Replacement.getUnqualifiedType(), Qs); 4298 T = SemaRef.Context.getSubstTemplateTypeParmType( 4299 SubstTypeParam->getReplacedParameter(), Replacement); 4300 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4301 // 'auto' types behave the same way as template parameters. 4302 QualType Deduced = AutoTy->getDeducedType(); 4303 Qualifiers Qs = Deduced.getQualifiers(); 4304 Qs.removeObjCLifetime(); 4305 Deduced = 4306 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4307 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4308 AutoTy->isDependentType()); 4309 } else { 4310 // Otherwise, complain about the addition of a qualifier to an 4311 // already-qualified type. 4312 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4313 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4314 Quals.removeObjCLifetime(); 4315 } 4316 } 4317 } 4318 4319 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4320 } 4321 4322 template<typename Derived> 4323 TypeLoc 4324 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4325 QualType ObjectType, 4326 NamedDecl *UnqualLookup, 4327 CXXScopeSpec &SS) { 4328 if (getDerived().AlreadyTransformed(TL.getType())) 4329 return TL; 4330 4331 TypeSourceInfo *TSI = 4332 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4333 if (TSI) 4334 return TSI->getTypeLoc(); 4335 return TypeLoc(); 4336 } 4337 4338 template<typename Derived> 4339 TypeSourceInfo * 4340 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4341 QualType ObjectType, 4342 NamedDecl *UnqualLookup, 4343 CXXScopeSpec &SS) { 4344 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4345 return TSInfo; 4346 4347 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4348 UnqualLookup, SS); 4349 } 4350 4351 template <typename Derived> 4352 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4353 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4354 CXXScopeSpec &SS) { 4355 QualType T = TL.getType(); 4356 assert(!getDerived().AlreadyTransformed(T)); 4357 4358 TypeLocBuilder TLB; 4359 QualType Result; 4360 4361 if (isa<TemplateSpecializationType>(T)) { 4362 TemplateSpecializationTypeLoc SpecTL = 4363 TL.castAs<TemplateSpecializationTypeLoc>(); 4364 4365 TemplateName Template = getDerived().TransformTemplateName( 4366 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4367 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4368 if (Template.isNull()) 4369 return nullptr; 4370 4371 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4372 Template); 4373 } else if (isa<DependentTemplateSpecializationType>(T)) { 4374 DependentTemplateSpecializationTypeLoc SpecTL = 4375 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4376 4377 TemplateName Template 4378 = getDerived().RebuildTemplateName(SS, 4379 SpecTL.getTemplateKeywordLoc(), 4380 *SpecTL.getTypePtr()->getIdentifier(), 4381 SpecTL.getTemplateNameLoc(), 4382 ObjectType, UnqualLookup, 4383 /*AllowInjectedClassName*/true); 4384 if (Template.isNull()) 4385 return nullptr; 4386 4387 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4388 SpecTL, 4389 Template, 4390 SS); 4391 } else { 4392 // Nothing special needs to be done for these. 4393 Result = getDerived().TransformType(TLB, TL); 4394 } 4395 4396 if (Result.isNull()) 4397 return nullptr; 4398 4399 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4400 } 4401 4402 template <class TyLoc> static inline 4403 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4404 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4405 NewT.setNameLoc(T.getNameLoc()); 4406 return T.getType(); 4407 } 4408 4409 template<typename Derived> 4410 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4411 BuiltinTypeLoc T) { 4412 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4413 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4414 if (T.needsExtraLocalData()) 4415 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4416 return T.getType(); 4417 } 4418 4419 template<typename Derived> 4420 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4421 ComplexTypeLoc T) { 4422 // FIXME: recurse? 4423 return TransformTypeSpecType(TLB, T); 4424 } 4425 4426 template <typename Derived> 4427 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4428 AdjustedTypeLoc TL) { 4429 // Adjustments applied during transformation are handled elsewhere. 4430 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4431 } 4432 4433 template<typename Derived> 4434 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4435 DecayedTypeLoc TL) { 4436 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4437 if (OriginalType.isNull()) 4438 return QualType(); 4439 4440 QualType Result = TL.getType(); 4441 if (getDerived().AlwaysRebuild() || 4442 OriginalType != TL.getOriginalLoc().getType()) 4443 Result = SemaRef.Context.getDecayedType(OriginalType); 4444 TLB.push<DecayedTypeLoc>(Result); 4445 // Nothing to set for DecayedTypeLoc. 4446 return Result; 4447 } 4448 4449 template<typename Derived> 4450 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4451 PointerTypeLoc TL) { 4452 QualType PointeeType 4453 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4454 if (PointeeType.isNull()) 4455 return QualType(); 4456 4457 QualType Result = TL.getType(); 4458 if (PointeeType->getAs<ObjCObjectType>()) { 4459 // A dependent pointer type 'T *' has is being transformed such 4460 // that an Objective-C class type is being replaced for 'T'. The 4461 // resulting pointer type is an ObjCObjectPointerType, not a 4462 // PointerType. 4463 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4464 4465 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4466 NewT.setStarLoc(TL.getStarLoc()); 4467 return Result; 4468 } 4469 4470 if (getDerived().AlwaysRebuild() || 4471 PointeeType != TL.getPointeeLoc().getType()) { 4472 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4473 if (Result.isNull()) 4474 return QualType(); 4475 } 4476 4477 // Objective-C ARC can add lifetime qualifiers to the type that we're 4478 // pointing to. 4479 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4480 4481 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4482 NewT.setSigilLoc(TL.getSigilLoc()); 4483 return Result; 4484 } 4485 4486 template<typename Derived> 4487 QualType 4488 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4489 BlockPointerTypeLoc TL) { 4490 QualType PointeeType 4491 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4492 if (PointeeType.isNull()) 4493 return QualType(); 4494 4495 QualType Result = TL.getType(); 4496 if (getDerived().AlwaysRebuild() || 4497 PointeeType != TL.getPointeeLoc().getType()) { 4498 Result = getDerived().RebuildBlockPointerType(PointeeType, 4499 TL.getSigilLoc()); 4500 if (Result.isNull()) 4501 return QualType(); 4502 } 4503 4504 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4505 NewT.setSigilLoc(TL.getSigilLoc()); 4506 return Result; 4507 } 4508 4509 /// Transforms a reference type. Note that somewhat paradoxically we 4510 /// don't care whether the type itself is an l-value type or an r-value 4511 /// type; we only care if the type was *written* as an l-value type 4512 /// or an r-value type. 4513 template<typename Derived> 4514 QualType 4515 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4516 ReferenceTypeLoc TL) { 4517 const ReferenceType *T = TL.getTypePtr(); 4518 4519 // Note that this works with the pointee-as-written. 4520 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4521 if (PointeeType.isNull()) 4522 return QualType(); 4523 4524 QualType Result = TL.getType(); 4525 if (getDerived().AlwaysRebuild() || 4526 PointeeType != T->getPointeeTypeAsWritten()) { 4527 Result = getDerived().RebuildReferenceType(PointeeType, 4528 T->isSpelledAsLValue(), 4529 TL.getSigilLoc()); 4530 if (Result.isNull()) 4531 return QualType(); 4532 } 4533 4534 // Objective-C ARC can add lifetime qualifiers to the type that we're 4535 // referring to. 4536 TLB.TypeWasModifiedSafely( 4537 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4538 4539 // r-value references can be rebuilt as l-value references. 4540 ReferenceTypeLoc NewTL; 4541 if (isa<LValueReferenceType>(Result)) 4542 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4543 else 4544 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4545 NewTL.setSigilLoc(TL.getSigilLoc()); 4546 4547 return Result; 4548 } 4549 4550 template<typename Derived> 4551 QualType 4552 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4553 LValueReferenceTypeLoc TL) { 4554 return TransformReferenceType(TLB, TL); 4555 } 4556 4557 template<typename Derived> 4558 QualType 4559 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4560 RValueReferenceTypeLoc TL) { 4561 return TransformReferenceType(TLB, TL); 4562 } 4563 4564 template<typename Derived> 4565 QualType 4566 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4567 MemberPointerTypeLoc TL) { 4568 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4569 if (PointeeType.isNull()) 4570 return QualType(); 4571 4572 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4573 TypeSourceInfo *NewClsTInfo = nullptr; 4574 if (OldClsTInfo) { 4575 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4576 if (!NewClsTInfo) 4577 return QualType(); 4578 } 4579 4580 const MemberPointerType *T = TL.getTypePtr(); 4581 QualType OldClsType = QualType(T->getClass(), 0); 4582 QualType NewClsType; 4583 if (NewClsTInfo) 4584 NewClsType = NewClsTInfo->getType(); 4585 else { 4586 NewClsType = getDerived().TransformType(OldClsType); 4587 if (NewClsType.isNull()) 4588 return QualType(); 4589 } 4590 4591 QualType Result = TL.getType(); 4592 if (getDerived().AlwaysRebuild() || 4593 PointeeType != T->getPointeeType() || 4594 NewClsType != OldClsType) { 4595 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4596 TL.getStarLoc()); 4597 if (Result.isNull()) 4598 return QualType(); 4599 } 4600 4601 // If we had to adjust the pointee type when building a member pointer, make 4602 // sure to push TypeLoc info for it. 4603 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4604 if (MPT && PointeeType != MPT->getPointeeType()) { 4605 assert(isa<AdjustedType>(MPT->getPointeeType())); 4606 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4607 } 4608 4609 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4610 NewTL.setSigilLoc(TL.getSigilLoc()); 4611 NewTL.setClassTInfo(NewClsTInfo); 4612 4613 return Result; 4614 } 4615 4616 template<typename Derived> 4617 QualType 4618 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4619 ConstantArrayTypeLoc TL) { 4620 const ConstantArrayType *T = TL.getTypePtr(); 4621 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4622 if (ElementType.isNull()) 4623 return QualType(); 4624 4625 QualType Result = TL.getType(); 4626 if (getDerived().AlwaysRebuild() || 4627 ElementType != T->getElementType()) { 4628 Result = getDerived().RebuildConstantArrayType(ElementType, 4629 T->getSizeModifier(), 4630 T->getSize(), 4631 T->getIndexTypeCVRQualifiers(), 4632 TL.getBracketsRange()); 4633 if (Result.isNull()) 4634 return QualType(); 4635 } 4636 4637 // We might have either a ConstantArrayType or a VariableArrayType now: 4638 // a ConstantArrayType is allowed to have an element type which is a 4639 // VariableArrayType if the type is dependent. Fortunately, all array 4640 // types have the same location layout. 4641 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4642 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4643 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4644 4645 Expr *Size = TL.getSizeExpr(); 4646 if (Size) { 4647 EnterExpressionEvaluationContext Unevaluated( 4648 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4649 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4650 Size = SemaRef.ActOnConstantExpression(Size).get(); 4651 } 4652 NewTL.setSizeExpr(Size); 4653 4654 return Result; 4655 } 4656 4657 template<typename Derived> 4658 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4659 TypeLocBuilder &TLB, 4660 IncompleteArrayTypeLoc TL) { 4661 const IncompleteArrayType *T = TL.getTypePtr(); 4662 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4663 if (ElementType.isNull()) 4664 return QualType(); 4665 4666 QualType Result = TL.getType(); 4667 if (getDerived().AlwaysRebuild() || 4668 ElementType != T->getElementType()) { 4669 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4670 T->getSizeModifier(), 4671 T->getIndexTypeCVRQualifiers(), 4672 TL.getBracketsRange()); 4673 if (Result.isNull()) 4674 return QualType(); 4675 } 4676 4677 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4678 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4679 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4680 NewTL.setSizeExpr(nullptr); 4681 4682 return Result; 4683 } 4684 4685 template<typename Derived> 4686 QualType 4687 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4688 VariableArrayTypeLoc TL) { 4689 const VariableArrayType *T = TL.getTypePtr(); 4690 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4691 if (ElementType.isNull()) 4692 return QualType(); 4693 4694 ExprResult SizeResult; 4695 { 4696 EnterExpressionEvaluationContext Context( 4697 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4698 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4699 } 4700 if (SizeResult.isInvalid()) 4701 return QualType(); 4702 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4703 if (SizeResult.isInvalid()) 4704 return QualType(); 4705 4706 Expr *Size = SizeResult.get(); 4707 4708 QualType Result = TL.getType(); 4709 if (getDerived().AlwaysRebuild() || 4710 ElementType != T->getElementType() || 4711 Size != T->getSizeExpr()) { 4712 Result = getDerived().RebuildVariableArrayType(ElementType, 4713 T->getSizeModifier(), 4714 Size, 4715 T->getIndexTypeCVRQualifiers(), 4716 TL.getBracketsRange()); 4717 if (Result.isNull()) 4718 return QualType(); 4719 } 4720 4721 // We might have constant size array now, but fortunately it has the same 4722 // location layout. 4723 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4724 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4725 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4726 NewTL.setSizeExpr(Size); 4727 4728 return Result; 4729 } 4730 4731 template<typename Derived> 4732 QualType 4733 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4734 DependentSizedArrayTypeLoc TL) { 4735 const DependentSizedArrayType *T = TL.getTypePtr(); 4736 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4737 if (ElementType.isNull()) 4738 return QualType(); 4739 4740 // Array bounds are constant expressions. 4741 EnterExpressionEvaluationContext Unevaluated( 4742 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4743 4744 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4745 Expr *origSize = TL.getSizeExpr(); 4746 if (!origSize) origSize = T->getSizeExpr(); 4747 4748 ExprResult sizeResult 4749 = getDerived().TransformExpr(origSize); 4750 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4751 if (sizeResult.isInvalid()) 4752 return QualType(); 4753 4754 Expr *size = sizeResult.get(); 4755 4756 QualType Result = TL.getType(); 4757 if (getDerived().AlwaysRebuild() || 4758 ElementType != T->getElementType() || 4759 size != origSize) { 4760 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4761 T->getSizeModifier(), 4762 size, 4763 T->getIndexTypeCVRQualifiers(), 4764 TL.getBracketsRange()); 4765 if (Result.isNull()) 4766 return QualType(); 4767 } 4768 4769 // We might have any sort of array type now, but fortunately they 4770 // all have the same location layout. 4771 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4772 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4773 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4774 NewTL.setSizeExpr(size); 4775 4776 return Result; 4777 } 4778 4779 template <typename Derived> 4780 QualType TreeTransform<Derived>::TransformDependentVectorType( 4781 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4782 const DependentVectorType *T = TL.getTypePtr(); 4783 QualType ElementType = getDerived().TransformType(T->getElementType()); 4784 if (ElementType.isNull()) 4785 return QualType(); 4786 4787 EnterExpressionEvaluationContext Unevaluated( 4788 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4789 4790 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4791 Size = SemaRef.ActOnConstantExpression(Size); 4792 if (Size.isInvalid()) 4793 return QualType(); 4794 4795 QualType Result = TL.getType(); 4796 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 4797 Size.get() != T->getSizeExpr()) { 4798 Result = getDerived().RebuildDependentVectorType( 4799 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 4800 if (Result.isNull()) 4801 return QualType(); 4802 } 4803 4804 // Result might be dependent or not. 4805 if (isa<DependentVectorType>(Result)) { 4806 DependentVectorTypeLoc NewTL = 4807 TLB.push<DependentVectorTypeLoc>(Result); 4808 NewTL.setNameLoc(TL.getNameLoc()); 4809 } else { 4810 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4811 NewTL.setNameLoc(TL.getNameLoc()); 4812 } 4813 4814 return Result; 4815 } 4816 4817 template<typename Derived> 4818 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4819 TypeLocBuilder &TLB, 4820 DependentSizedExtVectorTypeLoc TL) { 4821 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4822 4823 // FIXME: ext vector locs should be nested 4824 QualType ElementType = getDerived().TransformType(T->getElementType()); 4825 if (ElementType.isNull()) 4826 return QualType(); 4827 4828 // Vector sizes are constant expressions. 4829 EnterExpressionEvaluationContext Unevaluated( 4830 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4831 4832 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4833 Size = SemaRef.ActOnConstantExpression(Size); 4834 if (Size.isInvalid()) 4835 return QualType(); 4836 4837 QualType Result = TL.getType(); 4838 if (getDerived().AlwaysRebuild() || 4839 ElementType != T->getElementType() || 4840 Size.get() != T->getSizeExpr()) { 4841 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4842 Size.get(), 4843 T->getAttributeLoc()); 4844 if (Result.isNull()) 4845 return QualType(); 4846 } 4847 4848 // Result might be dependent or not. 4849 if (isa<DependentSizedExtVectorType>(Result)) { 4850 DependentSizedExtVectorTypeLoc NewTL 4851 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4852 NewTL.setNameLoc(TL.getNameLoc()); 4853 } else { 4854 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4855 NewTL.setNameLoc(TL.getNameLoc()); 4856 } 4857 4858 return Result; 4859 } 4860 4861 template <typename Derived> 4862 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4863 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4864 const DependentAddressSpaceType *T = TL.getTypePtr(); 4865 4866 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4867 4868 if (pointeeType.isNull()) 4869 return QualType(); 4870 4871 // Address spaces are constant expressions. 4872 EnterExpressionEvaluationContext Unevaluated( 4873 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4874 4875 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4876 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4877 if (AddrSpace.isInvalid()) 4878 return QualType(); 4879 4880 QualType Result = TL.getType(); 4881 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4882 AddrSpace.get() != T->getAddrSpaceExpr()) { 4883 Result = getDerived().RebuildDependentAddressSpaceType( 4884 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4885 if (Result.isNull()) 4886 return QualType(); 4887 } 4888 4889 // Result might be dependent or not. 4890 if (isa<DependentAddressSpaceType>(Result)) { 4891 DependentAddressSpaceTypeLoc NewTL = 4892 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4893 4894 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4895 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4896 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4897 4898 } else { 4899 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4900 Result, getDerived().getBaseLocation()); 4901 TransformType(TLB, DI->getTypeLoc()); 4902 } 4903 4904 return Result; 4905 } 4906 4907 template <typename Derived> 4908 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4909 VectorTypeLoc TL) { 4910 const VectorType *T = TL.getTypePtr(); 4911 QualType ElementType = getDerived().TransformType(T->getElementType()); 4912 if (ElementType.isNull()) 4913 return QualType(); 4914 4915 QualType Result = TL.getType(); 4916 if (getDerived().AlwaysRebuild() || 4917 ElementType != T->getElementType()) { 4918 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4919 T->getVectorKind()); 4920 if (Result.isNull()) 4921 return QualType(); 4922 } 4923 4924 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4925 NewTL.setNameLoc(TL.getNameLoc()); 4926 4927 return Result; 4928 } 4929 4930 template<typename Derived> 4931 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4932 ExtVectorTypeLoc TL) { 4933 const VectorType *T = TL.getTypePtr(); 4934 QualType ElementType = getDerived().TransformType(T->getElementType()); 4935 if (ElementType.isNull()) 4936 return QualType(); 4937 4938 QualType Result = TL.getType(); 4939 if (getDerived().AlwaysRebuild() || 4940 ElementType != T->getElementType()) { 4941 Result = getDerived().RebuildExtVectorType(ElementType, 4942 T->getNumElements(), 4943 /*FIXME*/ SourceLocation()); 4944 if (Result.isNull()) 4945 return QualType(); 4946 } 4947 4948 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4949 NewTL.setNameLoc(TL.getNameLoc()); 4950 4951 return Result; 4952 } 4953 4954 template <typename Derived> 4955 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4956 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4957 bool ExpectParameterPack) { 4958 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4959 TypeSourceInfo *NewDI = nullptr; 4960 4961 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4962 // If we're substituting into a pack expansion type and we know the 4963 // length we want to expand to, just substitute for the pattern. 4964 TypeLoc OldTL = OldDI->getTypeLoc(); 4965 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4966 4967 TypeLocBuilder TLB; 4968 TypeLoc NewTL = OldDI->getTypeLoc(); 4969 TLB.reserve(NewTL.getFullDataSize()); 4970 4971 QualType Result = getDerived().TransformType(TLB, 4972 OldExpansionTL.getPatternLoc()); 4973 if (Result.isNull()) 4974 return nullptr; 4975 4976 Result = RebuildPackExpansionType(Result, 4977 OldExpansionTL.getPatternLoc().getSourceRange(), 4978 OldExpansionTL.getEllipsisLoc(), 4979 NumExpansions); 4980 if (Result.isNull()) 4981 return nullptr; 4982 4983 PackExpansionTypeLoc NewExpansionTL 4984 = TLB.push<PackExpansionTypeLoc>(Result); 4985 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4986 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4987 } else 4988 NewDI = getDerived().TransformType(OldDI); 4989 if (!NewDI) 4990 return nullptr; 4991 4992 if (NewDI == OldDI && indexAdjustment == 0) 4993 return OldParm; 4994 4995 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4996 OldParm->getDeclContext(), 4997 OldParm->getInnerLocStart(), 4998 OldParm->getLocation(), 4999 OldParm->getIdentifier(), 5000 NewDI->getType(), 5001 NewDI, 5002 OldParm->getStorageClass(), 5003 /* DefArg */ nullptr); 5004 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5005 OldParm->getFunctionScopeIndex() + indexAdjustment); 5006 return newParm; 5007 } 5008 5009 template <typename Derived> 5010 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5011 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5012 const QualType *ParamTypes, 5013 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5014 SmallVectorImpl<QualType> &OutParamTypes, 5015 SmallVectorImpl<ParmVarDecl *> *PVars, 5016 Sema::ExtParameterInfoBuilder &PInfos) { 5017 int indexAdjustment = 0; 5018 5019 unsigned NumParams = Params.size(); 5020 for (unsigned i = 0; i != NumParams; ++i) { 5021 if (ParmVarDecl *OldParm = Params[i]) { 5022 assert(OldParm->getFunctionScopeIndex() == i); 5023 5024 Optional<unsigned> NumExpansions; 5025 ParmVarDecl *NewParm = nullptr; 5026 if (OldParm->isParameterPack()) { 5027 // We have a function parameter pack that may need to be expanded. 5028 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5029 5030 // Find the parameter packs that could be expanded. 5031 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5032 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5033 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5034 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5035 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 5036 5037 // Determine whether we should expand the parameter packs. 5038 bool ShouldExpand = false; 5039 bool RetainExpansion = false; 5040 Optional<unsigned> OrigNumExpansions = 5041 ExpansionTL.getTypePtr()->getNumExpansions(); 5042 NumExpansions = OrigNumExpansions; 5043 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5044 Pattern.getSourceRange(), 5045 Unexpanded, 5046 ShouldExpand, 5047 RetainExpansion, 5048 NumExpansions)) { 5049 return true; 5050 } 5051 5052 if (ShouldExpand) { 5053 // Expand the function parameter pack into multiple, separate 5054 // parameters. 5055 getDerived().ExpandingFunctionParameterPack(OldParm); 5056 for (unsigned I = 0; I != *NumExpansions; ++I) { 5057 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5058 ParmVarDecl *NewParm 5059 = getDerived().TransformFunctionTypeParam(OldParm, 5060 indexAdjustment++, 5061 OrigNumExpansions, 5062 /*ExpectParameterPack=*/false); 5063 if (!NewParm) 5064 return true; 5065 5066 if (ParamInfos) 5067 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5068 OutParamTypes.push_back(NewParm->getType()); 5069 if (PVars) 5070 PVars->push_back(NewParm); 5071 } 5072 5073 // If we're supposed to retain a pack expansion, do so by temporarily 5074 // forgetting the partially-substituted parameter pack. 5075 if (RetainExpansion) { 5076 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5077 ParmVarDecl *NewParm 5078 = getDerived().TransformFunctionTypeParam(OldParm, 5079 indexAdjustment++, 5080 OrigNumExpansions, 5081 /*ExpectParameterPack=*/false); 5082 if (!NewParm) 5083 return true; 5084 5085 if (ParamInfos) 5086 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5087 OutParamTypes.push_back(NewParm->getType()); 5088 if (PVars) 5089 PVars->push_back(NewParm); 5090 } 5091 5092 // The next parameter should have the same adjustment as the 5093 // last thing we pushed, but we post-incremented indexAdjustment 5094 // on every push. Also, if we push nothing, the adjustment should 5095 // go down by one. 5096 indexAdjustment--; 5097 5098 // We're done with the pack expansion. 5099 continue; 5100 } 5101 5102 // We'll substitute the parameter now without expanding the pack 5103 // expansion. 5104 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5105 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5106 indexAdjustment, 5107 NumExpansions, 5108 /*ExpectParameterPack=*/true); 5109 } else { 5110 NewParm = getDerived().TransformFunctionTypeParam( 5111 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5112 } 5113 5114 if (!NewParm) 5115 return true; 5116 5117 if (ParamInfos) 5118 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5119 OutParamTypes.push_back(NewParm->getType()); 5120 if (PVars) 5121 PVars->push_back(NewParm); 5122 continue; 5123 } 5124 5125 // Deal with the possibility that we don't have a parameter 5126 // declaration for this parameter. 5127 QualType OldType = ParamTypes[i]; 5128 bool IsPackExpansion = false; 5129 Optional<unsigned> NumExpansions; 5130 QualType NewType; 5131 if (const PackExpansionType *Expansion 5132 = dyn_cast<PackExpansionType>(OldType)) { 5133 // We have a function parameter pack that may need to be expanded. 5134 QualType Pattern = Expansion->getPattern(); 5135 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5136 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5137 5138 // Determine whether we should expand the parameter packs. 5139 bool ShouldExpand = false; 5140 bool RetainExpansion = false; 5141 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5142 Unexpanded, 5143 ShouldExpand, 5144 RetainExpansion, 5145 NumExpansions)) { 5146 return true; 5147 } 5148 5149 if (ShouldExpand) { 5150 // Expand the function parameter pack into multiple, separate 5151 // parameters. 5152 for (unsigned I = 0; I != *NumExpansions; ++I) { 5153 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5154 QualType NewType = getDerived().TransformType(Pattern); 5155 if (NewType.isNull()) 5156 return true; 5157 5158 if (NewType->containsUnexpandedParameterPack()) { 5159 NewType = 5160 getSema().getASTContext().getPackExpansionType(NewType, None); 5161 5162 if (NewType.isNull()) 5163 return true; 5164 } 5165 5166 if (ParamInfos) 5167 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5168 OutParamTypes.push_back(NewType); 5169 if (PVars) 5170 PVars->push_back(nullptr); 5171 } 5172 5173 // We're done with the pack expansion. 5174 continue; 5175 } 5176 5177 // If we're supposed to retain a pack expansion, do so by temporarily 5178 // forgetting the partially-substituted parameter pack. 5179 if (RetainExpansion) { 5180 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5181 QualType NewType = getDerived().TransformType(Pattern); 5182 if (NewType.isNull()) 5183 return true; 5184 5185 if (ParamInfos) 5186 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5187 OutParamTypes.push_back(NewType); 5188 if (PVars) 5189 PVars->push_back(nullptr); 5190 } 5191 5192 // We'll substitute the parameter now without expanding the pack 5193 // expansion. 5194 OldType = Expansion->getPattern(); 5195 IsPackExpansion = true; 5196 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5197 NewType = getDerived().TransformType(OldType); 5198 } else { 5199 NewType = getDerived().TransformType(OldType); 5200 } 5201 5202 if (NewType.isNull()) 5203 return true; 5204 5205 if (IsPackExpansion) 5206 NewType = getSema().Context.getPackExpansionType(NewType, 5207 NumExpansions); 5208 5209 if (ParamInfos) 5210 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5211 OutParamTypes.push_back(NewType); 5212 if (PVars) 5213 PVars->push_back(nullptr); 5214 } 5215 5216 #ifndef NDEBUG 5217 if (PVars) { 5218 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5219 if (ParmVarDecl *parm = (*PVars)[i]) 5220 assert(parm->getFunctionScopeIndex() == i); 5221 } 5222 #endif 5223 5224 return false; 5225 } 5226 5227 template<typename Derived> 5228 QualType 5229 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5230 FunctionProtoTypeLoc TL) { 5231 SmallVector<QualType, 4> ExceptionStorage; 5232 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5233 return getDerived().TransformFunctionProtoType( 5234 TLB, TL, nullptr, 0, 5235 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5236 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5237 ExceptionStorage, Changed); 5238 }); 5239 } 5240 5241 template<typename Derived> template<typename Fn> 5242 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5243 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5244 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5245 5246 // Transform the parameters and return type. 5247 // 5248 // We are required to instantiate the params and return type in source order. 5249 // When the function has a trailing return type, we instantiate the 5250 // parameters before the return type, since the return type can then refer 5251 // to the parameters themselves (via decltype, sizeof, etc.). 5252 // 5253 SmallVector<QualType, 4> ParamTypes; 5254 SmallVector<ParmVarDecl*, 4> ParamDecls; 5255 Sema::ExtParameterInfoBuilder ExtParamInfos; 5256 const FunctionProtoType *T = TL.getTypePtr(); 5257 5258 QualType ResultType; 5259 5260 if (T->hasTrailingReturn()) { 5261 if (getDerived().TransformFunctionTypeParams( 5262 TL.getBeginLoc(), TL.getParams(), 5263 TL.getTypePtr()->param_type_begin(), 5264 T->getExtParameterInfosOrNull(), 5265 ParamTypes, &ParamDecls, ExtParamInfos)) 5266 return QualType(); 5267 5268 { 5269 // C++11 [expr.prim.general]p3: 5270 // If a declaration declares a member function or member function 5271 // template of a class X, the expression this is a prvalue of type 5272 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5273 // and the end of the function-definition, member-declarator, or 5274 // declarator. 5275 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5276 5277 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5278 if (ResultType.isNull()) 5279 return QualType(); 5280 } 5281 } 5282 else { 5283 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5284 if (ResultType.isNull()) 5285 return QualType(); 5286 5287 if (getDerived().TransformFunctionTypeParams( 5288 TL.getBeginLoc(), TL.getParams(), 5289 TL.getTypePtr()->param_type_begin(), 5290 T->getExtParameterInfosOrNull(), 5291 ParamTypes, &ParamDecls, ExtParamInfos)) 5292 return QualType(); 5293 } 5294 5295 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5296 5297 bool EPIChanged = false; 5298 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5299 return QualType(); 5300 5301 // Handle extended parameter information. 5302 if (auto NewExtParamInfos = 5303 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5304 if (!EPI.ExtParameterInfos || 5305 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5306 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5307 EPIChanged = true; 5308 } 5309 EPI.ExtParameterInfos = NewExtParamInfos; 5310 } else if (EPI.ExtParameterInfos) { 5311 EPIChanged = true; 5312 EPI.ExtParameterInfos = nullptr; 5313 } 5314 5315 QualType Result = TL.getType(); 5316 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5317 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5318 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5319 if (Result.isNull()) 5320 return QualType(); 5321 } 5322 5323 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5324 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5325 NewTL.setLParenLoc(TL.getLParenLoc()); 5326 NewTL.setRParenLoc(TL.getRParenLoc()); 5327 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5328 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5329 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5330 NewTL.setParam(i, ParamDecls[i]); 5331 5332 return Result; 5333 } 5334 5335 template<typename Derived> 5336 bool TreeTransform<Derived>::TransformExceptionSpec( 5337 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5338 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5339 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5340 5341 // Instantiate a dynamic noexcept expression, if any. 5342 if (isComputedNoexcept(ESI.Type)) { 5343 EnterExpressionEvaluationContext Unevaluated( 5344 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5345 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5346 if (NoexceptExpr.isInvalid()) 5347 return true; 5348 5349 ExceptionSpecificationType EST = ESI.Type; 5350 NoexceptExpr = 5351 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5352 if (NoexceptExpr.isInvalid()) 5353 return true; 5354 5355 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5356 Changed = true; 5357 ESI.NoexceptExpr = NoexceptExpr.get(); 5358 ESI.Type = EST; 5359 } 5360 5361 if (ESI.Type != EST_Dynamic) 5362 return false; 5363 5364 // Instantiate a dynamic exception specification's type. 5365 for (QualType T : ESI.Exceptions) { 5366 if (const PackExpansionType *PackExpansion = 5367 T->getAs<PackExpansionType>()) { 5368 Changed = true; 5369 5370 // We have a pack expansion. Instantiate it. 5371 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5372 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5373 Unexpanded); 5374 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5375 5376 // Determine whether the set of unexpanded parameter packs can and 5377 // should 5378 // be expanded. 5379 bool Expand = false; 5380 bool RetainExpansion = false; 5381 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5382 // FIXME: Track the location of the ellipsis (and track source location 5383 // information for the types in the exception specification in general). 5384 if (getDerived().TryExpandParameterPacks( 5385 Loc, SourceRange(), Unexpanded, Expand, 5386 RetainExpansion, NumExpansions)) 5387 return true; 5388 5389 if (!Expand) { 5390 // We can't expand this pack expansion into separate arguments yet; 5391 // just substitute into the pattern and create a new pack expansion 5392 // type. 5393 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5394 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5395 if (U.isNull()) 5396 return true; 5397 5398 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5399 Exceptions.push_back(U); 5400 continue; 5401 } 5402 5403 // Substitute into the pack expansion pattern for each slice of the 5404 // pack. 5405 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5406 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5407 5408 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5409 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5410 return true; 5411 5412 Exceptions.push_back(U); 5413 } 5414 } else { 5415 QualType U = getDerived().TransformType(T); 5416 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5417 return true; 5418 if (T != U) 5419 Changed = true; 5420 5421 Exceptions.push_back(U); 5422 } 5423 } 5424 5425 ESI.Exceptions = Exceptions; 5426 if (ESI.Exceptions.empty()) 5427 ESI.Type = EST_DynamicNone; 5428 return false; 5429 } 5430 5431 template<typename Derived> 5432 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5433 TypeLocBuilder &TLB, 5434 FunctionNoProtoTypeLoc TL) { 5435 const FunctionNoProtoType *T = TL.getTypePtr(); 5436 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5437 if (ResultType.isNull()) 5438 return QualType(); 5439 5440 QualType Result = TL.getType(); 5441 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5442 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5443 5444 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5445 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5446 NewTL.setLParenLoc(TL.getLParenLoc()); 5447 NewTL.setRParenLoc(TL.getRParenLoc()); 5448 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5449 5450 return Result; 5451 } 5452 5453 template<typename Derived> QualType 5454 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5455 UnresolvedUsingTypeLoc TL) { 5456 const UnresolvedUsingType *T = TL.getTypePtr(); 5457 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5458 if (!D) 5459 return QualType(); 5460 5461 QualType Result = TL.getType(); 5462 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5463 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5464 if (Result.isNull()) 5465 return QualType(); 5466 } 5467 5468 // We might get an arbitrary type spec type back. We should at 5469 // least always get a type spec type, though. 5470 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5471 NewTL.setNameLoc(TL.getNameLoc()); 5472 5473 return Result; 5474 } 5475 5476 template<typename Derived> 5477 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5478 TypedefTypeLoc TL) { 5479 const TypedefType *T = TL.getTypePtr(); 5480 TypedefNameDecl *Typedef 5481 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5482 T->getDecl())); 5483 if (!Typedef) 5484 return QualType(); 5485 5486 QualType Result = TL.getType(); 5487 if (getDerived().AlwaysRebuild() || 5488 Typedef != T->getDecl()) { 5489 Result = getDerived().RebuildTypedefType(Typedef); 5490 if (Result.isNull()) 5491 return QualType(); 5492 } 5493 5494 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5495 NewTL.setNameLoc(TL.getNameLoc()); 5496 5497 return Result; 5498 } 5499 5500 template<typename Derived> 5501 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5502 TypeOfExprTypeLoc TL) { 5503 // typeof expressions are not potentially evaluated contexts 5504 EnterExpressionEvaluationContext Unevaluated( 5505 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5506 Sema::ReuseLambdaContextDecl); 5507 5508 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5509 if (E.isInvalid()) 5510 return QualType(); 5511 5512 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5513 if (E.isInvalid()) 5514 return QualType(); 5515 5516 QualType Result = TL.getType(); 5517 if (getDerived().AlwaysRebuild() || 5518 E.get() != TL.getUnderlyingExpr()) { 5519 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5520 if (Result.isNull()) 5521 return QualType(); 5522 } 5523 else E.get(); 5524 5525 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5526 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5527 NewTL.setLParenLoc(TL.getLParenLoc()); 5528 NewTL.setRParenLoc(TL.getRParenLoc()); 5529 5530 return Result; 5531 } 5532 5533 template<typename Derived> 5534 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5535 TypeOfTypeLoc TL) { 5536 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5537 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5538 if (!New_Under_TI) 5539 return QualType(); 5540 5541 QualType Result = TL.getType(); 5542 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5543 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5544 if (Result.isNull()) 5545 return QualType(); 5546 } 5547 5548 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5549 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5550 NewTL.setLParenLoc(TL.getLParenLoc()); 5551 NewTL.setRParenLoc(TL.getRParenLoc()); 5552 NewTL.setUnderlyingTInfo(New_Under_TI); 5553 5554 return Result; 5555 } 5556 5557 template<typename Derived> 5558 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5559 DecltypeTypeLoc TL) { 5560 const DecltypeType *T = TL.getTypePtr(); 5561 5562 // decltype expressions are not potentially evaluated contexts 5563 EnterExpressionEvaluationContext Unevaluated( 5564 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5565 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5566 5567 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5568 if (E.isInvalid()) 5569 return QualType(); 5570 5571 E = getSema().ActOnDecltypeExpression(E.get()); 5572 if (E.isInvalid()) 5573 return QualType(); 5574 5575 QualType Result = TL.getType(); 5576 if (getDerived().AlwaysRebuild() || 5577 E.get() != T->getUnderlyingExpr()) { 5578 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5579 if (Result.isNull()) 5580 return QualType(); 5581 } 5582 else E.get(); 5583 5584 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5585 NewTL.setNameLoc(TL.getNameLoc()); 5586 5587 return Result; 5588 } 5589 5590 template<typename Derived> 5591 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5592 TypeLocBuilder &TLB, 5593 UnaryTransformTypeLoc TL) { 5594 QualType Result = TL.getType(); 5595 if (Result->isDependentType()) { 5596 const UnaryTransformType *T = TL.getTypePtr(); 5597 QualType NewBase = 5598 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5599 Result = getDerived().RebuildUnaryTransformType(NewBase, 5600 T->getUTTKind(), 5601 TL.getKWLoc()); 5602 if (Result.isNull()) 5603 return QualType(); 5604 } 5605 5606 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5607 NewTL.setKWLoc(TL.getKWLoc()); 5608 NewTL.setParensRange(TL.getParensRange()); 5609 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5610 return Result; 5611 } 5612 5613 template<typename Derived> 5614 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5615 AutoTypeLoc TL) { 5616 const AutoType *T = TL.getTypePtr(); 5617 QualType OldDeduced = T->getDeducedType(); 5618 QualType NewDeduced; 5619 if (!OldDeduced.isNull()) { 5620 NewDeduced = getDerived().TransformType(OldDeduced); 5621 if (NewDeduced.isNull()) 5622 return QualType(); 5623 } 5624 5625 QualType Result = TL.getType(); 5626 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5627 T->isDependentType()) { 5628 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5629 if (Result.isNull()) 5630 return QualType(); 5631 } 5632 5633 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5634 NewTL.setNameLoc(TL.getNameLoc()); 5635 5636 return Result; 5637 } 5638 5639 template<typename Derived> 5640 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5641 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5642 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5643 5644 CXXScopeSpec SS; 5645 TemplateName TemplateName = getDerived().TransformTemplateName( 5646 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5647 if (TemplateName.isNull()) 5648 return QualType(); 5649 5650 QualType OldDeduced = T->getDeducedType(); 5651 QualType NewDeduced; 5652 if (!OldDeduced.isNull()) { 5653 NewDeduced = getDerived().TransformType(OldDeduced); 5654 if (NewDeduced.isNull()) 5655 return QualType(); 5656 } 5657 5658 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5659 TemplateName, NewDeduced); 5660 if (Result.isNull()) 5661 return QualType(); 5662 5663 DeducedTemplateSpecializationTypeLoc NewTL = 5664 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5665 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5666 5667 return Result; 5668 } 5669 5670 template<typename Derived> 5671 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5672 RecordTypeLoc TL) { 5673 const RecordType *T = TL.getTypePtr(); 5674 RecordDecl *Record 5675 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5676 T->getDecl())); 5677 if (!Record) 5678 return QualType(); 5679 5680 QualType Result = TL.getType(); 5681 if (getDerived().AlwaysRebuild() || 5682 Record != T->getDecl()) { 5683 Result = getDerived().RebuildRecordType(Record); 5684 if (Result.isNull()) 5685 return QualType(); 5686 } 5687 5688 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5689 NewTL.setNameLoc(TL.getNameLoc()); 5690 5691 return Result; 5692 } 5693 5694 template<typename Derived> 5695 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5696 EnumTypeLoc TL) { 5697 const EnumType *T = TL.getTypePtr(); 5698 EnumDecl *Enum 5699 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5700 T->getDecl())); 5701 if (!Enum) 5702 return QualType(); 5703 5704 QualType Result = TL.getType(); 5705 if (getDerived().AlwaysRebuild() || 5706 Enum != T->getDecl()) { 5707 Result = getDerived().RebuildEnumType(Enum); 5708 if (Result.isNull()) 5709 return QualType(); 5710 } 5711 5712 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5713 NewTL.setNameLoc(TL.getNameLoc()); 5714 5715 return Result; 5716 } 5717 5718 template<typename Derived> 5719 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5720 TypeLocBuilder &TLB, 5721 InjectedClassNameTypeLoc TL) { 5722 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5723 TL.getTypePtr()->getDecl()); 5724 if (!D) return QualType(); 5725 5726 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5727 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5728 return T; 5729 } 5730 5731 template<typename Derived> 5732 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5733 TypeLocBuilder &TLB, 5734 TemplateTypeParmTypeLoc TL) { 5735 return TransformTypeSpecType(TLB, TL); 5736 } 5737 5738 template<typename Derived> 5739 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5740 TypeLocBuilder &TLB, 5741 SubstTemplateTypeParmTypeLoc TL) { 5742 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5743 5744 // Substitute into the replacement type, which itself might involve something 5745 // that needs to be transformed. This only tends to occur with default 5746 // template arguments of template template parameters. 5747 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5748 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5749 if (Replacement.isNull()) 5750 return QualType(); 5751 5752 // Always canonicalize the replacement type. 5753 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5754 QualType Result 5755 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5756 Replacement); 5757 5758 // Propagate type-source information. 5759 SubstTemplateTypeParmTypeLoc NewTL 5760 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5761 NewTL.setNameLoc(TL.getNameLoc()); 5762 return Result; 5763 5764 } 5765 5766 template<typename Derived> 5767 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5768 TypeLocBuilder &TLB, 5769 SubstTemplateTypeParmPackTypeLoc TL) { 5770 return TransformTypeSpecType(TLB, TL); 5771 } 5772 5773 template<typename Derived> 5774 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5775 TypeLocBuilder &TLB, 5776 TemplateSpecializationTypeLoc TL) { 5777 const TemplateSpecializationType *T = TL.getTypePtr(); 5778 5779 // The nested-name-specifier never matters in a TemplateSpecializationType, 5780 // because we can't have a dependent nested-name-specifier anyway. 5781 CXXScopeSpec SS; 5782 TemplateName Template 5783 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5784 TL.getTemplateNameLoc()); 5785 if (Template.isNull()) 5786 return QualType(); 5787 5788 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5789 } 5790 5791 template<typename Derived> 5792 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5793 AtomicTypeLoc TL) { 5794 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5795 if (ValueType.isNull()) 5796 return QualType(); 5797 5798 QualType Result = TL.getType(); 5799 if (getDerived().AlwaysRebuild() || 5800 ValueType != TL.getValueLoc().getType()) { 5801 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5802 if (Result.isNull()) 5803 return QualType(); 5804 } 5805 5806 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5807 NewTL.setKWLoc(TL.getKWLoc()); 5808 NewTL.setLParenLoc(TL.getLParenLoc()); 5809 NewTL.setRParenLoc(TL.getRParenLoc()); 5810 5811 return Result; 5812 } 5813 5814 template <typename Derived> 5815 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5816 PipeTypeLoc TL) { 5817 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5818 if (ValueType.isNull()) 5819 return QualType(); 5820 5821 QualType Result = TL.getType(); 5822 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5823 const PipeType *PT = Result->getAs<PipeType>(); 5824 bool isReadPipe = PT->isReadOnly(); 5825 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5826 if (Result.isNull()) 5827 return QualType(); 5828 } 5829 5830 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5831 NewTL.setKWLoc(TL.getKWLoc()); 5832 5833 return Result; 5834 } 5835 5836 /// Simple iterator that traverses the template arguments in a 5837 /// container that provides a \c getArgLoc() member function. 5838 /// 5839 /// This iterator is intended to be used with the iterator form of 5840 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5841 template<typename ArgLocContainer> 5842 class TemplateArgumentLocContainerIterator { 5843 ArgLocContainer *Container; 5844 unsigned Index; 5845 5846 public: 5847 typedef TemplateArgumentLoc value_type; 5848 typedef TemplateArgumentLoc reference; 5849 typedef int difference_type; 5850 typedef std::input_iterator_tag iterator_category; 5851 5852 class pointer { 5853 TemplateArgumentLoc Arg; 5854 5855 public: 5856 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5857 5858 const TemplateArgumentLoc *operator->() const { 5859 return &Arg; 5860 } 5861 }; 5862 5863 5864 TemplateArgumentLocContainerIterator() {} 5865 5866 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5867 unsigned Index) 5868 : Container(&Container), Index(Index) { } 5869 5870 TemplateArgumentLocContainerIterator &operator++() { 5871 ++Index; 5872 return *this; 5873 } 5874 5875 TemplateArgumentLocContainerIterator operator++(int) { 5876 TemplateArgumentLocContainerIterator Old(*this); 5877 ++(*this); 5878 return Old; 5879 } 5880 5881 TemplateArgumentLoc operator*() const { 5882 return Container->getArgLoc(Index); 5883 } 5884 5885 pointer operator->() const { 5886 return pointer(Container->getArgLoc(Index)); 5887 } 5888 5889 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5890 const TemplateArgumentLocContainerIterator &Y) { 5891 return X.Container == Y.Container && X.Index == Y.Index; 5892 } 5893 5894 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5895 const TemplateArgumentLocContainerIterator &Y) { 5896 return !(X == Y); 5897 } 5898 }; 5899 5900 5901 template <typename Derived> 5902 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5903 TypeLocBuilder &TLB, 5904 TemplateSpecializationTypeLoc TL, 5905 TemplateName Template) { 5906 TemplateArgumentListInfo NewTemplateArgs; 5907 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5908 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5909 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5910 ArgIterator; 5911 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5912 ArgIterator(TL, TL.getNumArgs()), 5913 NewTemplateArgs)) 5914 return QualType(); 5915 5916 // FIXME: maybe don't rebuild if all the template arguments are the same. 5917 5918 QualType Result = 5919 getDerived().RebuildTemplateSpecializationType(Template, 5920 TL.getTemplateNameLoc(), 5921 NewTemplateArgs); 5922 5923 if (!Result.isNull()) { 5924 // Specializations of template template parameters are represented as 5925 // TemplateSpecializationTypes, and substitution of type alias templates 5926 // within a dependent context can transform them into 5927 // DependentTemplateSpecializationTypes. 5928 if (isa<DependentTemplateSpecializationType>(Result)) { 5929 DependentTemplateSpecializationTypeLoc NewTL 5930 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5931 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5932 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5933 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5934 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5935 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5936 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5937 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5938 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5939 return Result; 5940 } 5941 5942 TemplateSpecializationTypeLoc NewTL 5943 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5944 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5945 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5946 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5947 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5948 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5949 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5950 } 5951 5952 return Result; 5953 } 5954 5955 template <typename Derived> 5956 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5957 TypeLocBuilder &TLB, 5958 DependentTemplateSpecializationTypeLoc TL, 5959 TemplateName Template, 5960 CXXScopeSpec &SS) { 5961 TemplateArgumentListInfo NewTemplateArgs; 5962 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5963 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5964 typedef TemplateArgumentLocContainerIterator< 5965 DependentTemplateSpecializationTypeLoc> ArgIterator; 5966 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5967 ArgIterator(TL, TL.getNumArgs()), 5968 NewTemplateArgs)) 5969 return QualType(); 5970 5971 // FIXME: maybe don't rebuild if all the template arguments are the same. 5972 5973 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5974 QualType Result 5975 = getSema().Context.getDependentTemplateSpecializationType( 5976 TL.getTypePtr()->getKeyword(), 5977 DTN->getQualifier(), 5978 DTN->getIdentifier(), 5979 NewTemplateArgs); 5980 5981 DependentTemplateSpecializationTypeLoc NewTL 5982 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5983 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5984 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5985 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5986 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5987 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5988 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5989 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5990 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5991 return Result; 5992 } 5993 5994 QualType Result 5995 = getDerived().RebuildTemplateSpecializationType(Template, 5996 TL.getTemplateNameLoc(), 5997 NewTemplateArgs); 5998 5999 if (!Result.isNull()) { 6000 /// FIXME: Wrap this in an elaborated-type-specifier? 6001 TemplateSpecializationTypeLoc NewTL 6002 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6003 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6004 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6005 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6006 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6007 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6008 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6009 } 6010 6011 return Result; 6012 } 6013 6014 template<typename Derived> 6015 QualType 6016 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6017 ElaboratedTypeLoc TL) { 6018 const ElaboratedType *T = TL.getTypePtr(); 6019 6020 NestedNameSpecifierLoc QualifierLoc; 6021 // NOTE: the qualifier in an ElaboratedType is optional. 6022 if (TL.getQualifierLoc()) { 6023 QualifierLoc 6024 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6025 if (!QualifierLoc) 6026 return QualType(); 6027 } 6028 6029 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6030 if (NamedT.isNull()) 6031 return QualType(); 6032 6033 // C++0x [dcl.type.elab]p2: 6034 // If the identifier resolves to a typedef-name or the simple-template-id 6035 // resolves to an alias template specialization, the 6036 // elaborated-type-specifier is ill-formed. 6037 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6038 if (const TemplateSpecializationType *TST = 6039 NamedT->getAs<TemplateSpecializationType>()) { 6040 TemplateName Template = TST->getTemplateName(); 6041 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6042 Template.getAsTemplateDecl())) { 6043 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6044 diag::err_tag_reference_non_tag) 6045 << TAT << Sema::NTK_TypeAliasTemplate 6046 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6047 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6048 } 6049 } 6050 } 6051 6052 QualType Result = TL.getType(); 6053 if (getDerived().AlwaysRebuild() || 6054 QualifierLoc != TL.getQualifierLoc() || 6055 NamedT != T->getNamedType()) { 6056 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6057 T->getKeyword(), 6058 QualifierLoc, NamedT); 6059 if (Result.isNull()) 6060 return QualType(); 6061 } 6062 6063 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6064 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6065 NewTL.setQualifierLoc(QualifierLoc); 6066 return Result; 6067 } 6068 6069 template<typename Derived> 6070 QualType TreeTransform<Derived>::TransformAttributedType( 6071 TypeLocBuilder &TLB, 6072 AttributedTypeLoc TL) { 6073 const AttributedType *oldType = TL.getTypePtr(); 6074 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6075 if (modifiedType.isNull()) 6076 return QualType(); 6077 6078 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6079 const Attr *oldAttr = TL.getAttr(); 6080 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6081 if (oldAttr && !newAttr) 6082 return QualType(); 6083 6084 QualType result = TL.getType(); 6085 6086 // FIXME: dependent operand expressions? 6087 if (getDerived().AlwaysRebuild() || 6088 modifiedType != oldType->getModifiedType()) { 6089 // TODO: this is really lame; we should really be rebuilding the 6090 // equivalent type from first principles. 6091 QualType equivalentType 6092 = getDerived().TransformType(oldType->getEquivalentType()); 6093 if (equivalentType.isNull()) 6094 return QualType(); 6095 6096 // Check whether we can add nullability; it is only represented as 6097 // type sugar, and therefore cannot be diagnosed in any other way. 6098 if (auto nullability = oldType->getImmediateNullability()) { 6099 if (!modifiedType->canHaveNullability()) { 6100 SemaRef.Diag(TL.getAttr()->getLocation(), 6101 diag::err_nullability_nonpointer) 6102 << DiagNullabilityKind(*nullability, false) << modifiedType; 6103 return QualType(); 6104 } 6105 } 6106 6107 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6108 modifiedType, 6109 equivalentType); 6110 } 6111 6112 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6113 newTL.setAttr(newAttr); 6114 return result; 6115 } 6116 6117 template<typename Derived> 6118 QualType 6119 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6120 ParenTypeLoc TL) { 6121 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6122 if (Inner.isNull()) 6123 return QualType(); 6124 6125 QualType Result = TL.getType(); 6126 if (getDerived().AlwaysRebuild() || 6127 Inner != TL.getInnerLoc().getType()) { 6128 Result = getDerived().RebuildParenType(Inner); 6129 if (Result.isNull()) 6130 return QualType(); 6131 } 6132 6133 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6134 NewTL.setLParenLoc(TL.getLParenLoc()); 6135 NewTL.setRParenLoc(TL.getRParenLoc()); 6136 return Result; 6137 } 6138 6139 template<typename Derived> 6140 QualType TreeTransform<Derived>::TransformDependentNameType( 6141 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6142 return TransformDependentNameType(TLB, TL, false); 6143 } 6144 6145 template<typename Derived> 6146 QualType TreeTransform<Derived>::TransformDependentNameType( 6147 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6148 const DependentNameType *T = TL.getTypePtr(); 6149 6150 NestedNameSpecifierLoc QualifierLoc 6151 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6152 if (!QualifierLoc) 6153 return QualType(); 6154 6155 QualType Result 6156 = getDerived().RebuildDependentNameType(T->getKeyword(), 6157 TL.getElaboratedKeywordLoc(), 6158 QualifierLoc, 6159 T->getIdentifier(), 6160 TL.getNameLoc(), 6161 DeducedTSTContext); 6162 if (Result.isNull()) 6163 return QualType(); 6164 6165 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6166 QualType NamedT = ElabT->getNamedType(); 6167 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6168 6169 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6170 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6171 NewTL.setQualifierLoc(QualifierLoc); 6172 } else { 6173 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6174 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6175 NewTL.setQualifierLoc(QualifierLoc); 6176 NewTL.setNameLoc(TL.getNameLoc()); 6177 } 6178 return Result; 6179 } 6180 6181 template<typename Derived> 6182 QualType TreeTransform<Derived>:: 6183 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6184 DependentTemplateSpecializationTypeLoc TL) { 6185 NestedNameSpecifierLoc QualifierLoc; 6186 if (TL.getQualifierLoc()) { 6187 QualifierLoc 6188 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6189 if (!QualifierLoc) 6190 return QualType(); 6191 } 6192 6193 return getDerived() 6194 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6195 } 6196 6197 template<typename Derived> 6198 QualType TreeTransform<Derived>:: 6199 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6200 DependentTemplateSpecializationTypeLoc TL, 6201 NestedNameSpecifierLoc QualifierLoc) { 6202 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6203 6204 TemplateArgumentListInfo NewTemplateArgs; 6205 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6206 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6207 6208 typedef TemplateArgumentLocContainerIterator< 6209 DependentTemplateSpecializationTypeLoc> ArgIterator; 6210 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6211 ArgIterator(TL, TL.getNumArgs()), 6212 NewTemplateArgs)) 6213 return QualType(); 6214 6215 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6216 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6217 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6218 /*AllowInjectedClassName*/ false); 6219 if (Result.isNull()) 6220 return QualType(); 6221 6222 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6223 QualType NamedT = ElabT->getNamedType(); 6224 6225 // Copy information relevant to the template specialization. 6226 TemplateSpecializationTypeLoc NamedTL 6227 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6228 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6229 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6230 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6231 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6232 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6233 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6234 6235 // Copy information relevant to the elaborated type. 6236 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6237 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6238 NewTL.setQualifierLoc(QualifierLoc); 6239 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6240 DependentTemplateSpecializationTypeLoc SpecTL 6241 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6242 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6243 SpecTL.setQualifierLoc(QualifierLoc); 6244 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6245 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6246 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6247 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6248 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6249 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6250 } else { 6251 TemplateSpecializationTypeLoc SpecTL 6252 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6253 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6254 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6255 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6256 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6257 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6258 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6259 } 6260 return Result; 6261 } 6262 6263 template<typename Derived> 6264 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6265 PackExpansionTypeLoc TL) { 6266 QualType Pattern 6267 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6268 if (Pattern.isNull()) 6269 return QualType(); 6270 6271 QualType Result = TL.getType(); 6272 if (getDerived().AlwaysRebuild() || 6273 Pattern != TL.getPatternLoc().getType()) { 6274 Result = getDerived().RebuildPackExpansionType(Pattern, 6275 TL.getPatternLoc().getSourceRange(), 6276 TL.getEllipsisLoc(), 6277 TL.getTypePtr()->getNumExpansions()); 6278 if (Result.isNull()) 6279 return QualType(); 6280 } 6281 6282 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6283 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6284 return Result; 6285 } 6286 6287 template<typename Derived> 6288 QualType 6289 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6290 ObjCInterfaceTypeLoc TL) { 6291 // ObjCInterfaceType is never dependent. 6292 TLB.pushFullCopy(TL); 6293 return TL.getType(); 6294 } 6295 6296 template<typename Derived> 6297 QualType 6298 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6299 ObjCTypeParamTypeLoc TL) { 6300 const ObjCTypeParamType *T = TL.getTypePtr(); 6301 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6302 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6303 if (!OTP) 6304 return QualType(); 6305 6306 QualType Result = TL.getType(); 6307 if (getDerived().AlwaysRebuild() || 6308 OTP != T->getDecl()) { 6309 Result = getDerived().RebuildObjCTypeParamType(OTP, 6310 TL.getProtocolLAngleLoc(), 6311 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6312 TL.getNumProtocols()), 6313 TL.getProtocolLocs(), 6314 TL.getProtocolRAngleLoc()); 6315 if (Result.isNull()) 6316 return QualType(); 6317 } 6318 6319 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6320 if (TL.getNumProtocols()) { 6321 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6322 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6323 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6324 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6325 } 6326 return Result; 6327 } 6328 6329 template<typename Derived> 6330 QualType 6331 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6332 ObjCObjectTypeLoc TL) { 6333 // Transform base type. 6334 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6335 if (BaseType.isNull()) 6336 return QualType(); 6337 6338 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6339 6340 // Transform type arguments. 6341 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6342 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6343 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6344 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6345 QualType TypeArg = TypeArgInfo->getType(); 6346 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6347 AnyChanged = true; 6348 6349 // We have a pack expansion. Instantiate it. 6350 const auto *PackExpansion = PackExpansionLoc.getType() 6351 ->castAs<PackExpansionType>(); 6352 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6353 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6354 Unexpanded); 6355 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6356 6357 // Determine whether the set of unexpanded parameter packs can 6358 // and should be expanded. 6359 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6360 bool Expand = false; 6361 bool RetainExpansion = false; 6362 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6363 if (getDerived().TryExpandParameterPacks( 6364 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6365 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6366 return QualType(); 6367 6368 if (!Expand) { 6369 // We can't expand this pack expansion into separate arguments yet; 6370 // just substitute into the pattern and create a new pack expansion 6371 // type. 6372 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6373 6374 TypeLocBuilder TypeArgBuilder; 6375 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6376 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6377 PatternLoc); 6378 if (NewPatternType.isNull()) 6379 return QualType(); 6380 6381 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6382 NewPatternType, NumExpansions); 6383 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6384 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6385 NewTypeArgInfos.push_back( 6386 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6387 continue; 6388 } 6389 6390 // Substitute into the pack expansion pattern for each slice of the 6391 // pack. 6392 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6393 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6394 6395 TypeLocBuilder TypeArgBuilder; 6396 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6397 6398 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6399 PatternLoc); 6400 if (NewTypeArg.isNull()) 6401 return QualType(); 6402 6403 NewTypeArgInfos.push_back( 6404 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6405 } 6406 6407 continue; 6408 } 6409 6410 TypeLocBuilder TypeArgBuilder; 6411 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6412 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6413 if (NewTypeArg.isNull()) 6414 return QualType(); 6415 6416 // If nothing changed, just keep the old TypeSourceInfo. 6417 if (NewTypeArg == TypeArg) { 6418 NewTypeArgInfos.push_back(TypeArgInfo); 6419 continue; 6420 } 6421 6422 NewTypeArgInfos.push_back( 6423 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6424 AnyChanged = true; 6425 } 6426 6427 QualType Result = TL.getType(); 6428 if (getDerived().AlwaysRebuild() || AnyChanged) { 6429 // Rebuild the type. 6430 Result = getDerived().RebuildObjCObjectType( 6431 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6432 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6433 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6434 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6435 6436 if (Result.isNull()) 6437 return QualType(); 6438 } 6439 6440 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6441 NewT.setHasBaseTypeAsWritten(true); 6442 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6443 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6444 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6445 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6446 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6447 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6448 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6449 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6450 return Result; 6451 } 6452 6453 template<typename Derived> 6454 QualType 6455 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6456 ObjCObjectPointerTypeLoc TL) { 6457 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6458 if (PointeeType.isNull()) 6459 return QualType(); 6460 6461 QualType Result = TL.getType(); 6462 if (getDerived().AlwaysRebuild() || 6463 PointeeType != TL.getPointeeLoc().getType()) { 6464 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6465 TL.getStarLoc()); 6466 if (Result.isNull()) 6467 return QualType(); 6468 } 6469 6470 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6471 NewT.setStarLoc(TL.getStarLoc()); 6472 return Result; 6473 } 6474 6475 //===----------------------------------------------------------------------===// 6476 // Statement transformation 6477 //===----------------------------------------------------------------------===// 6478 template<typename Derived> 6479 StmtResult 6480 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6481 return S; 6482 } 6483 6484 template<typename Derived> 6485 StmtResult 6486 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6487 return getDerived().TransformCompoundStmt(S, false); 6488 } 6489 6490 template<typename Derived> 6491 StmtResult 6492 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6493 bool IsStmtExpr) { 6494 Sema::CompoundScopeRAII CompoundScope(getSema()); 6495 6496 bool SubStmtInvalid = false; 6497 bool SubStmtChanged = false; 6498 SmallVector<Stmt*, 8> Statements; 6499 for (auto *B : S->body()) { 6500 StmtResult Result = getDerived().TransformStmt(B); 6501 if (Result.isInvalid()) { 6502 // Immediately fail if this was a DeclStmt, since it's very 6503 // likely that this will cause problems for future statements. 6504 if (isa<DeclStmt>(B)) 6505 return StmtError(); 6506 6507 // Otherwise, just keep processing substatements and fail later. 6508 SubStmtInvalid = true; 6509 continue; 6510 } 6511 6512 SubStmtChanged = SubStmtChanged || Result.get() != B; 6513 Statements.push_back(Result.getAs<Stmt>()); 6514 } 6515 6516 if (SubStmtInvalid) 6517 return StmtError(); 6518 6519 if (!getDerived().AlwaysRebuild() && 6520 !SubStmtChanged) 6521 return S; 6522 6523 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6524 Statements, 6525 S->getRBracLoc(), 6526 IsStmtExpr); 6527 } 6528 6529 template<typename Derived> 6530 StmtResult 6531 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6532 ExprResult LHS, RHS; 6533 { 6534 EnterExpressionEvaluationContext Unevaluated( 6535 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6536 6537 // Transform the left-hand case value. 6538 LHS = getDerived().TransformExpr(S->getLHS()); 6539 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6540 if (LHS.isInvalid()) 6541 return StmtError(); 6542 6543 // Transform the right-hand case value (for the GNU case-range extension). 6544 RHS = getDerived().TransformExpr(S->getRHS()); 6545 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6546 if (RHS.isInvalid()) 6547 return StmtError(); 6548 } 6549 6550 // Build the case statement. 6551 // Case statements are always rebuilt so that they will attached to their 6552 // transformed switch statement. 6553 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6554 LHS.get(), 6555 S->getEllipsisLoc(), 6556 RHS.get(), 6557 S->getColonLoc()); 6558 if (Case.isInvalid()) 6559 return StmtError(); 6560 6561 // Transform the statement following the case 6562 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6563 if (SubStmt.isInvalid()) 6564 return StmtError(); 6565 6566 // Attach the body to the case statement 6567 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6568 } 6569 6570 template<typename Derived> 6571 StmtResult 6572 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6573 // Transform the statement following the default case 6574 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6575 if (SubStmt.isInvalid()) 6576 return StmtError(); 6577 6578 // Default statements are always rebuilt 6579 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6580 SubStmt.get()); 6581 } 6582 6583 template<typename Derived> 6584 StmtResult 6585 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6586 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6587 if (SubStmt.isInvalid()) 6588 return StmtError(); 6589 6590 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6591 S->getDecl()); 6592 if (!LD) 6593 return StmtError(); 6594 6595 6596 // FIXME: Pass the real colon location in. 6597 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6598 cast<LabelDecl>(LD), SourceLocation(), 6599 SubStmt.get()); 6600 } 6601 6602 template <typename Derived> 6603 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6604 if (!R) 6605 return R; 6606 6607 switch (R->getKind()) { 6608 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6609 #define ATTR(X) 6610 #define PRAGMA_SPELLING_ATTR(X) \ 6611 case attr::X: \ 6612 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6613 #include "clang/Basic/AttrList.inc" 6614 default: 6615 return R; 6616 } 6617 } 6618 6619 template <typename Derived> 6620 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6621 bool AttrsChanged = false; 6622 SmallVector<const Attr *, 1> Attrs; 6623 6624 // Visit attributes and keep track if any are transformed. 6625 for (const auto *I : S->getAttrs()) { 6626 const Attr *R = getDerived().TransformAttr(I); 6627 AttrsChanged |= (I != R); 6628 Attrs.push_back(R); 6629 } 6630 6631 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6632 if (SubStmt.isInvalid()) 6633 return StmtError(); 6634 6635 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6636 return S; 6637 6638 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6639 SubStmt.get()); 6640 } 6641 6642 template<typename Derived> 6643 StmtResult 6644 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6645 // Transform the initialization statement 6646 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6647 if (Init.isInvalid()) 6648 return StmtError(); 6649 6650 // Transform the condition 6651 Sema::ConditionResult Cond = getDerived().TransformCondition( 6652 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6653 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6654 : Sema::ConditionKind::Boolean); 6655 if (Cond.isInvalid()) 6656 return StmtError(); 6657 6658 // If this is a constexpr if, determine which arm we should instantiate. 6659 llvm::Optional<bool> ConstexprConditionValue; 6660 if (S->isConstexpr()) 6661 ConstexprConditionValue = Cond.getKnownValue(); 6662 6663 // Transform the "then" branch. 6664 StmtResult Then; 6665 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6666 Then = getDerived().TransformStmt(S->getThen()); 6667 if (Then.isInvalid()) 6668 return StmtError(); 6669 } else { 6670 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6671 } 6672 6673 // Transform the "else" branch. 6674 StmtResult Else; 6675 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6676 Else = getDerived().TransformStmt(S->getElse()); 6677 if (Else.isInvalid()) 6678 return StmtError(); 6679 } 6680 6681 if (!getDerived().AlwaysRebuild() && 6682 Init.get() == S->getInit() && 6683 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6684 Then.get() == S->getThen() && 6685 Else.get() == S->getElse()) 6686 return S; 6687 6688 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6689 Init.get(), Then.get(), S->getElseLoc(), 6690 Else.get()); 6691 } 6692 6693 template<typename Derived> 6694 StmtResult 6695 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6696 // Transform the initialization statement 6697 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6698 if (Init.isInvalid()) 6699 return StmtError(); 6700 6701 // Transform the condition. 6702 Sema::ConditionResult Cond = getDerived().TransformCondition( 6703 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6704 Sema::ConditionKind::Switch); 6705 if (Cond.isInvalid()) 6706 return StmtError(); 6707 6708 // Rebuild the switch statement. 6709 StmtResult Switch 6710 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6711 if (Switch.isInvalid()) 6712 return StmtError(); 6713 6714 // Transform the body of the switch statement. 6715 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6716 if (Body.isInvalid()) 6717 return StmtError(); 6718 6719 // Complete the switch statement. 6720 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6721 Body.get()); 6722 } 6723 6724 template<typename Derived> 6725 StmtResult 6726 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6727 // Transform the condition 6728 Sema::ConditionResult Cond = getDerived().TransformCondition( 6729 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6730 Sema::ConditionKind::Boolean); 6731 if (Cond.isInvalid()) 6732 return StmtError(); 6733 6734 // Transform the body 6735 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6736 if (Body.isInvalid()) 6737 return StmtError(); 6738 6739 if (!getDerived().AlwaysRebuild() && 6740 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6741 Body.get() == S->getBody()) 6742 return Owned(S); 6743 6744 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6745 } 6746 6747 template<typename Derived> 6748 StmtResult 6749 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6750 // Transform the body 6751 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6752 if (Body.isInvalid()) 6753 return StmtError(); 6754 6755 // Transform the condition 6756 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6757 if (Cond.isInvalid()) 6758 return StmtError(); 6759 6760 if (!getDerived().AlwaysRebuild() && 6761 Cond.get() == S->getCond() && 6762 Body.get() == S->getBody()) 6763 return S; 6764 6765 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6766 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6767 S->getRParenLoc()); 6768 } 6769 6770 template<typename Derived> 6771 StmtResult 6772 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6773 // Transform the initialization statement 6774 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6775 if (Init.isInvalid()) 6776 return StmtError(); 6777 6778 // In OpenMP loop region loop control variable must be captured and be 6779 // private. Perform analysis of first part (if any). 6780 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6781 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6782 6783 // Transform the condition 6784 Sema::ConditionResult Cond = getDerived().TransformCondition( 6785 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6786 Sema::ConditionKind::Boolean); 6787 if (Cond.isInvalid()) 6788 return StmtError(); 6789 6790 // Transform the increment 6791 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6792 if (Inc.isInvalid()) 6793 return StmtError(); 6794 6795 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6796 if (S->getInc() && !FullInc.get()) 6797 return StmtError(); 6798 6799 // Transform the body 6800 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6801 if (Body.isInvalid()) 6802 return StmtError(); 6803 6804 if (!getDerived().AlwaysRebuild() && 6805 Init.get() == S->getInit() && 6806 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6807 Inc.get() == S->getInc() && 6808 Body.get() == S->getBody()) 6809 return S; 6810 6811 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6812 Init.get(), Cond, FullInc, 6813 S->getRParenLoc(), Body.get()); 6814 } 6815 6816 template<typename Derived> 6817 StmtResult 6818 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6819 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6820 S->getLabel()); 6821 if (!LD) 6822 return StmtError(); 6823 6824 // Goto statements must always be rebuilt, to resolve the label. 6825 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6826 cast<LabelDecl>(LD)); 6827 } 6828 6829 template<typename Derived> 6830 StmtResult 6831 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6832 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6833 if (Target.isInvalid()) 6834 return StmtError(); 6835 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6836 6837 if (!getDerived().AlwaysRebuild() && 6838 Target.get() == S->getTarget()) 6839 return S; 6840 6841 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6842 Target.get()); 6843 } 6844 6845 template<typename Derived> 6846 StmtResult 6847 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6848 return S; 6849 } 6850 6851 template<typename Derived> 6852 StmtResult 6853 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6854 return S; 6855 } 6856 6857 template<typename Derived> 6858 StmtResult 6859 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6860 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6861 /*NotCopyInit*/false); 6862 if (Result.isInvalid()) 6863 return StmtError(); 6864 6865 // FIXME: We always rebuild the return statement because there is no way 6866 // to tell whether the return type of the function has changed. 6867 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6868 } 6869 6870 template<typename Derived> 6871 StmtResult 6872 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6873 bool DeclChanged = false; 6874 SmallVector<Decl *, 4> Decls; 6875 for (auto *D : S->decls()) { 6876 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6877 if (!Transformed) 6878 return StmtError(); 6879 6880 if (Transformed != D) 6881 DeclChanged = true; 6882 6883 Decls.push_back(Transformed); 6884 } 6885 6886 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6887 return S; 6888 6889 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 6890 } 6891 6892 template<typename Derived> 6893 StmtResult 6894 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6895 6896 SmallVector<Expr*, 8> Constraints; 6897 SmallVector<Expr*, 8> Exprs; 6898 SmallVector<IdentifierInfo *, 4> Names; 6899 6900 ExprResult AsmString; 6901 SmallVector<Expr*, 8> Clobbers; 6902 6903 bool ExprsChanged = false; 6904 6905 // Go through the outputs. 6906 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6907 Names.push_back(S->getOutputIdentifier(I)); 6908 6909 // No need to transform the constraint literal. 6910 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6911 6912 // Transform the output expr. 6913 Expr *OutputExpr = S->getOutputExpr(I); 6914 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6915 if (Result.isInvalid()) 6916 return StmtError(); 6917 6918 ExprsChanged |= Result.get() != OutputExpr; 6919 6920 Exprs.push_back(Result.get()); 6921 } 6922 6923 // Go through the inputs. 6924 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6925 Names.push_back(S->getInputIdentifier(I)); 6926 6927 // No need to transform the constraint literal. 6928 Constraints.push_back(S->getInputConstraintLiteral(I)); 6929 6930 // Transform the input expr. 6931 Expr *InputExpr = S->getInputExpr(I); 6932 ExprResult Result = getDerived().TransformExpr(InputExpr); 6933 if (Result.isInvalid()) 6934 return StmtError(); 6935 6936 ExprsChanged |= Result.get() != InputExpr; 6937 6938 Exprs.push_back(Result.get()); 6939 } 6940 6941 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6942 return S; 6943 6944 // Go through the clobbers. 6945 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6946 Clobbers.push_back(S->getClobberStringLiteral(I)); 6947 6948 // No need to transform the asm string literal. 6949 AsmString = S->getAsmString(); 6950 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6951 S->isVolatile(), S->getNumOutputs(), 6952 S->getNumInputs(), Names.data(), 6953 Constraints, Exprs, AsmString.get(), 6954 Clobbers, S->getRParenLoc()); 6955 } 6956 6957 template<typename Derived> 6958 StmtResult 6959 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6960 ArrayRef<Token> AsmToks = 6961 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6962 6963 bool HadError = false, HadChange = false; 6964 6965 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6966 SmallVector<Expr*, 8> TransformedExprs; 6967 TransformedExprs.reserve(SrcExprs.size()); 6968 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6969 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6970 if (!Result.isUsable()) { 6971 HadError = true; 6972 } else { 6973 HadChange |= (Result.get() != SrcExprs[i]); 6974 TransformedExprs.push_back(Result.get()); 6975 } 6976 } 6977 6978 if (HadError) return StmtError(); 6979 if (!HadChange && !getDerived().AlwaysRebuild()) 6980 return Owned(S); 6981 6982 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6983 AsmToks, S->getAsmString(), 6984 S->getNumOutputs(), S->getNumInputs(), 6985 S->getAllConstraints(), S->getClobbers(), 6986 TransformedExprs, S->getEndLoc()); 6987 } 6988 6989 // C++ Coroutines TS 6990 6991 template<typename Derived> 6992 StmtResult 6993 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6994 auto *ScopeInfo = SemaRef.getCurFunction(); 6995 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 6996 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 6997 ScopeInfo->NeedsCoroutineSuspends && 6998 ScopeInfo->CoroutineSuspends.first == nullptr && 6999 ScopeInfo->CoroutineSuspends.second == nullptr && 7000 "expected clean scope info"); 7001 7002 // Set that we have (possibly-invalid) suspend points before we do anything 7003 // that may fail. 7004 ScopeInfo->setNeedsCoroutineSuspends(false); 7005 7006 // The new CoroutinePromise object needs to be built and put into the current 7007 // FunctionScopeInfo before any transformations or rebuilding occurs. 7008 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7009 return StmtError(); 7010 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7011 if (!Promise) 7012 return StmtError(); 7013 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 7014 ScopeInfo->CoroutinePromise = Promise; 7015 7016 // Transform the implicit coroutine statements we built during the initial 7017 // parse. 7018 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7019 if (InitSuspend.isInvalid()) 7020 return StmtError(); 7021 StmtResult FinalSuspend = 7022 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7023 if (FinalSuspend.isInvalid()) 7024 return StmtError(); 7025 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7026 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7027 7028 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7029 if (BodyRes.isInvalid()) 7030 return StmtError(); 7031 7032 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7033 if (Builder.isInvalid()) 7034 return StmtError(); 7035 7036 Expr *ReturnObject = S->getReturnValueInit(); 7037 assert(ReturnObject && "the return object is expected to be valid"); 7038 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7039 /*NoCopyInit*/ false); 7040 if (Res.isInvalid()) 7041 return StmtError(); 7042 Builder.ReturnValue = Res.get(); 7043 7044 if (S->hasDependentPromiseType()) { 7045 assert(!Promise->getType()->isDependentType() && 7046 "the promise type must no longer be dependent"); 7047 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7048 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7049 "these nodes should not have been built yet"); 7050 if (!Builder.buildDependentStatements()) 7051 return StmtError(); 7052 } else { 7053 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7054 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7055 if (Res.isInvalid()) 7056 return StmtError(); 7057 Builder.OnFallthrough = Res.get(); 7058 } 7059 7060 if (auto *OnException = S->getExceptionHandler()) { 7061 StmtResult Res = getDerived().TransformStmt(OnException); 7062 if (Res.isInvalid()) 7063 return StmtError(); 7064 Builder.OnException = Res.get(); 7065 } 7066 7067 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7068 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7069 if (Res.isInvalid()) 7070 return StmtError(); 7071 Builder.ReturnStmtOnAllocFailure = Res.get(); 7072 } 7073 7074 // Transform any additional statements we may have already built 7075 assert(S->getAllocate() && S->getDeallocate() && 7076 "allocation and deallocation calls must already be built"); 7077 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7078 if (AllocRes.isInvalid()) 7079 return StmtError(); 7080 Builder.Allocate = AllocRes.get(); 7081 7082 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7083 if (DeallocRes.isInvalid()) 7084 return StmtError(); 7085 Builder.Deallocate = DeallocRes.get(); 7086 7087 assert(S->getResultDecl() && "ResultDecl must already be built"); 7088 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7089 if (ResultDecl.isInvalid()) 7090 return StmtError(); 7091 Builder.ResultDecl = ResultDecl.get(); 7092 7093 if (auto *ReturnStmt = S->getReturnStmt()) { 7094 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7095 if (Res.isInvalid()) 7096 return StmtError(); 7097 Builder.ReturnStmt = Res.get(); 7098 } 7099 } 7100 7101 return getDerived().RebuildCoroutineBodyStmt(Builder); 7102 } 7103 7104 template<typename Derived> 7105 StmtResult 7106 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7107 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7108 /*NotCopyInit*/false); 7109 if (Result.isInvalid()) 7110 return StmtError(); 7111 7112 // Always rebuild; we don't know if this needs to be injected into a new 7113 // context or if the promise type has changed. 7114 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7115 S->isImplicit()); 7116 } 7117 7118 template<typename Derived> 7119 ExprResult 7120 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7121 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7122 /*NotCopyInit*/false); 7123 if (Result.isInvalid()) 7124 return ExprError(); 7125 7126 // Always rebuild; we don't know if this needs to be injected into a new 7127 // context or if the promise type has changed. 7128 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7129 E->isImplicit()); 7130 } 7131 7132 template <typename Derived> 7133 ExprResult 7134 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7135 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7136 /*NotCopyInit*/ false); 7137 if (OperandResult.isInvalid()) 7138 return ExprError(); 7139 7140 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7141 E->getOperatorCoawaitLookup()); 7142 7143 if (LookupResult.isInvalid()) 7144 return ExprError(); 7145 7146 // Always rebuild; we don't know if this needs to be injected into a new 7147 // context or if the promise type has changed. 7148 return getDerived().RebuildDependentCoawaitExpr( 7149 E->getKeywordLoc(), OperandResult.get(), 7150 cast<UnresolvedLookupExpr>(LookupResult.get())); 7151 } 7152 7153 template<typename Derived> 7154 ExprResult 7155 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7156 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7157 /*NotCopyInit*/false); 7158 if (Result.isInvalid()) 7159 return ExprError(); 7160 7161 // Always rebuild; we don't know if this needs to be injected into a new 7162 // context or if the promise type has changed. 7163 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7164 } 7165 7166 // Objective-C Statements. 7167 7168 template<typename Derived> 7169 StmtResult 7170 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7171 // Transform the body of the @try. 7172 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7173 if (TryBody.isInvalid()) 7174 return StmtError(); 7175 7176 // Transform the @catch statements (if present). 7177 bool AnyCatchChanged = false; 7178 SmallVector<Stmt*, 8> CatchStmts; 7179 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7180 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7181 if (Catch.isInvalid()) 7182 return StmtError(); 7183 if (Catch.get() != S->getCatchStmt(I)) 7184 AnyCatchChanged = true; 7185 CatchStmts.push_back(Catch.get()); 7186 } 7187 7188 // Transform the @finally statement (if present). 7189 StmtResult Finally; 7190 if (S->getFinallyStmt()) { 7191 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7192 if (Finally.isInvalid()) 7193 return StmtError(); 7194 } 7195 7196 // If nothing changed, just retain this statement. 7197 if (!getDerived().AlwaysRebuild() && 7198 TryBody.get() == S->getTryBody() && 7199 !AnyCatchChanged && 7200 Finally.get() == S->getFinallyStmt()) 7201 return S; 7202 7203 // Build a new statement. 7204 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7205 CatchStmts, Finally.get()); 7206 } 7207 7208 template<typename Derived> 7209 StmtResult 7210 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7211 // Transform the @catch parameter, if there is one. 7212 VarDecl *Var = nullptr; 7213 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7214 TypeSourceInfo *TSInfo = nullptr; 7215 if (FromVar->getTypeSourceInfo()) { 7216 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7217 if (!TSInfo) 7218 return StmtError(); 7219 } 7220 7221 QualType T; 7222 if (TSInfo) 7223 T = TSInfo->getType(); 7224 else { 7225 T = getDerived().TransformType(FromVar->getType()); 7226 if (T.isNull()) 7227 return StmtError(); 7228 } 7229 7230 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7231 if (!Var) 7232 return StmtError(); 7233 } 7234 7235 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7236 if (Body.isInvalid()) 7237 return StmtError(); 7238 7239 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7240 S->getRParenLoc(), 7241 Var, Body.get()); 7242 } 7243 7244 template<typename Derived> 7245 StmtResult 7246 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7247 // Transform the body. 7248 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7249 if (Body.isInvalid()) 7250 return StmtError(); 7251 7252 // If nothing changed, just retain this statement. 7253 if (!getDerived().AlwaysRebuild() && 7254 Body.get() == S->getFinallyBody()) 7255 return S; 7256 7257 // Build a new statement. 7258 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7259 Body.get()); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7265 ExprResult Operand; 7266 if (S->getThrowExpr()) { 7267 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7268 if (Operand.isInvalid()) 7269 return StmtError(); 7270 } 7271 7272 if (!getDerived().AlwaysRebuild() && 7273 Operand.get() == S->getThrowExpr()) 7274 return S; 7275 7276 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7277 } 7278 7279 template<typename Derived> 7280 StmtResult 7281 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7282 ObjCAtSynchronizedStmt *S) { 7283 // Transform the object we are locking. 7284 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7285 if (Object.isInvalid()) 7286 return StmtError(); 7287 Object = 7288 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7289 Object.get()); 7290 if (Object.isInvalid()) 7291 return StmtError(); 7292 7293 // Transform the body. 7294 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7295 if (Body.isInvalid()) 7296 return StmtError(); 7297 7298 // If nothing change, just retain the current statement. 7299 if (!getDerived().AlwaysRebuild() && 7300 Object.get() == S->getSynchExpr() && 7301 Body.get() == S->getSynchBody()) 7302 return S; 7303 7304 // Build a new statement. 7305 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7306 Object.get(), Body.get()); 7307 } 7308 7309 template<typename Derived> 7310 StmtResult 7311 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7312 ObjCAutoreleasePoolStmt *S) { 7313 // Transform the body. 7314 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7315 if (Body.isInvalid()) 7316 return StmtError(); 7317 7318 // If nothing changed, just retain this statement. 7319 if (!getDerived().AlwaysRebuild() && 7320 Body.get() == S->getSubStmt()) 7321 return S; 7322 7323 // Build a new statement. 7324 return getDerived().RebuildObjCAutoreleasePoolStmt( 7325 S->getAtLoc(), Body.get()); 7326 } 7327 7328 template<typename Derived> 7329 StmtResult 7330 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7331 ObjCForCollectionStmt *S) { 7332 // Transform the element statement. 7333 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7334 if (Element.isInvalid()) 7335 return StmtError(); 7336 7337 // Transform the collection expression. 7338 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7339 if (Collection.isInvalid()) 7340 return StmtError(); 7341 7342 // Transform the body. 7343 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7344 if (Body.isInvalid()) 7345 return StmtError(); 7346 7347 // If nothing changed, just retain this statement. 7348 if (!getDerived().AlwaysRebuild() && 7349 Element.get() == S->getElement() && 7350 Collection.get() == S->getCollection() && 7351 Body.get() == S->getBody()) 7352 return S; 7353 7354 // Build a new statement. 7355 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7356 Element.get(), 7357 Collection.get(), 7358 S->getRParenLoc(), 7359 Body.get()); 7360 } 7361 7362 template <typename Derived> 7363 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7364 // Transform the exception declaration, if any. 7365 VarDecl *Var = nullptr; 7366 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7367 TypeSourceInfo *T = 7368 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7369 if (!T) 7370 return StmtError(); 7371 7372 Var = getDerived().RebuildExceptionDecl( 7373 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7374 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7375 if (!Var || Var->isInvalidDecl()) 7376 return StmtError(); 7377 } 7378 7379 // Transform the actual exception handler. 7380 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7381 if (Handler.isInvalid()) 7382 return StmtError(); 7383 7384 if (!getDerived().AlwaysRebuild() && !Var && 7385 Handler.get() == S->getHandlerBlock()) 7386 return S; 7387 7388 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7389 } 7390 7391 template <typename Derived> 7392 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7393 // Transform the try block itself. 7394 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7395 if (TryBlock.isInvalid()) 7396 return StmtError(); 7397 7398 // Transform the handlers. 7399 bool HandlerChanged = false; 7400 SmallVector<Stmt *, 8> Handlers; 7401 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7402 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7403 if (Handler.isInvalid()) 7404 return StmtError(); 7405 7406 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7407 Handlers.push_back(Handler.getAs<Stmt>()); 7408 } 7409 7410 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7411 !HandlerChanged) 7412 return S; 7413 7414 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7415 Handlers); 7416 } 7417 7418 template<typename Derived> 7419 StmtResult 7420 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7421 StmtResult Init = 7422 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7423 if (Init.isInvalid()) 7424 return StmtError(); 7425 7426 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7427 if (Range.isInvalid()) 7428 return StmtError(); 7429 7430 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7431 if (Begin.isInvalid()) 7432 return StmtError(); 7433 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7434 if (End.isInvalid()) 7435 return StmtError(); 7436 7437 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7438 if (Cond.isInvalid()) 7439 return StmtError(); 7440 if (Cond.get()) 7441 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7442 if (Cond.isInvalid()) 7443 return StmtError(); 7444 if (Cond.get()) 7445 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7446 7447 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7448 if (Inc.isInvalid()) 7449 return StmtError(); 7450 if (Inc.get()) 7451 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7452 7453 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7454 if (LoopVar.isInvalid()) 7455 return StmtError(); 7456 7457 StmtResult NewStmt = S; 7458 if (getDerived().AlwaysRebuild() || 7459 Init.get() != S->getInit() || 7460 Range.get() != S->getRangeStmt() || 7461 Begin.get() != S->getBeginStmt() || 7462 End.get() != S->getEndStmt() || 7463 Cond.get() != S->getCond() || 7464 Inc.get() != S->getInc() || 7465 LoopVar.get() != S->getLoopVarStmt()) { 7466 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7467 S->getCoawaitLoc(), Init.get(), 7468 S->getColonLoc(), Range.get(), 7469 Begin.get(), End.get(), 7470 Cond.get(), 7471 Inc.get(), LoopVar.get(), 7472 S->getRParenLoc()); 7473 if (NewStmt.isInvalid()) 7474 return StmtError(); 7475 } 7476 7477 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7478 if (Body.isInvalid()) 7479 return StmtError(); 7480 7481 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7482 // it now so we have a new statement to attach the body to. 7483 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7484 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7485 S->getCoawaitLoc(), Init.get(), 7486 S->getColonLoc(), Range.get(), 7487 Begin.get(), End.get(), 7488 Cond.get(), 7489 Inc.get(), LoopVar.get(), 7490 S->getRParenLoc()); 7491 if (NewStmt.isInvalid()) 7492 return StmtError(); 7493 } 7494 7495 if (NewStmt.get() == S) 7496 return S; 7497 7498 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7499 } 7500 7501 template<typename Derived> 7502 StmtResult 7503 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7504 MSDependentExistsStmt *S) { 7505 // Transform the nested-name-specifier, if any. 7506 NestedNameSpecifierLoc QualifierLoc; 7507 if (S->getQualifierLoc()) { 7508 QualifierLoc 7509 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7510 if (!QualifierLoc) 7511 return StmtError(); 7512 } 7513 7514 // Transform the declaration name. 7515 DeclarationNameInfo NameInfo = S->getNameInfo(); 7516 if (NameInfo.getName()) { 7517 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7518 if (!NameInfo.getName()) 7519 return StmtError(); 7520 } 7521 7522 // Check whether anything changed. 7523 if (!getDerived().AlwaysRebuild() && 7524 QualifierLoc == S->getQualifierLoc() && 7525 NameInfo.getName() == S->getNameInfo().getName()) 7526 return S; 7527 7528 // Determine whether this name exists, if we can. 7529 CXXScopeSpec SS; 7530 SS.Adopt(QualifierLoc); 7531 bool Dependent = false; 7532 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7533 case Sema::IER_Exists: 7534 if (S->isIfExists()) 7535 break; 7536 7537 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7538 7539 case Sema::IER_DoesNotExist: 7540 if (S->isIfNotExists()) 7541 break; 7542 7543 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7544 7545 case Sema::IER_Dependent: 7546 Dependent = true; 7547 break; 7548 7549 case Sema::IER_Error: 7550 return StmtError(); 7551 } 7552 7553 // We need to continue with the instantiation, so do so now. 7554 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7555 if (SubStmt.isInvalid()) 7556 return StmtError(); 7557 7558 // If we have resolved the name, just transform to the substatement. 7559 if (!Dependent) 7560 return SubStmt; 7561 7562 // The name is still dependent, so build a dependent expression again. 7563 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7564 S->isIfExists(), 7565 QualifierLoc, 7566 NameInfo, 7567 SubStmt.get()); 7568 } 7569 7570 template<typename Derived> 7571 ExprResult 7572 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7573 NestedNameSpecifierLoc QualifierLoc; 7574 if (E->getQualifierLoc()) { 7575 QualifierLoc 7576 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7577 if (!QualifierLoc) 7578 return ExprError(); 7579 } 7580 7581 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7582 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7583 if (!PD) 7584 return ExprError(); 7585 7586 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7587 if (Base.isInvalid()) 7588 return ExprError(); 7589 7590 return new (SemaRef.getASTContext()) 7591 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7592 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7593 QualifierLoc, E->getMemberLoc()); 7594 } 7595 7596 template <typename Derived> 7597 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7598 MSPropertySubscriptExpr *E) { 7599 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7600 if (BaseRes.isInvalid()) 7601 return ExprError(); 7602 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7603 if (IdxRes.isInvalid()) 7604 return ExprError(); 7605 7606 if (!getDerived().AlwaysRebuild() && 7607 BaseRes.get() == E->getBase() && 7608 IdxRes.get() == E->getIdx()) 7609 return E; 7610 7611 return getDerived().RebuildArraySubscriptExpr( 7612 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7613 } 7614 7615 template <typename Derived> 7616 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7617 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7618 if (TryBlock.isInvalid()) 7619 return StmtError(); 7620 7621 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7622 if (Handler.isInvalid()) 7623 return StmtError(); 7624 7625 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7626 Handler.get() == S->getHandler()) 7627 return S; 7628 7629 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7630 TryBlock.get(), Handler.get()); 7631 } 7632 7633 template <typename Derived> 7634 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7635 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7636 if (Block.isInvalid()) 7637 return StmtError(); 7638 7639 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7640 } 7641 7642 template <typename Derived> 7643 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7644 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7645 if (FilterExpr.isInvalid()) 7646 return StmtError(); 7647 7648 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7649 if (Block.isInvalid()) 7650 return StmtError(); 7651 7652 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7653 Block.get()); 7654 } 7655 7656 template <typename Derived> 7657 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7658 if (isa<SEHFinallyStmt>(Handler)) 7659 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7660 else 7661 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7662 } 7663 7664 template<typename Derived> 7665 StmtResult 7666 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7667 return S; 7668 } 7669 7670 //===----------------------------------------------------------------------===// 7671 // OpenMP directive transformation 7672 //===----------------------------------------------------------------------===// 7673 template <typename Derived> 7674 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7675 OMPExecutableDirective *D) { 7676 7677 // Transform the clauses 7678 llvm::SmallVector<OMPClause *, 16> TClauses; 7679 ArrayRef<OMPClause *> Clauses = D->clauses(); 7680 TClauses.reserve(Clauses.size()); 7681 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7682 I != E; ++I) { 7683 if (*I) { 7684 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7685 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7686 getDerived().getSema().EndOpenMPClause(); 7687 if (Clause) 7688 TClauses.push_back(Clause); 7689 } else { 7690 TClauses.push_back(nullptr); 7691 } 7692 } 7693 StmtResult AssociatedStmt; 7694 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7695 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7696 /*CurScope=*/nullptr); 7697 StmtResult Body; 7698 { 7699 Sema::CompoundScopeRAII CompoundScope(getSema()); 7700 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7701 Body = getDerived().TransformStmt(CS); 7702 } 7703 AssociatedStmt = 7704 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7705 if (AssociatedStmt.isInvalid()) { 7706 return StmtError(); 7707 } 7708 } 7709 if (TClauses.size() != Clauses.size()) { 7710 return StmtError(); 7711 } 7712 7713 // Transform directive name for 'omp critical' directive. 7714 DeclarationNameInfo DirName; 7715 if (D->getDirectiveKind() == OMPD_critical) { 7716 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7717 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7718 } 7719 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7720 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7721 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7722 } else if (D->getDirectiveKind() == OMPD_cancel) { 7723 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7724 } 7725 7726 return getDerived().RebuildOMPExecutableDirective( 7727 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7728 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 7729 } 7730 7731 template <typename Derived> 7732 StmtResult 7733 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7734 DeclarationNameInfo DirName; 7735 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7736 D->getBeginLoc()); 7737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7739 return Res; 7740 } 7741 7742 template <typename Derived> 7743 StmtResult 7744 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7745 DeclarationNameInfo DirName; 7746 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7747 D->getBeginLoc()); 7748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7750 return Res; 7751 } 7752 7753 template <typename Derived> 7754 StmtResult 7755 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7756 DeclarationNameInfo DirName; 7757 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7758 D->getBeginLoc()); 7759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7761 return Res; 7762 } 7763 7764 template <typename Derived> 7765 StmtResult 7766 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7767 DeclarationNameInfo DirName; 7768 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7769 D->getBeginLoc()); 7770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7772 return Res; 7773 } 7774 7775 template <typename Derived> 7776 StmtResult 7777 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7778 DeclarationNameInfo DirName; 7779 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7780 D->getBeginLoc()); 7781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7783 return Res; 7784 } 7785 7786 template <typename Derived> 7787 StmtResult 7788 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7789 DeclarationNameInfo DirName; 7790 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7791 D->getBeginLoc()); 7792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7794 return Res; 7795 } 7796 7797 template <typename Derived> 7798 StmtResult 7799 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7800 DeclarationNameInfo DirName; 7801 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7802 D->getBeginLoc()); 7803 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7804 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7805 return Res; 7806 } 7807 7808 template <typename Derived> 7809 StmtResult 7810 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7811 DeclarationNameInfo DirName; 7812 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7813 D->getBeginLoc()); 7814 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7815 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7816 return Res; 7817 } 7818 7819 template <typename Derived> 7820 StmtResult 7821 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7822 getDerived().getSema().StartOpenMPDSABlock( 7823 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 7824 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7825 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7826 return Res; 7827 } 7828 7829 template <typename Derived> 7830 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7831 OMPParallelForDirective *D) { 7832 DeclarationNameInfo DirName; 7833 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7834 nullptr, D->getBeginLoc()); 7835 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7836 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7837 return Res; 7838 } 7839 7840 template <typename Derived> 7841 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7842 OMPParallelForSimdDirective *D) { 7843 DeclarationNameInfo DirName; 7844 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7845 nullptr, D->getBeginLoc()); 7846 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7847 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7848 return Res; 7849 } 7850 7851 template <typename Derived> 7852 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7853 OMPParallelSectionsDirective *D) { 7854 DeclarationNameInfo DirName; 7855 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7856 nullptr, D->getBeginLoc()); 7857 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7858 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7859 return Res; 7860 } 7861 7862 template <typename Derived> 7863 StmtResult 7864 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7865 DeclarationNameInfo DirName; 7866 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7867 D->getBeginLoc()); 7868 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7869 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7870 return Res; 7871 } 7872 7873 template <typename Derived> 7874 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7875 OMPTaskyieldDirective *D) { 7876 DeclarationNameInfo DirName; 7877 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7878 D->getBeginLoc()); 7879 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7880 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7881 return Res; 7882 } 7883 7884 template <typename Derived> 7885 StmtResult 7886 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7887 DeclarationNameInfo DirName; 7888 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7889 D->getBeginLoc()); 7890 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7891 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7892 return Res; 7893 } 7894 7895 template <typename Derived> 7896 StmtResult 7897 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7898 DeclarationNameInfo DirName; 7899 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7900 D->getBeginLoc()); 7901 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7902 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7903 return Res; 7904 } 7905 7906 template <typename Derived> 7907 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7908 OMPTaskgroupDirective *D) { 7909 DeclarationNameInfo DirName; 7910 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7911 D->getBeginLoc()); 7912 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7913 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7914 return Res; 7915 } 7916 7917 template <typename Derived> 7918 StmtResult 7919 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7920 DeclarationNameInfo DirName; 7921 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7922 D->getBeginLoc()); 7923 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7925 return Res; 7926 } 7927 7928 template <typename Derived> 7929 StmtResult 7930 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7931 DeclarationNameInfo DirName; 7932 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7933 D->getBeginLoc()); 7934 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7935 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7936 return Res; 7937 } 7938 7939 template <typename Derived> 7940 StmtResult 7941 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7942 DeclarationNameInfo DirName; 7943 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7944 D->getBeginLoc()); 7945 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7946 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7947 return Res; 7948 } 7949 7950 template <typename Derived> 7951 StmtResult 7952 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7953 DeclarationNameInfo DirName; 7954 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7955 D->getBeginLoc()); 7956 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7957 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7958 return Res; 7959 } 7960 7961 template <typename Derived> 7962 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7963 OMPTargetDataDirective *D) { 7964 DeclarationNameInfo DirName; 7965 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7966 D->getBeginLoc()); 7967 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7968 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7969 return Res; 7970 } 7971 7972 template <typename Derived> 7973 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7974 OMPTargetEnterDataDirective *D) { 7975 DeclarationNameInfo DirName; 7976 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7977 nullptr, D->getBeginLoc()); 7978 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7979 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7980 return Res; 7981 } 7982 7983 template <typename Derived> 7984 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7985 OMPTargetExitDataDirective *D) { 7986 DeclarationNameInfo DirName; 7987 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7988 nullptr, D->getBeginLoc()); 7989 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7990 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7991 return Res; 7992 } 7993 7994 template <typename Derived> 7995 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7996 OMPTargetParallelDirective *D) { 7997 DeclarationNameInfo DirName; 7998 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7999 nullptr, D->getBeginLoc()); 8000 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8001 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8002 return Res; 8003 } 8004 8005 template <typename Derived> 8006 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8007 OMPTargetParallelForDirective *D) { 8008 DeclarationNameInfo DirName; 8009 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8010 nullptr, D->getBeginLoc()); 8011 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8012 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8013 return Res; 8014 } 8015 8016 template <typename Derived> 8017 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8018 OMPTargetUpdateDirective *D) { 8019 DeclarationNameInfo DirName; 8020 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8021 nullptr, D->getBeginLoc()); 8022 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8023 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8024 return Res; 8025 } 8026 8027 template <typename Derived> 8028 StmtResult 8029 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8030 DeclarationNameInfo DirName; 8031 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8032 D->getBeginLoc()); 8033 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8034 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8035 return Res; 8036 } 8037 8038 template <typename Derived> 8039 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8040 OMPCancellationPointDirective *D) { 8041 DeclarationNameInfo DirName; 8042 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8043 nullptr, D->getBeginLoc()); 8044 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8045 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8046 return Res; 8047 } 8048 8049 template <typename Derived> 8050 StmtResult 8051 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8052 DeclarationNameInfo DirName; 8053 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8054 D->getBeginLoc()); 8055 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8056 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8057 return Res; 8058 } 8059 8060 template <typename Derived> 8061 StmtResult 8062 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8063 DeclarationNameInfo DirName; 8064 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8065 D->getBeginLoc()); 8066 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8068 return Res; 8069 } 8070 8071 template <typename Derived> 8072 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8073 OMPTaskLoopSimdDirective *D) { 8074 DeclarationNameInfo DirName; 8075 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8076 nullptr, D->getBeginLoc()); 8077 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8078 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8079 return Res; 8080 } 8081 8082 template <typename Derived> 8083 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8084 OMPDistributeDirective *D) { 8085 DeclarationNameInfo DirName; 8086 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8087 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>::TransformOMPDistributeParallelForDirective( 8095 OMPDistributeParallelForDirective *D) { 8096 DeclarationNameInfo DirName; 8097 getDerived().getSema().StartOpenMPDSABlock( 8098 OMPD_distribute_parallel_for, DirName, 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 8106 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8107 OMPDistributeParallelForSimdDirective *D) { 8108 DeclarationNameInfo DirName; 8109 getDerived().getSema().StartOpenMPDSABlock( 8110 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8111 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8112 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8113 return Res; 8114 } 8115 8116 template <typename Derived> 8117 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8118 OMPDistributeSimdDirective *D) { 8119 DeclarationNameInfo DirName; 8120 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8121 nullptr, D->getBeginLoc()); 8122 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8123 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8124 return Res; 8125 } 8126 8127 template <typename Derived> 8128 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8129 OMPTargetParallelForSimdDirective *D) { 8130 DeclarationNameInfo DirName; 8131 getDerived().getSema().StartOpenMPDSABlock( 8132 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8133 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8134 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8135 return Res; 8136 } 8137 8138 template <typename Derived> 8139 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8140 OMPTargetSimdDirective *D) { 8141 DeclarationNameInfo DirName; 8142 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8143 D->getBeginLoc()); 8144 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8145 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8146 return Res; 8147 } 8148 8149 template <typename Derived> 8150 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8151 OMPTeamsDistributeDirective *D) { 8152 DeclarationNameInfo DirName; 8153 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8154 nullptr, 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>::TransformOMPTeamsDistributeSimdDirective( 8162 OMPTeamsDistributeSimdDirective *D) { 8163 DeclarationNameInfo DirName; 8164 getDerived().getSema().StartOpenMPDSABlock( 8165 OMPD_teams_distribute_simd, 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>::TransformOMPTeamsDistributeParallelForSimdDirective( 8173 OMPTeamsDistributeParallelForSimdDirective *D) { 8174 DeclarationNameInfo DirName; 8175 getDerived().getSema().StartOpenMPDSABlock( 8176 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8177 D->getBeginLoc()); 8178 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8179 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8180 return Res; 8181 } 8182 8183 template <typename Derived> 8184 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8185 OMPTeamsDistributeParallelForDirective *D) { 8186 DeclarationNameInfo DirName; 8187 getDerived().getSema().StartOpenMPDSABlock( 8188 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8189 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8190 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8191 return Res; 8192 } 8193 8194 template <typename Derived> 8195 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8196 OMPTargetTeamsDirective *D) { 8197 DeclarationNameInfo DirName; 8198 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8199 nullptr, D->getBeginLoc()); 8200 auto Res = getDerived().TransformOMPExecutableDirective(D); 8201 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8202 return Res; 8203 } 8204 8205 template <typename Derived> 8206 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8207 OMPTargetTeamsDistributeDirective *D) { 8208 DeclarationNameInfo DirName; 8209 getDerived().getSema().StartOpenMPDSABlock( 8210 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8211 auto Res = getDerived().TransformOMPExecutableDirective(D); 8212 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8213 return Res; 8214 } 8215 8216 template <typename Derived> 8217 StmtResult 8218 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8219 OMPTargetTeamsDistributeParallelForDirective *D) { 8220 DeclarationNameInfo DirName; 8221 getDerived().getSema().StartOpenMPDSABlock( 8222 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8223 D->getBeginLoc()); 8224 auto Res = getDerived().TransformOMPExecutableDirective(D); 8225 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8226 return Res; 8227 } 8228 8229 template <typename Derived> 8230 StmtResult TreeTransform<Derived>:: 8231 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8232 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8233 DeclarationNameInfo DirName; 8234 getDerived().getSema().StartOpenMPDSABlock( 8235 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8236 D->getBeginLoc()); 8237 auto Res = getDerived().TransformOMPExecutableDirective(D); 8238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8239 return Res; 8240 } 8241 8242 template <typename Derived> 8243 StmtResult 8244 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8245 OMPTargetTeamsDistributeSimdDirective *D) { 8246 DeclarationNameInfo DirName; 8247 getDerived().getSema().StartOpenMPDSABlock( 8248 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8249 auto Res = getDerived().TransformOMPExecutableDirective(D); 8250 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8251 return Res; 8252 } 8253 8254 8255 //===----------------------------------------------------------------------===// 8256 // OpenMP clause transformation 8257 //===----------------------------------------------------------------------===// 8258 template <typename Derived> 8259 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8260 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8261 if (Cond.isInvalid()) 8262 return nullptr; 8263 return getDerived().RebuildOMPIfClause( 8264 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8265 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8266 } 8267 8268 template <typename Derived> 8269 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8270 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8271 if (Cond.isInvalid()) 8272 return nullptr; 8273 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8274 C->getLParenLoc(), C->getEndLoc()); 8275 } 8276 8277 template <typename Derived> 8278 OMPClause * 8279 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8280 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8281 if (NumThreads.isInvalid()) 8282 return nullptr; 8283 return getDerived().RebuildOMPNumThreadsClause( 8284 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8285 } 8286 8287 template <typename Derived> 8288 OMPClause * 8289 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8290 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8291 if (E.isInvalid()) 8292 return nullptr; 8293 return getDerived().RebuildOMPSafelenClause( 8294 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8295 } 8296 8297 template <typename Derived> 8298 OMPClause * 8299 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8300 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8301 if (E.isInvalid()) 8302 return nullptr; 8303 return getDerived().RebuildOMPSimdlenClause( 8304 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8305 } 8306 8307 template <typename Derived> 8308 OMPClause * 8309 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8310 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8311 if (E.isInvalid()) 8312 return nullptr; 8313 return getDerived().RebuildOMPCollapseClause( 8314 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8315 } 8316 8317 template <typename Derived> 8318 OMPClause * 8319 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8320 return getDerived().RebuildOMPDefaultClause( 8321 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8322 C->getLParenLoc(), C->getEndLoc()); 8323 } 8324 8325 template <typename Derived> 8326 OMPClause * 8327 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8328 return getDerived().RebuildOMPProcBindClause( 8329 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8330 C->getLParenLoc(), C->getEndLoc()); 8331 } 8332 8333 template <typename Derived> 8334 OMPClause * 8335 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8336 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8337 if (E.isInvalid()) 8338 return nullptr; 8339 return getDerived().RebuildOMPScheduleClause( 8340 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8341 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8342 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8343 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8344 } 8345 8346 template <typename Derived> 8347 OMPClause * 8348 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8349 ExprResult E; 8350 if (auto *Num = C->getNumForLoops()) { 8351 E = getDerived().TransformExpr(Num); 8352 if (E.isInvalid()) 8353 return nullptr; 8354 } 8355 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8356 C->getLParenLoc(), E.get()); 8357 } 8358 8359 template <typename Derived> 8360 OMPClause * 8361 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8362 // No need to rebuild this clause, no template-dependent parameters. 8363 return C; 8364 } 8365 8366 template <typename Derived> 8367 OMPClause * 8368 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8369 // No need to rebuild this clause, no template-dependent parameters. 8370 return C; 8371 } 8372 8373 template <typename Derived> 8374 OMPClause * 8375 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8376 // No need to rebuild this clause, no template-dependent parameters. 8377 return C; 8378 } 8379 8380 template <typename Derived> 8381 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8382 // No need to rebuild this clause, no template-dependent parameters. 8383 return C; 8384 } 8385 8386 template <typename Derived> 8387 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8388 // No need to rebuild this clause, no template-dependent parameters. 8389 return C; 8390 } 8391 8392 template <typename Derived> 8393 OMPClause * 8394 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8395 // No need to rebuild this clause, no template-dependent parameters. 8396 return C; 8397 } 8398 8399 template <typename Derived> 8400 OMPClause * 8401 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8402 // No need to rebuild this clause, no template-dependent parameters. 8403 return C; 8404 } 8405 8406 template <typename Derived> 8407 OMPClause * 8408 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8409 // No need to rebuild this clause, no template-dependent parameters. 8410 return C; 8411 } 8412 8413 template <typename Derived> 8414 OMPClause * 8415 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8416 // No need to rebuild this clause, no template-dependent parameters. 8417 return C; 8418 } 8419 8420 template <typename Derived> 8421 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8422 // No need to rebuild this clause, no template-dependent parameters. 8423 return C; 8424 } 8425 8426 template <typename Derived> 8427 OMPClause * 8428 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8429 // No need to rebuild this clause, no template-dependent parameters. 8430 return C; 8431 } 8432 8433 template <typename Derived> 8434 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8435 OMPUnifiedAddressClause *C) { 8436 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8437 } 8438 8439 template <typename Derived> 8440 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8441 OMPUnifiedSharedMemoryClause *C) { 8442 llvm_unreachable( 8443 "unified_shared_memory clause cannot appear in dependent context"); 8444 } 8445 8446 template <typename Derived> 8447 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8448 OMPReverseOffloadClause *C) { 8449 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8450 } 8451 8452 template <typename Derived> 8453 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8454 OMPDynamicAllocatorsClause *C) { 8455 llvm_unreachable( 8456 "dynamic_allocators clause cannot appear in dependent context"); 8457 } 8458 8459 template <typename Derived> 8460 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8461 OMPAtomicDefaultMemOrderClause *C) { 8462 llvm_unreachable( 8463 "atomic_default_mem_order clause cannot appear in dependent context"); 8464 } 8465 8466 template <typename Derived> 8467 OMPClause * 8468 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8469 llvm::SmallVector<Expr *, 16> Vars; 8470 Vars.reserve(C->varlist_size()); 8471 for (auto *VE : C->varlists()) { 8472 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8473 if (EVar.isInvalid()) 8474 return nullptr; 8475 Vars.push_back(EVar.get()); 8476 } 8477 return getDerived().RebuildOMPPrivateClause( 8478 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8479 } 8480 8481 template <typename Derived> 8482 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8483 OMPFirstprivateClause *C) { 8484 llvm::SmallVector<Expr *, 16> Vars; 8485 Vars.reserve(C->varlist_size()); 8486 for (auto *VE : C->varlists()) { 8487 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8488 if (EVar.isInvalid()) 8489 return nullptr; 8490 Vars.push_back(EVar.get()); 8491 } 8492 return getDerived().RebuildOMPFirstprivateClause( 8493 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8494 } 8495 8496 template <typename Derived> 8497 OMPClause * 8498 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8499 llvm::SmallVector<Expr *, 16> Vars; 8500 Vars.reserve(C->varlist_size()); 8501 for (auto *VE : C->varlists()) { 8502 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8503 if (EVar.isInvalid()) 8504 return nullptr; 8505 Vars.push_back(EVar.get()); 8506 } 8507 return getDerived().RebuildOMPLastprivateClause( 8508 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8509 } 8510 8511 template <typename Derived> 8512 OMPClause * 8513 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8514 llvm::SmallVector<Expr *, 16> Vars; 8515 Vars.reserve(C->varlist_size()); 8516 for (auto *VE : C->varlists()) { 8517 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8518 if (EVar.isInvalid()) 8519 return nullptr; 8520 Vars.push_back(EVar.get()); 8521 } 8522 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8523 C->getLParenLoc(), C->getEndLoc()); 8524 } 8525 8526 template <typename Derived> 8527 OMPClause * 8528 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8529 llvm::SmallVector<Expr *, 16> Vars; 8530 Vars.reserve(C->varlist_size()); 8531 for (auto *VE : C->varlists()) { 8532 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8533 if (EVar.isInvalid()) 8534 return nullptr; 8535 Vars.push_back(EVar.get()); 8536 } 8537 CXXScopeSpec ReductionIdScopeSpec; 8538 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8539 8540 DeclarationNameInfo NameInfo = C->getNameInfo(); 8541 if (NameInfo.getName()) { 8542 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8543 if (!NameInfo.getName()) 8544 return nullptr; 8545 } 8546 // Build a list of all UDR decls with the same names ranged by the Scopes. 8547 // The Scope boundary is a duplication of the previous decl. 8548 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8549 for (auto *E : C->reduction_ops()) { 8550 // Transform all the decls. 8551 if (E) { 8552 auto *ULE = cast<UnresolvedLookupExpr>(E); 8553 UnresolvedSet<8> Decls; 8554 for (auto *D : ULE->decls()) { 8555 NamedDecl *InstD = 8556 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8557 Decls.addDecl(InstD, InstD->getAccess()); 8558 } 8559 UnresolvedReductions.push_back( 8560 UnresolvedLookupExpr::Create( 8561 SemaRef.Context, /*NamingClass=*/nullptr, 8562 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8563 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8564 Decls.begin(), Decls.end())); 8565 } else 8566 UnresolvedReductions.push_back(nullptr); 8567 } 8568 return getDerived().RebuildOMPReductionClause( 8569 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8570 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8571 } 8572 8573 template <typename Derived> 8574 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8575 OMPTaskReductionClause *C) { 8576 llvm::SmallVector<Expr *, 16> Vars; 8577 Vars.reserve(C->varlist_size()); 8578 for (auto *VE : C->varlists()) { 8579 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8580 if (EVar.isInvalid()) 8581 return nullptr; 8582 Vars.push_back(EVar.get()); 8583 } 8584 CXXScopeSpec ReductionIdScopeSpec; 8585 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8586 8587 DeclarationNameInfo NameInfo = C->getNameInfo(); 8588 if (NameInfo.getName()) { 8589 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8590 if (!NameInfo.getName()) 8591 return nullptr; 8592 } 8593 // Build a list of all UDR decls with the same names ranged by the Scopes. 8594 // The Scope boundary is a duplication of the previous decl. 8595 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8596 for (auto *E : C->reduction_ops()) { 8597 // Transform all the decls. 8598 if (E) { 8599 auto *ULE = cast<UnresolvedLookupExpr>(E); 8600 UnresolvedSet<8> Decls; 8601 for (auto *D : ULE->decls()) { 8602 NamedDecl *InstD = 8603 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8604 Decls.addDecl(InstD, InstD->getAccess()); 8605 } 8606 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8607 SemaRef.Context, /*NamingClass=*/nullptr, 8608 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8609 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8610 } else 8611 UnresolvedReductions.push_back(nullptr); 8612 } 8613 return getDerived().RebuildOMPTaskReductionClause( 8614 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8615 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8616 } 8617 8618 template <typename Derived> 8619 OMPClause * 8620 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8621 llvm::SmallVector<Expr *, 16> Vars; 8622 Vars.reserve(C->varlist_size()); 8623 for (auto *VE : C->varlists()) { 8624 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8625 if (EVar.isInvalid()) 8626 return nullptr; 8627 Vars.push_back(EVar.get()); 8628 } 8629 CXXScopeSpec ReductionIdScopeSpec; 8630 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8631 8632 DeclarationNameInfo NameInfo = C->getNameInfo(); 8633 if (NameInfo.getName()) { 8634 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8635 if (!NameInfo.getName()) 8636 return nullptr; 8637 } 8638 // Build a list of all UDR decls with the same names ranged by the Scopes. 8639 // The Scope boundary is a duplication of the previous decl. 8640 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8641 for (auto *E : C->reduction_ops()) { 8642 // Transform all the decls. 8643 if (E) { 8644 auto *ULE = cast<UnresolvedLookupExpr>(E); 8645 UnresolvedSet<8> Decls; 8646 for (auto *D : ULE->decls()) { 8647 NamedDecl *InstD = 8648 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8649 Decls.addDecl(InstD, InstD->getAccess()); 8650 } 8651 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8652 SemaRef.Context, /*NamingClass=*/nullptr, 8653 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8654 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8655 } else 8656 UnresolvedReductions.push_back(nullptr); 8657 } 8658 return getDerived().RebuildOMPInReductionClause( 8659 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8660 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8661 } 8662 8663 template <typename Derived> 8664 OMPClause * 8665 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8666 llvm::SmallVector<Expr *, 16> Vars; 8667 Vars.reserve(C->varlist_size()); 8668 for (auto *VE : C->varlists()) { 8669 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8670 if (EVar.isInvalid()) 8671 return nullptr; 8672 Vars.push_back(EVar.get()); 8673 } 8674 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8675 if (Step.isInvalid()) 8676 return nullptr; 8677 return getDerived().RebuildOMPLinearClause( 8678 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 8679 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8680 } 8681 8682 template <typename Derived> 8683 OMPClause * 8684 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8685 llvm::SmallVector<Expr *, 16> Vars; 8686 Vars.reserve(C->varlist_size()); 8687 for (auto *VE : C->varlists()) { 8688 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8689 if (EVar.isInvalid()) 8690 return nullptr; 8691 Vars.push_back(EVar.get()); 8692 } 8693 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8694 if (Alignment.isInvalid()) 8695 return nullptr; 8696 return getDerived().RebuildOMPAlignedClause( 8697 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 8698 C->getColonLoc(), C->getEndLoc()); 8699 } 8700 8701 template <typename Derived> 8702 OMPClause * 8703 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8704 llvm::SmallVector<Expr *, 16> Vars; 8705 Vars.reserve(C->varlist_size()); 8706 for (auto *VE : C->varlists()) { 8707 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8708 if (EVar.isInvalid()) 8709 return nullptr; 8710 Vars.push_back(EVar.get()); 8711 } 8712 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 8713 C->getLParenLoc(), C->getEndLoc()); 8714 } 8715 8716 template <typename Derived> 8717 OMPClause * 8718 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8719 llvm::SmallVector<Expr *, 16> Vars; 8720 Vars.reserve(C->varlist_size()); 8721 for (auto *VE : C->varlists()) { 8722 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8723 if (EVar.isInvalid()) 8724 return nullptr; 8725 Vars.push_back(EVar.get()); 8726 } 8727 return getDerived().RebuildOMPCopyprivateClause( 8728 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8729 } 8730 8731 template <typename Derived> 8732 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8733 llvm::SmallVector<Expr *, 16> Vars; 8734 Vars.reserve(C->varlist_size()); 8735 for (auto *VE : C->varlists()) { 8736 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8737 if (EVar.isInvalid()) 8738 return nullptr; 8739 Vars.push_back(EVar.get()); 8740 } 8741 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 8742 C->getLParenLoc(), C->getEndLoc()); 8743 } 8744 8745 template <typename Derived> 8746 OMPClause * 8747 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8748 llvm::SmallVector<Expr *, 16> Vars; 8749 Vars.reserve(C->varlist_size()); 8750 for (auto *VE : C->varlists()) { 8751 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8752 if (EVar.isInvalid()) 8753 return nullptr; 8754 Vars.push_back(EVar.get()); 8755 } 8756 return getDerived().RebuildOMPDependClause( 8757 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8758 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8759 } 8760 8761 template <typename Derived> 8762 OMPClause * 8763 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8764 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8765 if (E.isInvalid()) 8766 return nullptr; 8767 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 8768 C->getLParenLoc(), C->getEndLoc()); 8769 } 8770 8771 template <typename Derived> 8772 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8773 llvm::SmallVector<Expr *, 16> Vars; 8774 Vars.reserve(C->varlist_size()); 8775 for (auto *VE : C->varlists()) { 8776 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8777 if (EVar.isInvalid()) 8778 return nullptr; 8779 Vars.push_back(EVar.get()); 8780 } 8781 return getDerived().RebuildOMPMapClause( 8782 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8783 C->getMapLoc(), C->getColonLoc(), Vars, C->getBeginLoc(), 8784 C->getLParenLoc(), C->getEndLoc()); 8785 } 8786 8787 template <typename Derived> 8788 OMPClause * 8789 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8790 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8791 if (E.isInvalid()) 8792 return nullptr; 8793 return getDerived().RebuildOMPNumTeamsClause( 8794 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8795 } 8796 8797 template <typename Derived> 8798 OMPClause * 8799 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8800 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8801 if (E.isInvalid()) 8802 return nullptr; 8803 return getDerived().RebuildOMPThreadLimitClause( 8804 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8805 } 8806 8807 template <typename Derived> 8808 OMPClause * 8809 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8810 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8811 if (E.isInvalid()) 8812 return nullptr; 8813 return getDerived().RebuildOMPPriorityClause( 8814 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8815 } 8816 8817 template <typename Derived> 8818 OMPClause * 8819 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8820 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8821 if (E.isInvalid()) 8822 return nullptr; 8823 return getDerived().RebuildOMPGrainsizeClause( 8824 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8825 } 8826 8827 template <typename Derived> 8828 OMPClause * 8829 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8830 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8831 if (E.isInvalid()) 8832 return nullptr; 8833 return getDerived().RebuildOMPNumTasksClause( 8834 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8835 } 8836 8837 template <typename Derived> 8838 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8839 ExprResult E = getDerived().TransformExpr(C->getHint()); 8840 if (E.isInvalid()) 8841 return nullptr; 8842 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 8843 C->getLParenLoc(), C->getEndLoc()); 8844 } 8845 8846 template <typename Derived> 8847 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8848 OMPDistScheduleClause *C) { 8849 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8850 if (E.isInvalid()) 8851 return nullptr; 8852 return getDerived().RebuildOMPDistScheduleClause( 8853 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8854 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8855 } 8856 8857 template <typename Derived> 8858 OMPClause * 8859 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8860 return C; 8861 } 8862 8863 template <typename Derived> 8864 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8865 llvm::SmallVector<Expr *, 16> Vars; 8866 Vars.reserve(C->varlist_size()); 8867 for (auto *VE : C->varlists()) { 8868 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8869 if (EVar.isInvalid()) 8870 return 0; 8871 Vars.push_back(EVar.get()); 8872 } 8873 return getDerived().RebuildOMPToClause(Vars, C->getBeginLoc(), 8874 C->getLParenLoc(), C->getEndLoc()); 8875 } 8876 8877 template <typename Derived> 8878 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8879 llvm::SmallVector<Expr *, 16> Vars; 8880 Vars.reserve(C->varlist_size()); 8881 for (auto *VE : C->varlists()) { 8882 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8883 if (EVar.isInvalid()) 8884 return 0; 8885 Vars.push_back(EVar.get()); 8886 } 8887 return getDerived().RebuildOMPFromClause(Vars, C->getBeginLoc(), 8888 C->getLParenLoc(), C->getEndLoc()); 8889 } 8890 8891 template <typename Derived> 8892 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8893 OMPUseDevicePtrClause *C) { 8894 llvm::SmallVector<Expr *, 16> Vars; 8895 Vars.reserve(C->varlist_size()); 8896 for (auto *VE : C->varlists()) { 8897 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8898 if (EVar.isInvalid()) 8899 return nullptr; 8900 Vars.push_back(EVar.get()); 8901 } 8902 return getDerived().RebuildOMPUseDevicePtrClause( 8903 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8904 } 8905 8906 template <typename Derived> 8907 OMPClause * 8908 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8909 llvm::SmallVector<Expr *, 16> Vars; 8910 Vars.reserve(C->varlist_size()); 8911 for (auto *VE : C->varlists()) { 8912 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8913 if (EVar.isInvalid()) 8914 return nullptr; 8915 Vars.push_back(EVar.get()); 8916 } 8917 return getDerived().RebuildOMPIsDevicePtrClause( 8918 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8919 } 8920 8921 //===----------------------------------------------------------------------===// 8922 // Expression transformation 8923 //===----------------------------------------------------------------------===// 8924 template<typename Derived> 8925 ExprResult 8926 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 8927 return TransformExpr(E->getSubExpr()); 8928 } 8929 8930 template<typename Derived> 8931 ExprResult 8932 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8933 if (!E->isTypeDependent()) 8934 return E; 8935 8936 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8937 E->getIdentKind()); 8938 } 8939 8940 template<typename Derived> 8941 ExprResult 8942 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8943 NestedNameSpecifierLoc QualifierLoc; 8944 if (E->getQualifierLoc()) { 8945 QualifierLoc 8946 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8947 if (!QualifierLoc) 8948 return ExprError(); 8949 } 8950 8951 ValueDecl *ND 8952 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8953 E->getDecl())); 8954 if (!ND) 8955 return ExprError(); 8956 8957 DeclarationNameInfo NameInfo = E->getNameInfo(); 8958 if (NameInfo.getName()) { 8959 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8960 if (!NameInfo.getName()) 8961 return ExprError(); 8962 } 8963 8964 if (!getDerived().AlwaysRebuild() && 8965 QualifierLoc == E->getQualifierLoc() && 8966 ND == E->getDecl() && 8967 NameInfo.getName() == E->getDecl()->getDeclName() && 8968 !E->hasExplicitTemplateArgs()) { 8969 8970 // Mark it referenced in the new context regardless. 8971 // FIXME: this is a bit instantiation-specific. 8972 SemaRef.MarkDeclRefReferenced(E); 8973 8974 return E; 8975 } 8976 8977 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8978 if (E->hasExplicitTemplateArgs()) { 8979 TemplateArgs = &TransArgs; 8980 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8981 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8982 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8983 E->getNumTemplateArgs(), 8984 TransArgs)) 8985 return ExprError(); 8986 } 8987 8988 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8989 TemplateArgs); 8990 } 8991 8992 template<typename Derived> 8993 ExprResult 8994 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8995 return E; 8996 } 8997 8998 template <typename Derived> 8999 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9000 FixedPointLiteral *E) { 9001 return E; 9002 } 9003 9004 template<typename Derived> 9005 ExprResult 9006 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9007 return E; 9008 } 9009 9010 template<typename Derived> 9011 ExprResult 9012 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9013 return E; 9014 } 9015 9016 template<typename Derived> 9017 ExprResult 9018 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9019 return E; 9020 } 9021 9022 template<typename Derived> 9023 ExprResult 9024 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9025 return E; 9026 } 9027 9028 template<typename Derived> 9029 ExprResult 9030 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9031 if (FunctionDecl *FD = E->getDirectCallee()) 9032 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9033 return SemaRef.MaybeBindToTemporary(E); 9034 } 9035 9036 template<typename Derived> 9037 ExprResult 9038 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9039 ExprResult ControllingExpr = 9040 getDerived().TransformExpr(E->getControllingExpr()); 9041 if (ControllingExpr.isInvalid()) 9042 return ExprError(); 9043 9044 SmallVector<Expr *, 4> AssocExprs; 9045 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9046 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 9047 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 9048 if (TS) { 9049 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 9050 if (!AssocType) 9051 return ExprError(); 9052 AssocTypes.push_back(AssocType); 9053 } else { 9054 AssocTypes.push_back(nullptr); 9055 } 9056 9057 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 9058 if (AssocExpr.isInvalid()) 9059 return ExprError(); 9060 AssocExprs.push_back(AssocExpr.get()); 9061 } 9062 9063 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9064 E->getDefaultLoc(), 9065 E->getRParenLoc(), 9066 ControllingExpr.get(), 9067 AssocTypes, 9068 AssocExprs); 9069 } 9070 9071 template<typename Derived> 9072 ExprResult 9073 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9074 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9075 if (SubExpr.isInvalid()) 9076 return ExprError(); 9077 9078 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9079 return E; 9080 9081 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9082 E->getRParen()); 9083 } 9084 9085 /// The operand of a unary address-of operator has special rules: it's 9086 /// allowed to refer to a non-static member of a class even if there's no 'this' 9087 /// object available. 9088 template<typename Derived> 9089 ExprResult 9090 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9091 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9092 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9093 else 9094 return getDerived().TransformExpr(E); 9095 } 9096 9097 template<typename Derived> 9098 ExprResult 9099 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9100 ExprResult SubExpr; 9101 if (E->getOpcode() == UO_AddrOf) 9102 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9103 else 9104 SubExpr = TransformExpr(E->getSubExpr()); 9105 if (SubExpr.isInvalid()) 9106 return ExprError(); 9107 9108 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9109 return E; 9110 9111 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9112 E->getOpcode(), 9113 SubExpr.get()); 9114 } 9115 9116 template<typename Derived> 9117 ExprResult 9118 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9119 // Transform the type. 9120 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9121 if (!Type) 9122 return ExprError(); 9123 9124 // Transform all of the components into components similar to what the 9125 // parser uses. 9126 // FIXME: It would be slightly more efficient in the non-dependent case to 9127 // just map FieldDecls, rather than requiring the rebuilder to look for 9128 // the fields again. However, __builtin_offsetof is rare enough in 9129 // template code that we don't care. 9130 bool ExprChanged = false; 9131 typedef Sema::OffsetOfComponent Component; 9132 SmallVector<Component, 4> Components; 9133 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9134 const OffsetOfNode &ON = E->getComponent(I); 9135 Component Comp; 9136 Comp.isBrackets = true; 9137 Comp.LocStart = ON.getSourceRange().getBegin(); 9138 Comp.LocEnd = ON.getSourceRange().getEnd(); 9139 switch (ON.getKind()) { 9140 case OffsetOfNode::Array: { 9141 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9142 ExprResult Index = getDerived().TransformExpr(FromIndex); 9143 if (Index.isInvalid()) 9144 return ExprError(); 9145 9146 ExprChanged = ExprChanged || Index.get() != FromIndex; 9147 Comp.isBrackets = true; 9148 Comp.U.E = Index.get(); 9149 break; 9150 } 9151 9152 case OffsetOfNode::Field: 9153 case OffsetOfNode::Identifier: 9154 Comp.isBrackets = false; 9155 Comp.U.IdentInfo = ON.getFieldName(); 9156 if (!Comp.U.IdentInfo) 9157 continue; 9158 9159 break; 9160 9161 case OffsetOfNode::Base: 9162 // Will be recomputed during the rebuild. 9163 continue; 9164 } 9165 9166 Components.push_back(Comp); 9167 } 9168 9169 // If nothing changed, retain the existing expression. 9170 if (!getDerived().AlwaysRebuild() && 9171 Type == E->getTypeSourceInfo() && 9172 !ExprChanged) 9173 return E; 9174 9175 // Build a new offsetof expression. 9176 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9177 Components, E->getRParenLoc()); 9178 } 9179 9180 template<typename Derived> 9181 ExprResult 9182 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9183 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9184 "opaque value expression requires transformation"); 9185 return E; 9186 } 9187 9188 template<typename Derived> 9189 ExprResult 9190 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9191 return E; 9192 } 9193 9194 template<typename Derived> 9195 ExprResult 9196 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9197 // Rebuild the syntactic form. The original syntactic form has 9198 // opaque-value expressions in it, so strip those away and rebuild 9199 // the result. This is a really awful way of doing this, but the 9200 // better solution (rebuilding the semantic expressions and 9201 // rebinding OVEs as necessary) doesn't work; we'd need 9202 // TreeTransform to not strip away implicit conversions. 9203 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9204 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9205 if (result.isInvalid()) return ExprError(); 9206 9207 // If that gives us a pseudo-object result back, the pseudo-object 9208 // expression must have been an lvalue-to-rvalue conversion which we 9209 // should reapply. 9210 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9211 result = SemaRef.checkPseudoObjectRValue(result.get()); 9212 9213 return result; 9214 } 9215 9216 template<typename Derived> 9217 ExprResult 9218 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9219 UnaryExprOrTypeTraitExpr *E) { 9220 if (E->isArgumentType()) { 9221 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9222 9223 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9224 if (!NewT) 9225 return ExprError(); 9226 9227 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9228 return E; 9229 9230 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9231 E->getKind(), 9232 E->getSourceRange()); 9233 } 9234 9235 // C++0x [expr.sizeof]p1: 9236 // The operand is either an expression, which is an unevaluated operand 9237 // [...] 9238 EnterExpressionEvaluationContext Unevaluated( 9239 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9240 Sema::ReuseLambdaContextDecl); 9241 9242 // Try to recover if we have something like sizeof(T::X) where X is a type. 9243 // Notably, there must be *exactly* one set of parens if X is a type. 9244 TypeSourceInfo *RecoveryTSI = nullptr; 9245 ExprResult SubExpr; 9246 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9247 if (auto *DRE = 9248 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9249 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9250 PE, DRE, false, &RecoveryTSI); 9251 else 9252 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9253 9254 if (RecoveryTSI) { 9255 return getDerived().RebuildUnaryExprOrTypeTrait( 9256 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9257 } else if (SubExpr.isInvalid()) 9258 return ExprError(); 9259 9260 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9261 return E; 9262 9263 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9264 E->getOperatorLoc(), 9265 E->getKind(), 9266 E->getSourceRange()); 9267 } 9268 9269 template<typename Derived> 9270 ExprResult 9271 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9272 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9273 if (LHS.isInvalid()) 9274 return ExprError(); 9275 9276 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9277 if (RHS.isInvalid()) 9278 return ExprError(); 9279 9280 9281 if (!getDerived().AlwaysRebuild() && 9282 LHS.get() == E->getLHS() && 9283 RHS.get() == E->getRHS()) 9284 return E; 9285 9286 return getDerived().RebuildArraySubscriptExpr( 9287 LHS.get(), 9288 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9289 } 9290 9291 template <typename Derived> 9292 ExprResult 9293 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9294 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9295 if (Base.isInvalid()) 9296 return ExprError(); 9297 9298 ExprResult LowerBound; 9299 if (E->getLowerBound()) { 9300 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9301 if (LowerBound.isInvalid()) 9302 return ExprError(); 9303 } 9304 9305 ExprResult Length; 9306 if (E->getLength()) { 9307 Length = getDerived().TransformExpr(E->getLength()); 9308 if (Length.isInvalid()) 9309 return ExprError(); 9310 } 9311 9312 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9313 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9314 return E; 9315 9316 return getDerived().RebuildOMPArraySectionExpr( 9317 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9318 Length.get(), E->getRBracketLoc()); 9319 } 9320 9321 template<typename Derived> 9322 ExprResult 9323 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9324 // Transform the callee. 9325 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9326 if (Callee.isInvalid()) 9327 return ExprError(); 9328 9329 // Transform arguments. 9330 bool ArgChanged = false; 9331 SmallVector<Expr*, 8> Args; 9332 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9333 &ArgChanged)) 9334 return ExprError(); 9335 9336 if (!getDerived().AlwaysRebuild() && 9337 Callee.get() == E->getCallee() && 9338 !ArgChanged) 9339 return SemaRef.MaybeBindToTemporary(E); 9340 9341 // FIXME: Wrong source location information for the '('. 9342 SourceLocation FakeLParenLoc 9343 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9344 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9345 Args, 9346 E->getRParenLoc()); 9347 } 9348 9349 template<typename Derived> 9350 ExprResult 9351 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9352 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9353 if (Base.isInvalid()) 9354 return ExprError(); 9355 9356 NestedNameSpecifierLoc QualifierLoc; 9357 if (E->hasQualifier()) { 9358 QualifierLoc 9359 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9360 9361 if (!QualifierLoc) 9362 return ExprError(); 9363 } 9364 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9365 9366 ValueDecl *Member 9367 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9368 E->getMemberDecl())); 9369 if (!Member) 9370 return ExprError(); 9371 9372 NamedDecl *FoundDecl = E->getFoundDecl(); 9373 if (FoundDecl == E->getMemberDecl()) { 9374 FoundDecl = Member; 9375 } else { 9376 FoundDecl = cast_or_null<NamedDecl>( 9377 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9378 if (!FoundDecl) 9379 return ExprError(); 9380 } 9381 9382 if (!getDerived().AlwaysRebuild() && 9383 Base.get() == E->getBase() && 9384 QualifierLoc == E->getQualifierLoc() && 9385 Member == E->getMemberDecl() && 9386 FoundDecl == E->getFoundDecl() && 9387 !E->hasExplicitTemplateArgs()) { 9388 9389 // Mark it referenced in the new context regardless. 9390 // FIXME: this is a bit instantiation-specific. 9391 SemaRef.MarkMemberReferenced(E); 9392 9393 return E; 9394 } 9395 9396 TemplateArgumentListInfo TransArgs; 9397 if (E->hasExplicitTemplateArgs()) { 9398 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9399 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9400 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9401 E->getNumTemplateArgs(), 9402 TransArgs)) 9403 return ExprError(); 9404 } 9405 9406 // FIXME: Bogus source location for the operator 9407 SourceLocation FakeOperatorLoc = 9408 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9409 9410 // FIXME: to do this check properly, we will need to preserve the 9411 // first-qualifier-in-scope here, just in case we had a dependent 9412 // base (and therefore couldn't do the check) and a 9413 // nested-name-qualifier (and therefore could do the lookup). 9414 NamedDecl *FirstQualifierInScope = nullptr; 9415 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9416 if (MemberNameInfo.getName()) { 9417 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9418 if (!MemberNameInfo.getName()) 9419 return ExprError(); 9420 } 9421 9422 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9423 E->isArrow(), 9424 QualifierLoc, 9425 TemplateKWLoc, 9426 MemberNameInfo, 9427 Member, 9428 FoundDecl, 9429 (E->hasExplicitTemplateArgs() 9430 ? &TransArgs : nullptr), 9431 FirstQualifierInScope); 9432 } 9433 9434 template<typename Derived> 9435 ExprResult 9436 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9437 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9438 if (LHS.isInvalid()) 9439 return ExprError(); 9440 9441 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9442 if (RHS.isInvalid()) 9443 return ExprError(); 9444 9445 if (!getDerived().AlwaysRebuild() && 9446 LHS.get() == E->getLHS() && 9447 RHS.get() == E->getRHS()) 9448 return E; 9449 9450 Sema::FPContractStateRAII FPContractState(getSema()); 9451 getSema().FPFeatures = E->getFPFeatures(); 9452 9453 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9454 LHS.get(), RHS.get()); 9455 } 9456 9457 template<typename Derived> 9458 ExprResult 9459 TreeTransform<Derived>::TransformCompoundAssignOperator( 9460 CompoundAssignOperator *E) { 9461 return getDerived().TransformBinaryOperator(E); 9462 } 9463 9464 template<typename Derived> 9465 ExprResult TreeTransform<Derived>:: 9466 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9467 // Just rebuild the common and RHS expressions and see whether we 9468 // get any changes. 9469 9470 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9471 if (commonExpr.isInvalid()) 9472 return ExprError(); 9473 9474 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9475 if (rhs.isInvalid()) 9476 return ExprError(); 9477 9478 if (!getDerived().AlwaysRebuild() && 9479 commonExpr.get() == e->getCommon() && 9480 rhs.get() == e->getFalseExpr()) 9481 return e; 9482 9483 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9484 e->getQuestionLoc(), 9485 nullptr, 9486 e->getColonLoc(), 9487 rhs.get()); 9488 } 9489 9490 template<typename Derived> 9491 ExprResult 9492 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9493 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9494 if (Cond.isInvalid()) 9495 return ExprError(); 9496 9497 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9498 if (LHS.isInvalid()) 9499 return ExprError(); 9500 9501 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9502 if (RHS.isInvalid()) 9503 return ExprError(); 9504 9505 if (!getDerived().AlwaysRebuild() && 9506 Cond.get() == E->getCond() && 9507 LHS.get() == E->getLHS() && 9508 RHS.get() == E->getRHS()) 9509 return E; 9510 9511 return getDerived().RebuildConditionalOperator(Cond.get(), 9512 E->getQuestionLoc(), 9513 LHS.get(), 9514 E->getColonLoc(), 9515 RHS.get()); 9516 } 9517 9518 template<typename Derived> 9519 ExprResult 9520 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9521 // Implicit casts are eliminated during transformation, since they 9522 // will be recomputed by semantic analysis after transformation. 9523 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9524 } 9525 9526 template<typename Derived> 9527 ExprResult 9528 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9529 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9530 if (!Type) 9531 return ExprError(); 9532 9533 ExprResult SubExpr 9534 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9535 if (SubExpr.isInvalid()) 9536 return ExprError(); 9537 9538 if (!getDerived().AlwaysRebuild() && 9539 Type == E->getTypeInfoAsWritten() && 9540 SubExpr.get() == E->getSubExpr()) 9541 return E; 9542 9543 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9544 Type, 9545 E->getRParenLoc(), 9546 SubExpr.get()); 9547 } 9548 9549 template<typename Derived> 9550 ExprResult 9551 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9552 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9553 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9554 if (!NewT) 9555 return ExprError(); 9556 9557 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9558 if (Init.isInvalid()) 9559 return ExprError(); 9560 9561 if (!getDerived().AlwaysRebuild() && 9562 OldT == NewT && 9563 Init.get() == E->getInitializer()) 9564 return SemaRef.MaybeBindToTemporary(E); 9565 9566 // Note: the expression type doesn't necessarily match the 9567 // type-as-written, but that's okay, because it should always be 9568 // derivable from the initializer. 9569 9570 return getDerived().RebuildCompoundLiteralExpr( 9571 E->getLParenLoc(), NewT, 9572 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 9573 } 9574 9575 template<typename Derived> 9576 ExprResult 9577 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9578 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9579 if (Base.isInvalid()) 9580 return ExprError(); 9581 9582 if (!getDerived().AlwaysRebuild() && 9583 Base.get() == E->getBase()) 9584 return E; 9585 9586 // FIXME: Bad source location 9587 SourceLocation FakeOperatorLoc = 9588 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 9589 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9590 E->getAccessorLoc(), 9591 E->getAccessor()); 9592 } 9593 9594 template<typename Derived> 9595 ExprResult 9596 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9597 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9598 E = Syntactic; 9599 9600 bool InitChanged = false; 9601 9602 EnterExpressionEvaluationContext Context( 9603 getSema(), EnterExpressionEvaluationContext::InitList); 9604 9605 SmallVector<Expr*, 4> Inits; 9606 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9607 Inits, &InitChanged)) 9608 return ExprError(); 9609 9610 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9611 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9612 // in some cases. We can't reuse it in general, because the syntactic and 9613 // semantic forms are linked, and we can't know that semantic form will 9614 // match even if the syntactic form does. 9615 } 9616 9617 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9618 E->getRBraceLoc()); 9619 } 9620 9621 template<typename Derived> 9622 ExprResult 9623 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9624 Designation Desig; 9625 9626 // transform the initializer value 9627 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9628 if (Init.isInvalid()) 9629 return ExprError(); 9630 9631 // transform the designators. 9632 SmallVector<Expr*, 4> ArrayExprs; 9633 bool ExprChanged = false; 9634 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9635 if (D.isFieldDesignator()) { 9636 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9637 D.getDotLoc(), 9638 D.getFieldLoc())); 9639 if (D.getField()) { 9640 FieldDecl *Field = cast_or_null<FieldDecl>( 9641 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9642 if (Field != D.getField()) 9643 // Rebuild the expression when the transformed FieldDecl is 9644 // different to the already assigned FieldDecl. 9645 ExprChanged = true; 9646 } else { 9647 // Ensure that the designator expression is rebuilt when there isn't 9648 // a resolved FieldDecl in the designator as we don't want to assign 9649 // a FieldDecl to a pattern designator that will be instantiated again. 9650 ExprChanged = true; 9651 } 9652 continue; 9653 } 9654 9655 if (D.isArrayDesignator()) { 9656 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9657 if (Index.isInvalid()) 9658 return ExprError(); 9659 9660 Desig.AddDesignator( 9661 Designator::getArray(Index.get(), D.getLBracketLoc())); 9662 9663 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9664 ArrayExprs.push_back(Index.get()); 9665 continue; 9666 } 9667 9668 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9669 ExprResult Start 9670 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9671 if (Start.isInvalid()) 9672 return ExprError(); 9673 9674 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9675 if (End.isInvalid()) 9676 return ExprError(); 9677 9678 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9679 End.get(), 9680 D.getLBracketLoc(), 9681 D.getEllipsisLoc())); 9682 9683 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9684 End.get() != E->getArrayRangeEnd(D); 9685 9686 ArrayExprs.push_back(Start.get()); 9687 ArrayExprs.push_back(End.get()); 9688 } 9689 9690 if (!getDerived().AlwaysRebuild() && 9691 Init.get() == E->getInit() && 9692 !ExprChanged) 9693 return E; 9694 9695 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9696 E->getEqualOrColonLoc(), 9697 E->usesGNUSyntax(), Init.get()); 9698 } 9699 9700 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9701 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9702 template<typename Derived> 9703 ExprResult 9704 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9705 DesignatedInitUpdateExpr *E) { 9706 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9707 "initializer"); 9708 return ExprError(); 9709 } 9710 9711 template<typename Derived> 9712 ExprResult 9713 TreeTransform<Derived>::TransformNoInitExpr( 9714 NoInitExpr *E) { 9715 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9716 return ExprError(); 9717 } 9718 9719 template<typename Derived> 9720 ExprResult 9721 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9722 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9723 return ExprError(); 9724 } 9725 9726 template<typename Derived> 9727 ExprResult 9728 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9729 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9730 return ExprError(); 9731 } 9732 9733 template<typename Derived> 9734 ExprResult 9735 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9736 ImplicitValueInitExpr *E) { 9737 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 9738 9739 // FIXME: Will we ever have proper type location here? Will we actually 9740 // need to transform the type? 9741 QualType T = getDerived().TransformType(E->getType()); 9742 if (T.isNull()) 9743 return ExprError(); 9744 9745 if (!getDerived().AlwaysRebuild() && 9746 T == E->getType()) 9747 return E; 9748 9749 return getDerived().RebuildImplicitValueInitExpr(T); 9750 } 9751 9752 template<typename Derived> 9753 ExprResult 9754 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9755 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9756 if (!TInfo) 9757 return ExprError(); 9758 9759 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9760 if (SubExpr.isInvalid()) 9761 return ExprError(); 9762 9763 if (!getDerived().AlwaysRebuild() && 9764 TInfo == E->getWrittenTypeInfo() && 9765 SubExpr.get() == E->getSubExpr()) 9766 return E; 9767 9768 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9769 TInfo, E->getRParenLoc()); 9770 } 9771 9772 template<typename Derived> 9773 ExprResult 9774 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9775 bool ArgumentChanged = false; 9776 SmallVector<Expr*, 4> Inits; 9777 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9778 &ArgumentChanged)) 9779 return ExprError(); 9780 9781 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9782 Inits, 9783 E->getRParenLoc()); 9784 } 9785 9786 /// Transform an address-of-label expression. 9787 /// 9788 /// By default, the transformation of an address-of-label expression always 9789 /// rebuilds the expression, so that the label identifier can be resolved to 9790 /// the corresponding label statement by semantic analysis. 9791 template<typename Derived> 9792 ExprResult 9793 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9794 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9795 E->getLabel()); 9796 if (!LD) 9797 return ExprError(); 9798 9799 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9800 cast<LabelDecl>(LD)); 9801 } 9802 9803 template<typename Derived> 9804 ExprResult 9805 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9806 SemaRef.ActOnStartStmtExpr(); 9807 StmtResult SubStmt 9808 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9809 if (SubStmt.isInvalid()) { 9810 SemaRef.ActOnStmtExprError(); 9811 return ExprError(); 9812 } 9813 9814 if (!getDerived().AlwaysRebuild() && 9815 SubStmt.get() == E->getSubStmt()) { 9816 // Calling this an 'error' is unintuitive, but it does the right thing. 9817 SemaRef.ActOnStmtExprError(); 9818 return SemaRef.MaybeBindToTemporary(E); 9819 } 9820 9821 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9822 SubStmt.get(), 9823 E->getRParenLoc()); 9824 } 9825 9826 template<typename Derived> 9827 ExprResult 9828 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9829 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9830 if (Cond.isInvalid()) 9831 return ExprError(); 9832 9833 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9834 if (LHS.isInvalid()) 9835 return ExprError(); 9836 9837 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9838 if (RHS.isInvalid()) 9839 return ExprError(); 9840 9841 if (!getDerived().AlwaysRebuild() && 9842 Cond.get() == E->getCond() && 9843 LHS.get() == E->getLHS() && 9844 RHS.get() == E->getRHS()) 9845 return E; 9846 9847 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9848 Cond.get(), LHS.get(), RHS.get(), 9849 E->getRParenLoc()); 9850 } 9851 9852 template<typename Derived> 9853 ExprResult 9854 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9855 return E; 9856 } 9857 9858 template<typename Derived> 9859 ExprResult 9860 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9861 switch (E->getOperator()) { 9862 case OO_New: 9863 case OO_Delete: 9864 case OO_Array_New: 9865 case OO_Array_Delete: 9866 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9867 9868 case OO_Call: { 9869 // This is a call to an object's operator(). 9870 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9871 9872 // Transform the object itself. 9873 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9874 if (Object.isInvalid()) 9875 return ExprError(); 9876 9877 // FIXME: Poor location information 9878 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9879 static_cast<Expr *>(Object.get())->getEndLoc()); 9880 9881 // Transform the call arguments. 9882 SmallVector<Expr*, 8> Args; 9883 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9884 Args)) 9885 return ExprError(); 9886 9887 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 9888 E->getEndLoc()); 9889 } 9890 9891 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9892 case OO_##Name: 9893 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9894 #include "clang/Basic/OperatorKinds.def" 9895 case OO_Subscript: 9896 // Handled below. 9897 break; 9898 9899 case OO_Conditional: 9900 llvm_unreachable("conditional operator is not actually overloadable"); 9901 9902 case OO_None: 9903 case NUM_OVERLOADED_OPERATORS: 9904 llvm_unreachable("not an overloaded operator?"); 9905 } 9906 9907 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9908 if (Callee.isInvalid()) 9909 return ExprError(); 9910 9911 ExprResult First; 9912 if (E->getOperator() == OO_Amp) 9913 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9914 else 9915 First = getDerived().TransformExpr(E->getArg(0)); 9916 if (First.isInvalid()) 9917 return ExprError(); 9918 9919 ExprResult Second; 9920 if (E->getNumArgs() == 2) { 9921 Second = getDerived().TransformExpr(E->getArg(1)); 9922 if (Second.isInvalid()) 9923 return ExprError(); 9924 } 9925 9926 if (!getDerived().AlwaysRebuild() && 9927 Callee.get() == E->getCallee() && 9928 First.get() == E->getArg(0) && 9929 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9930 return SemaRef.MaybeBindToTemporary(E); 9931 9932 Sema::FPContractStateRAII FPContractState(getSema()); 9933 getSema().FPFeatures = E->getFPFeatures(); 9934 9935 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9936 E->getOperatorLoc(), 9937 Callee.get(), 9938 First.get(), 9939 Second.get()); 9940 } 9941 9942 template<typename Derived> 9943 ExprResult 9944 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9945 return getDerived().TransformCallExpr(E); 9946 } 9947 9948 template<typename Derived> 9949 ExprResult 9950 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9951 // Transform the callee. 9952 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9953 if (Callee.isInvalid()) 9954 return ExprError(); 9955 9956 // Transform exec config. 9957 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9958 if (EC.isInvalid()) 9959 return ExprError(); 9960 9961 // Transform arguments. 9962 bool ArgChanged = false; 9963 SmallVector<Expr*, 8> Args; 9964 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9965 &ArgChanged)) 9966 return ExprError(); 9967 9968 if (!getDerived().AlwaysRebuild() && 9969 Callee.get() == E->getCallee() && 9970 !ArgChanged) 9971 return SemaRef.MaybeBindToTemporary(E); 9972 9973 // FIXME: Wrong source location information for the '('. 9974 SourceLocation FakeLParenLoc 9975 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9976 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9977 Args, 9978 E->getRParenLoc(), EC.get()); 9979 } 9980 9981 template<typename Derived> 9982 ExprResult 9983 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9984 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9985 if (!Type) 9986 return ExprError(); 9987 9988 ExprResult SubExpr 9989 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9990 if (SubExpr.isInvalid()) 9991 return ExprError(); 9992 9993 if (!getDerived().AlwaysRebuild() && 9994 Type == E->getTypeInfoAsWritten() && 9995 SubExpr.get() == E->getSubExpr()) 9996 return E; 9997 return getDerived().RebuildCXXNamedCastExpr( 9998 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9999 Type, E->getAngleBrackets().getEnd(), 10000 // FIXME. this should be '(' location 10001 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10002 } 10003 10004 template<typename Derived> 10005 ExprResult 10006 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10007 return getDerived().TransformCXXNamedCastExpr(E); 10008 } 10009 10010 template<typename Derived> 10011 ExprResult 10012 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10013 return getDerived().TransformCXXNamedCastExpr(E); 10014 } 10015 10016 template<typename Derived> 10017 ExprResult 10018 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10019 CXXReinterpretCastExpr *E) { 10020 return getDerived().TransformCXXNamedCastExpr(E); 10021 } 10022 10023 template<typename Derived> 10024 ExprResult 10025 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10026 return getDerived().TransformCXXNamedCastExpr(E); 10027 } 10028 10029 template<typename Derived> 10030 ExprResult 10031 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10032 CXXFunctionalCastExpr *E) { 10033 TypeSourceInfo *Type = 10034 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10035 if (!Type) 10036 return ExprError(); 10037 10038 ExprResult SubExpr 10039 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10040 if (SubExpr.isInvalid()) 10041 return ExprError(); 10042 10043 if (!getDerived().AlwaysRebuild() && 10044 Type == E->getTypeInfoAsWritten() && 10045 SubExpr.get() == E->getSubExpr()) 10046 return E; 10047 10048 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10049 E->getLParenLoc(), 10050 SubExpr.get(), 10051 E->getRParenLoc(), 10052 E->isListInitialization()); 10053 } 10054 10055 template<typename Derived> 10056 ExprResult 10057 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10058 if (E->isTypeOperand()) { 10059 TypeSourceInfo *TInfo 10060 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10061 if (!TInfo) 10062 return ExprError(); 10063 10064 if (!getDerived().AlwaysRebuild() && 10065 TInfo == E->getTypeOperandSourceInfo()) 10066 return E; 10067 10068 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10069 TInfo, E->getEndLoc()); 10070 } 10071 10072 // We don't know whether the subexpression is potentially evaluated until 10073 // after we perform semantic analysis. We speculatively assume it is 10074 // unevaluated; it will get fixed later if the subexpression is in fact 10075 // potentially evaluated. 10076 EnterExpressionEvaluationContext Unevaluated( 10077 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10078 Sema::ReuseLambdaContextDecl); 10079 10080 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10081 if (SubExpr.isInvalid()) 10082 return ExprError(); 10083 10084 if (!getDerived().AlwaysRebuild() && 10085 SubExpr.get() == E->getExprOperand()) 10086 return E; 10087 10088 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10089 SubExpr.get(), E->getEndLoc()); 10090 } 10091 10092 template<typename Derived> 10093 ExprResult 10094 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10095 if (E->isTypeOperand()) { 10096 TypeSourceInfo *TInfo 10097 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10098 if (!TInfo) 10099 return ExprError(); 10100 10101 if (!getDerived().AlwaysRebuild() && 10102 TInfo == E->getTypeOperandSourceInfo()) 10103 return E; 10104 10105 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10106 TInfo, E->getEndLoc()); 10107 } 10108 10109 EnterExpressionEvaluationContext Unevaluated( 10110 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10111 10112 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10113 if (SubExpr.isInvalid()) 10114 return ExprError(); 10115 10116 if (!getDerived().AlwaysRebuild() && 10117 SubExpr.get() == E->getExprOperand()) 10118 return E; 10119 10120 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10121 SubExpr.get(), E->getEndLoc()); 10122 } 10123 10124 template<typename Derived> 10125 ExprResult 10126 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10127 return E; 10128 } 10129 10130 template<typename Derived> 10131 ExprResult 10132 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10133 CXXNullPtrLiteralExpr *E) { 10134 return E; 10135 } 10136 10137 template<typename Derived> 10138 ExprResult 10139 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10140 QualType T = getSema().getCurrentThisType(); 10141 10142 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10143 // Make sure that we capture 'this'. 10144 getSema().CheckCXXThisCapture(E->getBeginLoc()); 10145 return E; 10146 } 10147 10148 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10149 } 10150 10151 template<typename Derived> 10152 ExprResult 10153 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10154 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10155 if (SubExpr.isInvalid()) 10156 return ExprError(); 10157 10158 if (!getDerived().AlwaysRebuild() && 10159 SubExpr.get() == E->getSubExpr()) 10160 return E; 10161 10162 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10163 E->isThrownVariableInScope()); 10164 } 10165 10166 template<typename Derived> 10167 ExprResult 10168 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10169 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10170 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10171 if (!Param) 10172 return ExprError(); 10173 10174 if (!getDerived().AlwaysRebuild() && 10175 Param == E->getParam()) 10176 return E; 10177 10178 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10179 } 10180 10181 template<typename Derived> 10182 ExprResult 10183 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10184 FieldDecl *Field = cast_or_null<FieldDecl>( 10185 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10186 if (!Field) 10187 return ExprError(); 10188 10189 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10190 return E; 10191 10192 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10193 } 10194 10195 template<typename Derived> 10196 ExprResult 10197 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10198 CXXScalarValueInitExpr *E) { 10199 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10200 if (!T) 10201 return ExprError(); 10202 10203 if (!getDerived().AlwaysRebuild() && 10204 T == E->getTypeSourceInfo()) 10205 return E; 10206 10207 return getDerived().RebuildCXXScalarValueInitExpr(T, 10208 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10209 E->getRParenLoc()); 10210 } 10211 10212 template<typename Derived> 10213 ExprResult 10214 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10215 // Transform the type that we're allocating 10216 TypeSourceInfo *AllocTypeInfo = 10217 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10218 if (!AllocTypeInfo) 10219 return ExprError(); 10220 10221 // Transform the size of the array we're allocating (if any). 10222 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10223 if (ArraySize.isInvalid()) 10224 return ExprError(); 10225 10226 // Transform the placement arguments (if any). 10227 bool ArgumentChanged = false; 10228 SmallVector<Expr*, 8> PlacementArgs; 10229 if (getDerived().TransformExprs(E->getPlacementArgs(), 10230 E->getNumPlacementArgs(), true, 10231 PlacementArgs, &ArgumentChanged)) 10232 return ExprError(); 10233 10234 // Transform the initializer (if any). 10235 Expr *OldInit = E->getInitializer(); 10236 ExprResult NewInit; 10237 if (OldInit) 10238 NewInit = getDerived().TransformInitializer(OldInit, true); 10239 if (NewInit.isInvalid()) 10240 return ExprError(); 10241 10242 // Transform new operator and delete operator. 10243 FunctionDecl *OperatorNew = nullptr; 10244 if (E->getOperatorNew()) { 10245 OperatorNew = cast_or_null<FunctionDecl>( 10246 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10247 if (!OperatorNew) 10248 return ExprError(); 10249 } 10250 10251 FunctionDecl *OperatorDelete = nullptr; 10252 if (E->getOperatorDelete()) { 10253 OperatorDelete = cast_or_null<FunctionDecl>( 10254 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10255 if (!OperatorDelete) 10256 return ExprError(); 10257 } 10258 10259 if (!getDerived().AlwaysRebuild() && 10260 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10261 ArraySize.get() == E->getArraySize() && 10262 NewInit.get() == OldInit && 10263 OperatorNew == E->getOperatorNew() && 10264 OperatorDelete == E->getOperatorDelete() && 10265 !ArgumentChanged) { 10266 // Mark any declarations we need as referenced. 10267 // FIXME: instantiation-specific. 10268 if (OperatorNew) 10269 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10270 if (OperatorDelete) 10271 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10272 10273 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10274 QualType ElementType 10275 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10276 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10277 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10278 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10279 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10280 } 10281 } 10282 } 10283 10284 return E; 10285 } 10286 10287 QualType AllocType = AllocTypeInfo->getType(); 10288 if (!ArraySize.get()) { 10289 // If no array size was specified, but the new expression was 10290 // instantiated with an array type (e.g., "new T" where T is 10291 // instantiated with "int[4]"), extract the outer bound from the 10292 // array type as our array size. We do this with constant and 10293 // dependently-sized array types. 10294 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10295 if (!ArrayT) { 10296 // Do nothing 10297 } else if (const ConstantArrayType *ConsArrayT 10298 = dyn_cast<ConstantArrayType>(ArrayT)) { 10299 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10300 SemaRef.Context.getSizeType(), 10301 /*FIXME:*/ E->getBeginLoc()); 10302 AllocType = ConsArrayT->getElementType(); 10303 } else if (const DependentSizedArrayType *DepArrayT 10304 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10305 if (DepArrayT->getSizeExpr()) { 10306 ArraySize = DepArrayT->getSizeExpr(); 10307 AllocType = DepArrayT->getElementType(); 10308 } 10309 } 10310 } 10311 10312 return getDerived().RebuildCXXNewExpr( 10313 E->getBeginLoc(), E->isGlobalNew(), 10314 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10315 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10316 AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get()); 10317 } 10318 10319 template<typename Derived> 10320 ExprResult 10321 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10322 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10323 if (Operand.isInvalid()) 10324 return ExprError(); 10325 10326 // Transform the delete operator, if known. 10327 FunctionDecl *OperatorDelete = nullptr; 10328 if (E->getOperatorDelete()) { 10329 OperatorDelete = cast_or_null<FunctionDecl>( 10330 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10331 if (!OperatorDelete) 10332 return ExprError(); 10333 } 10334 10335 if (!getDerived().AlwaysRebuild() && 10336 Operand.get() == E->getArgument() && 10337 OperatorDelete == E->getOperatorDelete()) { 10338 // Mark any declarations we need as referenced. 10339 // FIXME: instantiation-specific. 10340 if (OperatorDelete) 10341 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10342 10343 if (!E->getArgument()->isTypeDependent()) { 10344 QualType Destroyed = SemaRef.Context.getBaseElementType( 10345 E->getDestroyedType()); 10346 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10347 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10348 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10349 SemaRef.LookupDestructor(Record)); 10350 } 10351 } 10352 10353 return E; 10354 } 10355 10356 return getDerived().RebuildCXXDeleteExpr( 10357 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10358 } 10359 10360 template<typename Derived> 10361 ExprResult 10362 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10363 CXXPseudoDestructorExpr *E) { 10364 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10365 if (Base.isInvalid()) 10366 return ExprError(); 10367 10368 ParsedType ObjectTypePtr; 10369 bool MayBePseudoDestructor = false; 10370 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10371 E->getOperatorLoc(), 10372 E->isArrow()? tok::arrow : tok::period, 10373 ObjectTypePtr, 10374 MayBePseudoDestructor); 10375 if (Base.isInvalid()) 10376 return ExprError(); 10377 10378 QualType ObjectType = ObjectTypePtr.get(); 10379 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10380 if (QualifierLoc) { 10381 QualifierLoc 10382 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10383 if (!QualifierLoc) 10384 return ExprError(); 10385 } 10386 CXXScopeSpec SS; 10387 SS.Adopt(QualifierLoc); 10388 10389 PseudoDestructorTypeStorage Destroyed; 10390 if (E->getDestroyedTypeInfo()) { 10391 TypeSourceInfo *DestroyedTypeInfo 10392 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10393 ObjectType, nullptr, SS); 10394 if (!DestroyedTypeInfo) 10395 return ExprError(); 10396 Destroyed = DestroyedTypeInfo; 10397 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10398 // We aren't likely to be able to resolve the identifier down to a type 10399 // now anyway, so just retain the identifier. 10400 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10401 E->getDestroyedTypeLoc()); 10402 } else { 10403 // Look for a destructor known with the given name. 10404 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10405 *E->getDestroyedTypeIdentifier(), 10406 E->getDestroyedTypeLoc(), 10407 /*Scope=*/nullptr, 10408 SS, ObjectTypePtr, 10409 false); 10410 if (!T) 10411 return ExprError(); 10412 10413 Destroyed 10414 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10415 E->getDestroyedTypeLoc()); 10416 } 10417 10418 TypeSourceInfo *ScopeTypeInfo = nullptr; 10419 if (E->getScopeTypeInfo()) { 10420 CXXScopeSpec EmptySS; 10421 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10422 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10423 if (!ScopeTypeInfo) 10424 return ExprError(); 10425 } 10426 10427 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10428 E->getOperatorLoc(), 10429 E->isArrow(), 10430 SS, 10431 ScopeTypeInfo, 10432 E->getColonColonLoc(), 10433 E->getTildeLoc(), 10434 Destroyed); 10435 } 10436 10437 template <typename Derived> 10438 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10439 bool RequiresADL, 10440 LookupResult &R) { 10441 // Transform all the decls. 10442 bool AllEmptyPacks = true; 10443 for (auto *OldD : Old->decls()) { 10444 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10445 if (!InstD) { 10446 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10447 // This can happen because of dependent hiding. 10448 if (isa<UsingShadowDecl>(OldD)) 10449 continue; 10450 else { 10451 R.clear(); 10452 return true; 10453 } 10454 } 10455 10456 // Expand using pack declarations. 10457 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10458 ArrayRef<NamedDecl*> Decls = SingleDecl; 10459 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10460 Decls = UPD->expansions(); 10461 10462 // Expand using declarations. 10463 for (auto *D : Decls) { 10464 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10465 for (auto *SD : UD->shadows()) 10466 R.addDecl(SD); 10467 } else { 10468 R.addDecl(D); 10469 } 10470 } 10471 10472 AllEmptyPacks &= Decls.empty(); 10473 }; 10474 10475 // C++ [temp.res]/8.4.2: 10476 // The program is ill-formed, no diagnostic required, if [...] lookup for 10477 // a name in the template definition found a using-declaration, but the 10478 // lookup in the corresponding scope in the instantiation odoes not find 10479 // any declarations because the using-declaration was a pack expansion and 10480 // the corresponding pack is empty 10481 if (AllEmptyPacks && !RequiresADL) { 10482 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10483 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10484 return true; 10485 } 10486 10487 // Resolve a kind, but don't do any further analysis. If it's 10488 // ambiguous, the callee needs to deal with it. 10489 R.resolveKind(); 10490 return false; 10491 } 10492 10493 template<typename Derived> 10494 ExprResult 10495 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10496 UnresolvedLookupExpr *Old) { 10497 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10498 Sema::LookupOrdinaryName); 10499 10500 // Transform the declaration set. 10501 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10502 return ExprError(); 10503 10504 // Rebuild the nested-name qualifier, if present. 10505 CXXScopeSpec SS; 10506 if (Old->getQualifierLoc()) { 10507 NestedNameSpecifierLoc QualifierLoc 10508 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10509 if (!QualifierLoc) 10510 return ExprError(); 10511 10512 SS.Adopt(QualifierLoc); 10513 } 10514 10515 if (Old->getNamingClass()) { 10516 CXXRecordDecl *NamingClass 10517 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10518 Old->getNameLoc(), 10519 Old->getNamingClass())); 10520 if (!NamingClass) { 10521 R.clear(); 10522 return ExprError(); 10523 } 10524 10525 R.setNamingClass(NamingClass); 10526 } 10527 10528 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10529 10530 // If we have neither explicit template arguments, nor the template keyword, 10531 // it's a normal declaration name or member reference. 10532 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10533 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10534 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10535 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10536 // give a good diagnostic. 10537 if (D && D->isCXXInstanceMember()) { 10538 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10539 /*TemplateArgs=*/nullptr, 10540 /*Scope=*/nullptr); 10541 } 10542 10543 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10544 } 10545 10546 // If we have template arguments, rebuild them, then rebuild the 10547 // templateid expression. 10548 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10549 if (Old->hasExplicitTemplateArgs() && 10550 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10551 Old->getNumTemplateArgs(), 10552 TransArgs)) { 10553 R.clear(); 10554 return ExprError(); 10555 } 10556 10557 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10558 Old->requiresADL(), &TransArgs); 10559 } 10560 10561 template<typename Derived> 10562 ExprResult 10563 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10564 bool ArgChanged = false; 10565 SmallVector<TypeSourceInfo *, 4> Args; 10566 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10567 TypeSourceInfo *From = E->getArg(I); 10568 TypeLoc FromTL = From->getTypeLoc(); 10569 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10570 TypeLocBuilder TLB; 10571 TLB.reserve(FromTL.getFullDataSize()); 10572 QualType To = getDerived().TransformType(TLB, FromTL); 10573 if (To.isNull()) 10574 return ExprError(); 10575 10576 if (To == From->getType()) 10577 Args.push_back(From); 10578 else { 10579 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10580 ArgChanged = true; 10581 } 10582 continue; 10583 } 10584 10585 ArgChanged = true; 10586 10587 // We have a pack expansion. Instantiate it. 10588 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10589 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10590 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10591 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10592 10593 // Determine whether the set of unexpanded parameter packs can and should 10594 // be expanded. 10595 bool Expand = true; 10596 bool RetainExpansion = false; 10597 Optional<unsigned> OrigNumExpansions = 10598 ExpansionTL.getTypePtr()->getNumExpansions(); 10599 Optional<unsigned> NumExpansions = OrigNumExpansions; 10600 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10601 PatternTL.getSourceRange(), 10602 Unexpanded, 10603 Expand, RetainExpansion, 10604 NumExpansions)) 10605 return ExprError(); 10606 10607 if (!Expand) { 10608 // The transform has determined that we should perform a simple 10609 // transformation on the pack expansion, producing another pack 10610 // expansion. 10611 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10612 10613 TypeLocBuilder TLB; 10614 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10615 10616 QualType To = getDerived().TransformType(TLB, PatternTL); 10617 if (To.isNull()) 10618 return ExprError(); 10619 10620 To = getDerived().RebuildPackExpansionType(To, 10621 PatternTL.getSourceRange(), 10622 ExpansionTL.getEllipsisLoc(), 10623 NumExpansions); 10624 if (To.isNull()) 10625 return ExprError(); 10626 10627 PackExpansionTypeLoc ToExpansionTL 10628 = TLB.push<PackExpansionTypeLoc>(To); 10629 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10630 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10631 continue; 10632 } 10633 10634 // Expand the pack expansion by substituting for each argument in the 10635 // pack(s). 10636 for (unsigned I = 0; I != *NumExpansions; ++I) { 10637 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10638 TypeLocBuilder TLB; 10639 TLB.reserve(PatternTL.getFullDataSize()); 10640 QualType To = getDerived().TransformType(TLB, PatternTL); 10641 if (To.isNull()) 10642 return ExprError(); 10643 10644 if (To->containsUnexpandedParameterPack()) { 10645 To = getDerived().RebuildPackExpansionType(To, 10646 PatternTL.getSourceRange(), 10647 ExpansionTL.getEllipsisLoc(), 10648 NumExpansions); 10649 if (To.isNull()) 10650 return ExprError(); 10651 10652 PackExpansionTypeLoc ToExpansionTL 10653 = TLB.push<PackExpansionTypeLoc>(To); 10654 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10655 } 10656 10657 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10658 } 10659 10660 if (!RetainExpansion) 10661 continue; 10662 10663 // If we're supposed to retain a pack expansion, do so by temporarily 10664 // forgetting the partially-substituted parameter pack. 10665 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10666 10667 TypeLocBuilder TLB; 10668 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10669 10670 QualType To = getDerived().TransformType(TLB, PatternTL); 10671 if (To.isNull()) 10672 return ExprError(); 10673 10674 To = getDerived().RebuildPackExpansionType(To, 10675 PatternTL.getSourceRange(), 10676 ExpansionTL.getEllipsisLoc(), 10677 NumExpansions); 10678 if (To.isNull()) 10679 return ExprError(); 10680 10681 PackExpansionTypeLoc ToExpansionTL 10682 = TLB.push<PackExpansionTypeLoc>(To); 10683 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10684 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10685 } 10686 10687 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10688 return E; 10689 10690 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 10691 E->getEndLoc()); 10692 } 10693 10694 template<typename Derived> 10695 ExprResult 10696 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10697 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10698 if (!T) 10699 return ExprError(); 10700 10701 if (!getDerived().AlwaysRebuild() && 10702 T == E->getQueriedTypeSourceInfo()) 10703 return E; 10704 10705 ExprResult SubExpr; 10706 { 10707 EnterExpressionEvaluationContext Unevaluated( 10708 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10709 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10710 if (SubExpr.isInvalid()) 10711 return ExprError(); 10712 10713 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10714 return E; 10715 } 10716 10717 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 10718 SubExpr.get(), E->getEndLoc()); 10719 } 10720 10721 template<typename Derived> 10722 ExprResult 10723 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10724 ExprResult SubExpr; 10725 { 10726 EnterExpressionEvaluationContext Unevaluated( 10727 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10728 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10729 if (SubExpr.isInvalid()) 10730 return ExprError(); 10731 10732 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10733 return E; 10734 } 10735 10736 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 10737 SubExpr.get(), E->getEndLoc()); 10738 } 10739 10740 template <typename Derived> 10741 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10742 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10743 TypeSourceInfo **RecoveryTSI) { 10744 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10745 DRE, AddrTaken, RecoveryTSI); 10746 10747 // Propagate both errors and recovered types, which return ExprEmpty. 10748 if (!NewDRE.isUsable()) 10749 return NewDRE; 10750 10751 // We got an expr, wrap it up in parens. 10752 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10753 return PE; 10754 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10755 PE->getRParen()); 10756 } 10757 10758 template <typename Derived> 10759 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10760 DependentScopeDeclRefExpr *E) { 10761 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10762 nullptr); 10763 } 10764 10765 template<typename Derived> 10766 ExprResult 10767 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10768 DependentScopeDeclRefExpr *E, 10769 bool IsAddressOfOperand, 10770 TypeSourceInfo **RecoveryTSI) { 10771 assert(E->getQualifierLoc()); 10772 NestedNameSpecifierLoc QualifierLoc 10773 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10774 if (!QualifierLoc) 10775 return ExprError(); 10776 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10777 10778 // TODO: If this is a conversion-function-id, verify that the 10779 // destination type name (if present) resolves the same way after 10780 // instantiation as it did in the local scope. 10781 10782 DeclarationNameInfo NameInfo 10783 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10784 if (!NameInfo.getName()) 10785 return ExprError(); 10786 10787 if (!E->hasExplicitTemplateArgs()) { 10788 if (!getDerived().AlwaysRebuild() && 10789 QualifierLoc == E->getQualifierLoc() && 10790 // Note: it is sufficient to compare the Name component of NameInfo: 10791 // if name has not changed, DNLoc has not changed either. 10792 NameInfo.getName() == E->getDeclName()) 10793 return E; 10794 10795 return getDerived().RebuildDependentScopeDeclRefExpr( 10796 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10797 IsAddressOfOperand, RecoveryTSI); 10798 } 10799 10800 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10801 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10802 E->getNumTemplateArgs(), 10803 TransArgs)) 10804 return ExprError(); 10805 10806 return getDerived().RebuildDependentScopeDeclRefExpr( 10807 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10808 RecoveryTSI); 10809 } 10810 10811 template<typename Derived> 10812 ExprResult 10813 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10814 // CXXConstructExprs other than for list-initialization and 10815 // CXXTemporaryObjectExpr are always implicit, so when we have 10816 // a 1-argument construction we just transform that argument. 10817 if ((E->getNumArgs() == 1 || 10818 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10819 (!getDerived().DropCallArgument(E->getArg(0))) && 10820 !E->isListInitialization()) 10821 return getDerived().TransformExpr(E->getArg(0)); 10822 10823 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 10824 10825 QualType T = getDerived().TransformType(E->getType()); 10826 if (T.isNull()) 10827 return ExprError(); 10828 10829 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10830 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10831 if (!Constructor) 10832 return ExprError(); 10833 10834 bool ArgumentChanged = false; 10835 SmallVector<Expr*, 8> Args; 10836 { 10837 EnterExpressionEvaluationContext Context( 10838 getSema(), EnterExpressionEvaluationContext::InitList, 10839 E->isListInitialization()); 10840 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10841 &ArgumentChanged)) 10842 return ExprError(); 10843 } 10844 10845 if (!getDerived().AlwaysRebuild() && 10846 T == E->getType() && 10847 Constructor == E->getConstructor() && 10848 !ArgumentChanged) { 10849 // Mark the constructor as referenced. 10850 // FIXME: Instantiation-specific 10851 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10852 return E; 10853 } 10854 10855 return getDerived().RebuildCXXConstructExpr( 10856 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 10857 E->hadMultipleCandidates(), E->isListInitialization(), 10858 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 10859 E->getConstructionKind(), E->getParenOrBraceRange()); 10860 } 10861 10862 template<typename Derived> 10863 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10864 CXXInheritedCtorInitExpr *E) { 10865 QualType T = getDerived().TransformType(E->getType()); 10866 if (T.isNull()) 10867 return ExprError(); 10868 10869 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10870 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10871 if (!Constructor) 10872 return ExprError(); 10873 10874 if (!getDerived().AlwaysRebuild() && 10875 T == E->getType() && 10876 Constructor == E->getConstructor()) { 10877 // Mark the constructor as referenced. 10878 // FIXME: Instantiation-specific 10879 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10880 return E; 10881 } 10882 10883 return getDerived().RebuildCXXInheritedCtorInitExpr( 10884 T, E->getLocation(), Constructor, 10885 E->constructsVBase(), E->inheritedFromVBase()); 10886 } 10887 10888 /// Transform a C++ temporary-binding expression. 10889 /// 10890 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10891 /// transform the subexpression and return that. 10892 template<typename Derived> 10893 ExprResult 10894 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10895 return getDerived().TransformExpr(E->getSubExpr()); 10896 } 10897 10898 /// Transform a C++ expression that contains cleanups that should 10899 /// be run after the expression is evaluated. 10900 /// 10901 /// Since ExprWithCleanups nodes are implicitly generated, we 10902 /// just transform the subexpression and return that. 10903 template<typename Derived> 10904 ExprResult 10905 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10906 return getDerived().TransformExpr(E->getSubExpr()); 10907 } 10908 10909 template<typename Derived> 10910 ExprResult 10911 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10912 CXXTemporaryObjectExpr *E) { 10913 TypeSourceInfo *T = 10914 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10915 if (!T) 10916 return ExprError(); 10917 10918 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10919 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 10920 if (!Constructor) 10921 return ExprError(); 10922 10923 bool ArgumentChanged = false; 10924 SmallVector<Expr*, 8> Args; 10925 Args.reserve(E->getNumArgs()); 10926 { 10927 EnterExpressionEvaluationContext Context( 10928 getSema(), EnterExpressionEvaluationContext::InitList, 10929 E->isListInitialization()); 10930 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10931 &ArgumentChanged)) 10932 return ExprError(); 10933 } 10934 10935 if (!getDerived().AlwaysRebuild() && 10936 T == E->getTypeSourceInfo() && 10937 Constructor == E->getConstructor() && 10938 !ArgumentChanged) { 10939 // FIXME: Instantiation-specific 10940 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 10941 return SemaRef.MaybeBindToTemporary(E); 10942 } 10943 10944 // FIXME: We should just pass E->isListInitialization(), but we're not 10945 // prepared to handle list-initialization without a child InitListExpr. 10946 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 10947 return getDerived().RebuildCXXTemporaryObjectExpr( 10948 T, LParenLoc, Args, E->getEndLoc(), 10949 /*ListInitialization=*/LParenLoc.isInvalid()); 10950 } 10951 10952 template<typename Derived> 10953 ExprResult 10954 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10955 // Transform any init-capture expressions before entering the scope of the 10956 // lambda body, because they are not semantically within that scope. 10957 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10958 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10959 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10960 E->explicit_capture_begin()); 10961 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10962 CEnd = E->capture_end(); 10963 C != CEnd; ++C) { 10964 if (!E->isInitCapture(C)) 10965 continue; 10966 EnterExpressionEvaluationContext EEEC( 10967 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10968 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10969 C->getCapturedVar()->getInit(), 10970 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10971 10972 if (NewExprInitResult.isInvalid()) 10973 return ExprError(); 10974 Expr *NewExprInit = NewExprInitResult.get(); 10975 10976 VarDecl *OldVD = C->getCapturedVar(); 10977 QualType NewInitCaptureType = 10978 getSema().buildLambdaInitCaptureInitialization( 10979 C->getLocation(), OldVD->getType()->isReferenceType(), 10980 OldVD->getIdentifier(), 10981 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10982 NewExprInitResult = NewExprInit; 10983 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10984 std::make_pair(NewExprInitResult, NewInitCaptureType); 10985 } 10986 10987 // Transform the template parameters, and add them to the current 10988 // instantiation scope. The null case is handled correctly. 10989 auto TPL = getDerived().TransformTemplateParameterList( 10990 E->getTemplateParameterList()); 10991 10992 // Transform the type of the original lambda's call operator. 10993 // The transformation MUST be done in the CurrentInstantiationScope since 10994 // it introduces a mapping of the original to the newly created 10995 // transformed parameters. 10996 TypeSourceInfo *NewCallOpTSI = nullptr; 10997 { 10998 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10999 FunctionProtoTypeLoc OldCallOpFPTL = 11000 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11001 11002 TypeLocBuilder NewCallOpTLBuilder; 11003 SmallVector<QualType, 4> ExceptionStorage; 11004 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11005 QualType NewCallOpType = TransformFunctionProtoType( 11006 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 11007 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11008 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11009 ExceptionStorage, Changed); 11010 }); 11011 if (NewCallOpType.isNull()) 11012 return ExprError(); 11013 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11014 NewCallOpType); 11015 } 11016 11017 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11018 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11019 LSI->GLTemplateParameterList = TPL; 11020 11021 // Create the local class that will describe the lambda. 11022 CXXRecordDecl *Class 11023 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11024 NewCallOpTSI, 11025 /*KnownDependent=*/false, 11026 E->getCaptureDefault()); 11027 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 11028 11029 // Build the call operator. 11030 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11031 Class, E->getIntroducerRange(), NewCallOpTSI, 11032 E->getCallOperator()->getEndLoc(), 11033 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11034 E->getCallOperator()->isConstexpr()); 11035 11036 LSI->CallOperator = NewCallOperator; 11037 11038 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11039 I != NumParams; ++I) { 11040 auto *P = NewCallOperator->getParamDecl(I); 11041 if (P->hasUninstantiatedDefaultArg()) { 11042 EnterExpressionEvaluationContext Eval( 11043 getSema(), 11044 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11045 ExprResult R = getDerived().TransformExpr( 11046 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11047 P->setDefaultArg(R.get()); 11048 } 11049 } 11050 11051 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11052 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 11053 11054 // Introduce the context of the call operator. 11055 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11056 /*NewThisContext*/false); 11057 11058 // Enter the scope of the lambda. 11059 getSema().buildLambdaScope(LSI, NewCallOperator, 11060 E->getIntroducerRange(), 11061 E->getCaptureDefault(), 11062 E->getCaptureDefaultLoc(), 11063 E->hasExplicitParameters(), 11064 E->hasExplicitResultType(), 11065 E->isMutable()); 11066 11067 bool Invalid = false; 11068 11069 // Transform captures. 11070 bool FinishedExplicitCaptures = false; 11071 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11072 CEnd = E->capture_end(); 11073 C != CEnd; ++C) { 11074 // When we hit the first implicit capture, tell Sema that we've finished 11075 // the list of explicit captures. 11076 if (!FinishedExplicitCaptures && C->isImplicit()) { 11077 getSema().finishLambdaExplicitCaptures(LSI); 11078 FinishedExplicitCaptures = true; 11079 } 11080 11081 // Capturing 'this' is trivial. 11082 if (C->capturesThis()) { 11083 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11084 /*BuildAndDiagnose*/ true, nullptr, 11085 C->getCaptureKind() == LCK_StarThis); 11086 continue; 11087 } 11088 // Captured expression will be recaptured during captured variables 11089 // rebuilding. 11090 if (C->capturesVLAType()) 11091 continue; 11092 11093 // Rebuild init-captures, including the implied field declaration. 11094 if (E->isInitCapture(C)) { 11095 InitCaptureInfoTy InitExprTypePair = 11096 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11097 ExprResult Init = InitExprTypePair.first; 11098 QualType InitQualType = InitExprTypePair.second; 11099 if (Init.isInvalid() || InitQualType.isNull()) { 11100 Invalid = true; 11101 continue; 11102 } 11103 VarDecl *OldVD = C->getCapturedVar(); 11104 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11105 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11106 OldVD->getInitStyle(), Init.get()); 11107 if (!NewVD) 11108 Invalid = true; 11109 else { 11110 getDerived().transformedLocalDecl(OldVD, NewVD); 11111 } 11112 getSema().buildInitCaptureField(LSI, NewVD); 11113 continue; 11114 } 11115 11116 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11117 11118 // Determine the capture kind for Sema. 11119 Sema::TryCaptureKind Kind 11120 = C->isImplicit()? Sema::TryCapture_Implicit 11121 : C->getCaptureKind() == LCK_ByCopy 11122 ? Sema::TryCapture_ExplicitByVal 11123 : Sema::TryCapture_ExplicitByRef; 11124 SourceLocation EllipsisLoc; 11125 if (C->isPackExpansion()) { 11126 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11127 bool ShouldExpand = false; 11128 bool RetainExpansion = false; 11129 Optional<unsigned> NumExpansions; 11130 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11131 C->getLocation(), 11132 Unexpanded, 11133 ShouldExpand, RetainExpansion, 11134 NumExpansions)) { 11135 Invalid = true; 11136 continue; 11137 } 11138 11139 if (ShouldExpand) { 11140 // The transform has determined that we should perform an expansion; 11141 // transform and capture each of the arguments. 11142 // expansion of the pattern. Do so. 11143 VarDecl *Pack = C->getCapturedVar(); 11144 for (unsigned I = 0; I != *NumExpansions; ++I) { 11145 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11146 VarDecl *CapturedVar 11147 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11148 Pack)); 11149 if (!CapturedVar) { 11150 Invalid = true; 11151 continue; 11152 } 11153 11154 // Capture the transformed variable. 11155 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11156 } 11157 11158 // FIXME: Retain a pack expansion if RetainExpansion is true. 11159 11160 continue; 11161 } 11162 11163 EllipsisLoc = C->getEllipsisLoc(); 11164 } 11165 11166 // Transform the captured variable. 11167 VarDecl *CapturedVar 11168 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11169 C->getCapturedVar())); 11170 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11171 Invalid = true; 11172 continue; 11173 } 11174 11175 // Capture the transformed variable. 11176 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11177 EllipsisLoc); 11178 } 11179 if (!FinishedExplicitCaptures) 11180 getSema().finishLambdaExplicitCaptures(LSI); 11181 11182 // Enter a new evaluation context to insulate the lambda from any 11183 // cleanups from the enclosing full-expression. 11184 getSema().PushExpressionEvaluationContext( 11185 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11186 11187 // Instantiate the body of the lambda expression. 11188 StmtResult Body = 11189 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11190 11191 // ActOnLambda* will pop the function scope for us. 11192 FuncScopeCleanup.disable(); 11193 11194 if (Body.isInvalid()) { 11195 SavedContext.pop(); 11196 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11197 /*IsInstantiation=*/true); 11198 return ExprError(); 11199 } 11200 11201 // Copy the LSI before ActOnFinishFunctionBody removes it. 11202 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11203 // the call operator. 11204 auto LSICopy = *LSI; 11205 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11206 /*IsInstantiation*/ true); 11207 SavedContext.pop(); 11208 11209 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 11210 &LSICopy); 11211 } 11212 11213 template<typename Derived> 11214 ExprResult 11215 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11216 CXXUnresolvedConstructExpr *E) { 11217 TypeSourceInfo *T = 11218 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11219 if (!T) 11220 return ExprError(); 11221 11222 bool ArgumentChanged = false; 11223 SmallVector<Expr*, 8> Args; 11224 Args.reserve(E->arg_size()); 11225 { 11226 EnterExpressionEvaluationContext Context( 11227 getSema(), EnterExpressionEvaluationContext::InitList, 11228 E->isListInitialization()); 11229 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11230 &ArgumentChanged)) 11231 return ExprError(); 11232 } 11233 11234 if (!getDerived().AlwaysRebuild() && 11235 T == E->getTypeSourceInfo() && 11236 !ArgumentChanged) 11237 return E; 11238 11239 // FIXME: we're faking the locations of the commas 11240 return getDerived().RebuildCXXUnresolvedConstructExpr( 11241 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11242 } 11243 11244 template<typename Derived> 11245 ExprResult 11246 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11247 CXXDependentScopeMemberExpr *E) { 11248 // Transform the base of the expression. 11249 ExprResult Base((Expr*) nullptr); 11250 Expr *OldBase; 11251 QualType BaseType; 11252 QualType ObjectType; 11253 if (!E->isImplicitAccess()) { 11254 OldBase = E->getBase(); 11255 Base = getDerived().TransformExpr(OldBase); 11256 if (Base.isInvalid()) 11257 return ExprError(); 11258 11259 // Start the member reference and compute the object's type. 11260 ParsedType ObjectTy; 11261 bool MayBePseudoDestructor = false; 11262 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11263 E->getOperatorLoc(), 11264 E->isArrow()? tok::arrow : tok::period, 11265 ObjectTy, 11266 MayBePseudoDestructor); 11267 if (Base.isInvalid()) 11268 return ExprError(); 11269 11270 ObjectType = ObjectTy.get(); 11271 BaseType = ((Expr*) Base.get())->getType(); 11272 } else { 11273 OldBase = nullptr; 11274 BaseType = getDerived().TransformType(E->getBaseType()); 11275 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11276 } 11277 11278 // Transform the first part of the nested-name-specifier that qualifies 11279 // the member name. 11280 NamedDecl *FirstQualifierInScope 11281 = getDerived().TransformFirstQualifierInScope( 11282 E->getFirstQualifierFoundInScope(), 11283 E->getQualifierLoc().getBeginLoc()); 11284 11285 NestedNameSpecifierLoc QualifierLoc; 11286 if (E->getQualifier()) { 11287 QualifierLoc 11288 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11289 ObjectType, 11290 FirstQualifierInScope); 11291 if (!QualifierLoc) 11292 return ExprError(); 11293 } 11294 11295 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11296 11297 // TODO: If this is a conversion-function-id, verify that the 11298 // destination type name (if present) resolves the same way after 11299 // instantiation as it did in the local scope. 11300 11301 DeclarationNameInfo NameInfo 11302 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11303 if (!NameInfo.getName()) 11304 return ExprError(); 11305 11306 if (!E->hasExplicitTemplateArgs()) { 11307 // This is a reference to a member without an explicitly-specified 11308 // template argument list. Optimize for this common case. 11309 if (!getDerived().AlwaysRebuild() && 11310 Base.get() == OldBase && 11311 BaseType == E->getBaseType() && 11312 QualifierLoc == E->getQualifierLoc() && 11313 NameInfo.getName() == E->getMember() && 11314 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11315 return E; 11316 11317 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11318 BaseType, 11319 E->isArrow(), 11320 E->getOperatorLoc(), 11321 QualifierLoc, 11322 TemplateKWLoc, 11323 FirstQualifierInScope, 11324 NameInfo, 11325 /*TemplateArgs*/nullptr); 11326 } 11327 11328 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11329 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11330 E->getNumTemplateArgs(), 11331 TransArgs)) 11332 return ExprError(); 11333 11334 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11335 BaseType, 11336 E->isArrow(), 11337 E->getOperatorLoc(), 11338 QualifierLoc, 11339 TemplateKWLoc, 11340 FirstQualifierInScope, 11341 NameInfo, 11342 &TransArgs); 11343 } 11344 11345 template<typename Derived> 11346 ExprResult 11347 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11348 // Transform the base of the expression. 11349 ExprResult Base((Expr*) nullptr); 11350 QualType BaseType; 11351 if (!Old->isImplicitAccess()) { 11352 Base = getDerived().TransformExpr(Old->getBase()); 11353 if (Base.isInvalid()) 11354 return ExprError(); 11355 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11356 Old->isArrow()); 11357 if (Base.isInvalid()) 11358 return ExprError(); 11359 BaseType = Base.get()->getType(); 11360 } else { 11361 BaseType = getDerived().TransformType(Old->getBaseType()); 11362 } 11363 11364 NestedNameSpecifierLoc QualifierLoc; 11365 if (Old->getQualifierLoc()) { 11366 QualifierLoc 11367 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11368 if (!QualifierLoc) 11369 return ExprError(); 11370 } 11371 11372 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11373 11374 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11375 Sema::LookupOrdinaryName); 11376 11377 // Transform the declaration set. 11378 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11379 return ExprError(); 11380 11381 // Determine the naming class. 11382 if (Old->getNamingClass()) { 11383 CXXRecordDecl *NamingClass 11384 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11385 Old->getMemberLoc(), 11386 Old->getNamingClass())); 11387 if (!NamingClass) 11388 return ExprError(); 11389 11390 R.setNamingClass(NamingClass); 11391 } 11392 11393 TemplateArgumentListInfo TransArgs; 11394 if (Old->hasExplicitTemplateArgs()) { 11395 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11396 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11397 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11398 Old->getNumTemplateArgs(), 11399 TransArgs)) 11400 return ExprError(); 11401 } 11402 11403 // FIXME: to do this check properly, we will need to preserve the 11404 // first-qualifier-in-scope here, just in case we had a dependent 11405 // base (and therefore couldn't do the check) and a 11406 // nested-name-qualifier (and therefore could do the lookup). 11407 NamedDecl *FirstQualifierInScope = nullptr; 11408 11409 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11410 BaseType, 11411 Old->getOperatorLoc(), 11412 Old->isArrow(), 11413 QualifierLoc, 11414 TemplateKWLoc, 11415 FirstQualifierInScope, 11416 R, 11417 (Old->hasExplicitTemplateArgs() 11418 ? &TransArgs : nullptr)); 11419 } 11420 11421 template<typename Derived> 11422 ExprResult 11423 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11424 EnterExpressionEvaluationContext Unevaluated( 11425 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11426 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11427 if (SubExpr.isInvalid()) 11428 return ExprError(); 11429 11430 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11431 return E; 11432 11433 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11434 } 11435 11436 template<typename Derived> 11437 ExprResult 11438 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11439 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11440 if (Pattern.isInvalid()) 11441 return ExprError(); 11442 11443 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11444 return E; 11445 11446 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11447 E->getNumExpansions()); 11448 } 11449 11450 template<typename Derived> 11451 ExprResult 11452 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11453 // If E is not value-dependent, then nothing will change when we transform it. 11454 // Note: This is an instantiation-centric view. 11455 if (!E->isValueDependent()) 11456 return E; 11457 11458 EnterExpressionEvaluationContext Unevaluated( 11459 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11460 11461 ArrayRef<TemplateArgument> PackArgs; 11462 TemplateArgument ArgStorage; 11463 11464 // Find the argument list to transform. 11465 if (E->isPartiallySubstituted()) { 11466 PackArgs = E->getPartialArguments(); 11467 } else if (E->isValueDependent()) { 11468 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11469 bool ShouldExpand = false; 11470 bool RetainExpansion = false; 11471 Optional<unsigned> NumExpansions; 11472 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11473 Unexpanded, 11474 ShouldExpand, RetainExpansion, 11475 NumExpansions)) 11476 return ExprError(); 11477 11478 // If we need to expand the pack, build a template argument from it and 11479 // expand that. 11480 if (ShouldExpand) { 11481 auto *Pack = E->getPack(); 11482 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11483 ArgStorage = getSema().Context.getPackExpansionType( 11484 getSema().Context.getTypeDeclType(TTPD), None); 11485 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11486 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11487 } else { 11488 auto *VD = cast<ValueDecl>(Pack); 11489 ExprResult DRE = getSema().BuildDeclRefExpr( 11490 VD, VD->getType().getNonLValueExprType(getSema().Context), 11491 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11492 E->getPackLoc()); 11493 if (DRE.isInvalid()) 11494 return ExprError(); 11495 ArgStorage = new (getSema().Context) PackExpansionExpr( 11496 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11497 } 11498 PackArgs = ArgStorage; 11499 } 11500 } 11501 11502 // If we're not expanding the pack, just transform the decl. 11503 if (!PackArgs.size()) { 11504 auto *Pack = cast_or_null<NamedDecl>( 11505 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11506 if (!Pack) 11507 return ExprError(); 11508 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11509 E->getPackLoc(), 11510 E->getRParenLoc(), None, None); 11511 } 11512 11513 // Try to compute the result without performing a partial substitution. 11514 Optional<unsigned> Result = 0; 11515 for (const TemplateArgument &Arg : PackArgs) { 11516 if (!Arg.isPackExpansion()) { 11517 Result = *Result + 1; 11518 continue; 11519 } 11520 11521 TemplateArgumentLoc ArgLoc; 11522 InventTemplateArgumentLoc(Arg, ArgLoc); 11523 11524 // Find the pattern of the pack expansion. 11525 SourceLocation Ellipsis; 11526 Optional<unsigned> OrigNumExpansions; 11527 TemplateArgumentLoc Pattern = 11528 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11529 OrigNumExpansions); 11530 11531 // Substitute under the pack expansion. Do not expand the pack (yet). 11532 TemplateArgumentLoc OutPattern; 11533 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11534 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11535 /*Uneval*/ true)) 11536 return true; 11537 11538 // See if we can determine the number of arguments from the result. 11539 Optional<unsigned> NumExpansions = 11540 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11541 if (!NumExpansions) { 11542 // No: we must be in an alias template expansion, and we're going to need 11543 // to actually expand the packs. 11544 Result = None; 11545 break; 11546 } 11547 11548 Result = *Result + *NumExpansions; 11549 } 11550 11551 // Common case: we could determine the number of expansions without 11552 // substituting. 11553 if (Result) 11554 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11555 E->getPackLoc(), 11556 E->getRParenLoc(), *Result, None); 11557 11558 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11559 E->getPackLoc()); 11560 { 11561 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11562 typedef TemplateArgumentLocInventIterator< 11563 Derived, const TemplateArgument*> PackLocIterator; 11564 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11565 PackLocIterator(*this, PackArgs.end()), 11566 TransformedPackArgs, /*Uneval*/true)) 11567 return ExprError(); 11568 } 11569 11570 // Check whether we managed to fully-expand the pack. 11571 // FIXME: Is it possible for us to do so and not hit the early exit path? 11572 SmallVector<TemplateArgument, 8> Args; 11573 bool PartialSubstitution = false; 11574 for (auto &Loc : TransformedPackArgs.arguments()) { 11575 Args.push_back(Loc.getArgument()); 11576 if (Loc.getArgument().isPackExpansion()) 11577 PartialSubstitution = true; 11578 } 11579 11580 if (PartialSubstitution) 11581 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11582 E->getPackLoc(), 11583 E->getRParenLoc(), None, Args); 11584 11585 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11586 E->getPackLoc(), E->getRParenLoc(), 11587 Args.size(), None); 11588 } 11589 11590 template<typename Derived> 11591 ExprResult 11592 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11593 SubstNonTypeTemplateParmPackExpr *E) { 11594 // Default behavior is to do nothing with this transformation. 11595 return E; 11596 } 11597 11598 template<typename Derived> 11599 ExprResult 11600 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11601 SubstNonTypeTemplateParmExpr *E) { 11602 // Default behavior is to do nothing with this transformation. 11603 return E; 11604 } 11605 11606 template<typename Derived> 11607 ExprResult 11608 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11609 // Default behavior is to do nothing with this transformation. 11610 return E; 11611 } 11612 11613 template<typename Derived> 11614 ExprResult 11615 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11616 MaterializeTemporaryExpr *E) { 11617 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11618 } 11619 11620 template<typename Derived> 11621 ExprResult 11622 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11623 Expr *Pattern = E->getPattern(); 11624 11625 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11626 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11627 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11628 11629 // Determine whether the set of unexpanded parameter packs can and should 11630 // be expanded. 11631 bool Expand = true; 11632 bool RetainExpansion = false; 11633 Optional<unsigned> NumExpansions; 11634 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11635 Pattern->getSourceRange(), 11636 Unexpanded, 11637 Expand, RetainExpansion, 11638 NumExpansions)) 11639 return true; 11640 11641 if (!Expand) { 11642 // Do not expand any packs here, just transform and rebuild a fold 11643 // expression. 11644 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11645 11646 ExprResult LHS = 11647 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11648 if (LHS.isInvalid()) 11649 return true; 11650 11651 ExprResult RHS = 11652 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11653 if (RHS.isInvalid()) 11654 return true; 11655 11656 if (!getDerived().AlwaysRebuild() && 11657 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11658 return E; 11659 11660 return getDerived().RebuildCXXFoldExpr( 11661 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11662 RHS.get(), E->getEndLoc()); 11663 } 11664 11665 // The transform has determined that we should perform an elementwise 11666 // expansion of the pattern. Do so. 11667 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11668 if (Result.isInvalid()) 11669 return true; 11670 bool LeftFold = E->isLeftFold(); 11671 11672 // If we're retaining an expansion for a right fold, it is the innermost 11673 // component and takes the init (if any). 11674 if (!LeftFold && RetainExpansion) { 11675 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11676 11677 ExprResult Out = getDerived().TransformExpr(Pattern); 11678 if (Out.isInvalid()) 11679 return true; 11680 11681 Result = getDerived().RebuildCXXFoldExpr( 11682 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11683 Result.get(), E->getEndLoc()); 11684 if (Result.isInvalid()) 11685 return true; 11686 } 11687 11688 for (unsigned I = 0; I != *NumExpansions; ++I) { 11689 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11690 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11691 ExprResult Out = getDerived().TransformExpr(Pattern); 11692 if (Out.isInvalid()) 11693 return true; 11694 11695 if (Out.get()->containsUnexpandedParameterPack()) { 11696 // We still have a pack; retain a pack expansion for this slice. 11697 Result = getDerived().RebuildCXXFoldExpr( 11698 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 11699 E->getOperator(), E->getEllipsisLoc(), 11700 LeftFold ? Out.get() : Result.get(), E->getEndLoc()); 11701 } else if (Result.isUsable()) { 11702 // We've got down to a single element; build a binary operator. 11703 Result = getDerived().RebuildBinaryOperator( 11704 E->getEllipsisLoc(), E->getOperator(), 11705 LeftFold ? Result.get() : Out.get(), 11706 LeftFold ? Out.get() : Result.get()); 11707 } else 11708 Result = Out; 11709 11710 if (Result.isInvalid()) 11711 return true; 11712 } 11713 11714 // If we're retaining an expansion for a left fold, it is the outermost 11715 // component and takes the complete expansion so far as its init (if any). 11716 if (LeftFold && RetainExpansion) { 11717 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11718 11719 ExprResult Out = getDerived().TransformExpr(Pattern); 11720 if (Out.isInvalid()) 11721 return true; 11722 11723 Result = getDerived().RebuildCXXFoldExpr( 11724 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 11725 Out.get(), E->getEndLoc()); 11726 if (Result.isInvalid()) 11727 return true; 11728 } 11729 11730 // If we had no init and an empty pack, and we're not retaining an expansion, 11731 // then produce a fallback value or error. 11732 if (Result.isUnset()) 11733 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11734 E->getOperator()); 11735 11736 return Result; 11737 } 11738 11739 template<typename Derived> 11740 ExprResult 11741 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11742 CXXStdInitializerListExpr *E) { 11743 return getDerived().TransformExpr(E->getSubExpr()); 11744 } 11745 11746 template<typename Derived> 11747 ExprResult 11748 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11749 return SemaRef.MaybeBindToTemporary(E); 11750 } 11751 11752 template<typename Derived> 11753 ExprResult 11754 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11755 return E; 11756 } 11757 11758 template<typename Derived> 11759 ExprResult 11760 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11761 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11762 if (SubExpr.isInvalid()) 11763 return ExprError(); 11764 11765 if (!getDerived().AlwaysRebuild() && 11766 SubExpr.get() == E->getSubExpr()) 11767 return E; 11768 11769 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11770 } 11771 11772 template<typename Derived> 11773 ExprResult 11774 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11775 // Transform each of the elements. 11776 SmallVector<Expr *, 8> Elements; 11777 bool ArgChanged = false; 11778 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11779 /*IsCall=*/false, Elements, &ArgChanged)) 11780 return ExprError(); 11781 11782 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11783 return SemaRef.MaybeBindToTemporary(E); 11784 11785 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11786 Elements.data(), 11787 Elements.size()); 11788 } 11789 11790 template<typename Derived> 11791 ExprResult 11792 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11793 ObjCDictionaryLiteral *E) { 11794 // Transform each of the elements. 11795 SmallVector<ObjCDictionaryElement, 8> Elements; 11796 bool ArgChanged = false; 11797 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11798 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11799 11800 if (OrigElement.isPackExpansion()) { 11801 // This key/value element is a pack expansion. 11802 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11803 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11804 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11805 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11806 11807 // Determine whether the set of unexpanded parameter packs can 11808 // and should be expanded. 11809 bool Expand = true; 11810 bool RetainExpansion = false; 11811 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11812 Optional<unsigned> NumExpansions = OrigNumExpansions; 11813 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 11814 OrigElement.Value->getEndLoc()); 11815 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11816 PatternRange, Unexpanded, Expand, 11817 RetainExpansion, NumExpansions)) 11818 return ExprError(); 11819 11820 if (!Expand) { 11821 // The transform has determined that we should perform a simple 11822 // transformation on the pack expansion, producing another pack 11823 // expansion. 11824 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11825 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11826 if (Key.isInvalid()) 11827 return ExprError(); 11828 11829 if (Key.get() != OrigElement.Key) 11830 ArgChanged = true; 11831 11832 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11833 if (Value.isInvalid()) 11834 return ExprError(); 11835 11836 if (Value.get() != OrigElement.Value) 11837 ArgChanged = true; 11838 11839 ObjCDictionaryElement Expansion = { 11840 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11841 }; 11842 Elements.push_back(Expansion); 11843 continue; 11844 } 11845 11846 // Record right away that the argument was changed. This needs 11847 // to happen even if the array expands to nothing. 11848 ArgChanged = true; 11849 11850 // The transform has determined that we should perform an elementwise 11851 // expansion of the pattern. Do so. 11852 for (unsigned I = 0; I != *NumExpansions; ++I) { 11853 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11854 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11855 if (Key.isInvalid()) 11856 return ExprError(); 11857 11858 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11859 if (Value.isInvalid()) 11860 return ExprError(); 11861 11862 ObjCDictionaryElement Element = { 11863 Key.get(), Value.get(), SourceLocation(), NumExpansions 11864 }; 11865 11866 // If any unexpanded parameter packs remain, we still have a 11867 // pack expansion. 11868 // FIXME: Can this really happen? 11869 if (Key.get()->containsUnexpandedParameterPack() || 11870 Value.get()->containsUnexpandedParameterPack()) 11871 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11872 11873 Elements.push_back(Element); 11874 } 11875 11876 // FIXME: Retain a pack expansion if RetainExpansion is true. 11877 11878 // We've finished with this pack expansion. 11879 continue; 11880 } 11881 11882 // Transform and check key. 11883 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11884 if (Key.isInvalid()) 11885 return ExprError(); 11886 11887 if (Key.get() != OrigElement.Key) 11888 ArgChanged = true; 11889 11890 // Transform and check value. 11891 ExprResult Value 11892 = getDerived().TransformExpr(OrigElement.Value); 11893 if (Value.isInvalid()) 11894 return ExprError(); 11895 11896 if (Value.get() != OrigElement.Value) 11897 ArgChanged = true; 11898 11899 ObjCDictionaryElement Element = { 11900 Key.get(), Value.get(), SourceLocation(), None 11901 }; 11902 Elements.push_back(Element); 11903 } 11904 11905 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11906 return SemaRef.MaybeBindToTemporary(E); 11907 11908 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11909 Elements); 11910 } 11911 11912 template<typename Derived> 11913 ExprResult 11914 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11915 TypeSourceInfo *EncodedTypeInfo 11916 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11917 if (!EncodedTypeInfo) 11918 return ExprError(); 11919 11920 if (!getDerived().AlwaysRebuild() && 11921 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11922 return E; 11923 11924 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11925 EncodedTypeInfo, 11926 E->getRParenLoc()); 11927 } 11928 11929 template<typename Derived> 11930 ExprResult TreeTransform<Derived>:: 11931 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11932 // This is a kind of implicit conversion, and it needs to get dropped 11933 // and recomputed for the same general reasons that ImplicitCastExprs 11934 // do, as well a more specific one: this expression is only valid when 11935 // it appears *immediately* as an argument expression. 11936 return getDerived().TransformExpr(E->getSubExpr()); 11937 } 11938 11939 template<typename Derived> 11940 ExprResult TreeTransform<Derived>:: 11941 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11942 TypeSourceInfo *TSInfo 11943 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11944 if (!TSInfo) 11945 return ExprError(); 11946 11947 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11948 if (Result.isInvalid()) 11949 return ExprError(); 11950 11951 if (!getDerived().AlwaysRebuild() && 11952 TSInfo == E->getTypeInfoAsWritten() && 11953 Result.get() == E->getSubExpr()) 11954 return E; 11955 11956 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11957 E->getBridgeKeywordLoc(), TSInfo, 11958 Result.get()); 11959 } 11960 11961 template <typename Derived> 11962 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11963 ObjCAvailabilityCheckExpr *E) { 11964 return E; 11965 } 11966 11967 template<typename Derived> 11968 ExprResult 11969 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11970 // Transform arguments. 11971 bool ArgChanged = false; 11972 SmallVector<Expr*, 8> Args; 11973 Args.reserve(E->getNumArgs()); 11974 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11975 &ArgChanged)) 11976 return ExprError(); 11977 11978 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11979 // Class message: transform the receiver type. 11980 TypeSourceInfo *ReceiverTypeInfo 11981 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11982 if (!ReceiverTypeInfo) 11983 return ExprError(); 11984 11985 // If nothing changed, just retain the existing message send. 11986 if (!getDerived().AlwaysRebuild() && 11987 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11988 return SemaRef.MaybeBindToTemporary(E); 11989 11990 // Build a new class message send. 11991 SmallVector<SourceLocation, 16> SelLocs; 11992 E->getSelectorLocs(SelLocs); 11993 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11994 E->getSelector(), 11995 SelLocs, 11996 E->getMethodDecl(), 11997 E->getLeftLoc(), 11998 Args, 11999 E->getRightLoc()); 12000 } 12001 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12002 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12003 if (!E->getMethodDecl()) 12004 return ExprError(); 12005 12006 // Build a new class message send to 'super'. 12007 SmallVector<SourceLocation, 16> SelLocs; 12008 E->getSelectorLocs(SelLocs); 12009 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12010 E->getSelector(), 12011 SelLocs, 12012 E->getReceiverType(), 12013 E->getMethodDecl(), 12014 E->getLeftLoc(), 12015 Args, 12016 E->getRightLoc()); 12017 } 12018 12019 // Instance message: transform the receiver 12020 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12021 "Only class and instance messages may be instantiated"); 12022 ExprResult Receiver 12023 = getDerived().TransformExpr(E->getInstanceReceiver()); 12024 if (Receiver.isInvalid()) 12025 return ExprError(); 12026 12027 // If nothing changed, just retain the existing message send. 12028 if (!getDerived().AlwaysRebuild() && 12029 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12030 return SemaRef.MaybeBindToTemporary(E); 12031 12032 // Build a new instance message send. 12033 SmallVector<SourceLocation, 16> SelLocs; 12034 E->getSelectorLocs(SelLocs); 12035 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12036 E->getSelector(), 12037 SelLocs, 12038 E->getMethodDecl(), 12039 E->getLeftLoc(), 12040 Args, 12041 E->getRightLoc()); 12042 } 12043 12044 template<typename Derived> 12045 ExprResult 12046 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12047 return E; 12048 } 12049 12050 template<typename Derived> 12051 ExprResult 12052 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12053 return E; 12054 } 12055 12056 template<typename Derived> 12057 ExprResult 12058 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12059 // Transform the base expression. 12060 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12061 if (Base.isInvalid()) 12062 return ExprError(); 12063 12064 // We don't need to transform the ivar; it will never change. 12065 12066 // If nothing changed, just retain the existing expression. 12067 if (!getDerived().AlwaysRebuild() && 12068 Base.get() == E->getBase()) 12069 return E; 12070 12071 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12072 E->getLocation(), 12073 E->isArrow(), E->isFreeIvar()); 12074 } 12075 12076 template<typename Derived> 12077 ExprResult 12078 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12079 // 'super' and types never change. Property never changes. Just 12080 // retain the existing expression. 12081 if (!E->isObjectReceiver()) 12082 return E; 12083 12084 // Transform the base expression. 12085 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12086 if (Base.isInvalid()) 12087 return ExprError(); 12088 12089 // We don't need to transform the property; it will never change. 12090 12091 // If nothing changed, just retain the existing expression. 12092 if (!getDerived().AlwaysRebuild() && 12093 Base.get() == E->getBase()) 12094 return E; 12095 12096 if (E->isExplicitProperty()) 12097 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12098 E->getExplicitProperty(), 12099 E->getLocation()); 12100 12101 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12102 SemaRef.Context.PseudoObjectTy, 12103 E->getImplicitPropertyGetter(), 12104 E->getImplicitPropertySetter(), 12105 E->getLocation()); 12106 } 12107 12108 template<typename Derived> 12109 ExprResult 12110 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12111 // Transform the base expression. 12112 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12113 if (Base.isInvalid()) 12114 return ExprError(); 12115 12116 // Transform the key expression. 12117 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12118 if (Key.isInvalid()) 12119 return ExprError(); 12120 12121 // If nothing changed, just retain the existing expression. 12122 if (!getDerived().AlwaysRebuild() && 12123 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12124 return E; 12125 12126 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12127 Base.get(), Key.get(), 12128 E->getAtIndexMethodDecl(), 12129 E->setAtIndexMethodDecl()); 12130 } 12131 12132 template<typename Derived> 12133 ExprResult 12134 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12135 // Transform the base expression. 12136 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12137 if (Base.isInvalid()) 12138 return ExprError(); 12139 12140 // If nothing changed, just retain the existing expression. 12141 if (!getDerived().AlwaysRebuild() && 12142 Base.get() == E->getBase()) 12143 return E; 12144 12145 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12146 E->getOpLoc(), 12147 E->isArrow()); 12148 } 12149 12150 template<typename Derived> 12151 ExprResult 12152 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12153 bool ArgumentChanged = false; 12154 SmallVector<Expr*, 8> SubExprs; 12155 SubExprs.reserve(E->getNumSubExprs()); 12156 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12157 SubExprs, &ArgumentChanged)) 12158 return ExprError(); 12159 12160 if (!getDerived().AlwaysRebuild() && 12161 !ArgumentChanged) 12162 return E; 12163 12164 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12165 SubExprs, 12166 E->getRParenLoc()); 12167 } 12168 12169 template<typename Derived> 12170 ExprResult 12171 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12172 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12173 if (SrcExpr.isInvalid()) 12174 return ExprError(); 12175 12176 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12177 if (!Type) 12178 return ExprError(); 12179 12180 if (!getDerived().AlwaysRebuild() && 12181 Type == E->getTypeSourceInfo() && 12182 SrcExpr.get() == E->getSrcExpr()) 12183 return E; 12184 12185 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12186 SrcExpr.get(), Type, 12187 E->getRParenLoc()); 12188 } 12189 12190 template<typename Derived> 12191 ExprResult 12192 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12193 BlockDecl *oldBlock = E->getBlockDecl(); 12194 12195 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12196 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12197 12198 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12199 blockScope->TheDecl->setBlockMissingReturnType( 12200 oldBlock->blockMissingReturnType()); 12201 12202 SmallVector<ParmVarDecl*, 4> params; 12203 SmallVector<QualType, 4> paramTypes; 12204 12205 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12206 12207 // Parameter substitution. 12208 Sema::ExtParameterInfoBuilder extParamInfos; 12209 if (getDerived().TransformFunctionTypeParams( 12210 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12211 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12212 extParamInfos)) { 12213 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12214 return ExprError(); 12215 } 12216 12217 QualType exprResultType = 12218 getDerived().TransformType(exprFunctionType->getReturnType()); 12219 12220 auto epi = exprFunctionType->getExtProtoInfo(); 12221 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12222 12223 QualType functionType = 12224 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12225 blockScope->FunctionType = functionType; 12226 12227 // Set the parameters on the block decl. 12228 if (!params.empty()) 12229 blockScope->TheDecl->setParams(params); 12230 12231 if (!oldBlock->blockMissingReturnType()) { 12232 blockScope->HasImplicitReturnType = false; 12233 blockScope->ReturnType = exprResultType; 12234 } 12235 12236 // Transform the body 12237 StmtResult body = getDerived().TransformStmt(E->getBody()); 12238 if (body.isInvalid()) { 12239 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12240 return ExprError(); 12241 } 12242 12243 #ifndef NDEBUG 12244 // In builds with assertions, make sure that we captured everything we 12245 // captured before. 12246 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12247 for (const auto &I : oldBlock->captures()) { 12248 VarDecl *oldCapture = I.getVariable(); 12249 12250 // Ignore parameter packs. 12251 if (isa<ParmVarDecl>(oldCapture) && 12252 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12253 continue; 12254 12255 VarDecl *newCapture = 12256 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12257 oldCapture)); 12258 assert(blockScope->CaptureMap.count(newCapture)); 12259 } 12260 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12261 } 12262 #endif 12263 12264 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12265 /*Scope=*/nullptr); 12266 } 12267 12268 template<typename Derived> 12269 ExprResult 12270 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12271 llvm_unreachable("Cannot transform asType expressions yet"); 12272 } 12273 12274 template<typename Derived> 12275 ExprResult 12276 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12277 QualType RetTy = getDerived().TransformType(E->getType()); 12278 bool ArgumentChanged = false; 12279 SmallVector<Expr*, 8> SubExprs; 12280 SubExprs.reserve(E->getNumSubExprs()); 12281 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12282 SubExprs, &ArgumentChanged)) 12283 return ExprError(); 12284 12285 if (!getDerived().AlwaysRebuild() && 12286 !ArgumentChanged) 12287 return E; 12288 12289 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12290 RetTy, E->getOp(), E->getRParenLoc()); 12291 } 12292 12293 //===----------------------------------------------------------------------===// 12294 // Type reconstruction 12295 //===----------------------------------------------------------------------===// 12296 12297 template<typename Derived> 12298 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12299 SourceLocation Star) { 12300 return SemaRef.BuildPointerType(PointeeType, Star, 12301 getDerived().getBaseEntity()); 12302 } 12303 12304 template<typename Derived> 12305 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12306 SourceLocation Star) { 12307 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12308 getDerived().getBaseEntity()); 12309 } 12310 12311 template<typename Derived> 12312 QualType 12313 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12314 bool WrittenAsLValue, 12315 SourceLocation Sigil) { 12316 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12317 Sigil, getDerived().getBaseEntity()); 12318 } 12319 12320 template<typename Derived> 12321 QualType 12322 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12323 QualType ClassType, 12324 SourceLocation Sigil) { 12325 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12326 getDerived().getBaseEntity()); 12327 } 12328 12329 template<typename Derived> 12330 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12331 const ObjCTypeParamDecl *Decl, 12332 SourceLocation ProtocolLAngleLoc, 12333 ArrayRef<ObjCProtocolDecl *> Protocols, 12334 ArrayRef<SourceLocation> ProtocolLocs, 12335 SourceLocation ProtocolRAngleLoc) { 12336 return SemaRef.BuildObjCTypeParamType(Decl, 12337 ProtocolLAngleLoc, Protocols, 12338 ProtocolLocs, ProtocolRAngleLoc, 12339 /*FailOnError=*/true); 12340 } 12341 12342 template<typename Derived> 12343 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12344 QualType BaseType, 12345 SourceLocation Loc, 12346 SourceLocation TypeArgsLAngleLoc, 12347 ArrayRef<TypeSourceInfo *> TypeArgs, 12348 SourceLocation TypeArgsRAngleLoc, 12349 SourceLocation ProtocolLAngleLoc, 12350 ArrayRef<ObjCProtocolDecl *> Protocols, 12351 ArrayRef<SourceLocation> ProtocolLocs, 12352 SourceLocation ProtocolRAngleLoc) { 12353 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12354 TypeArgs, TypeArgsRAngleLoc, 12355 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12356 ProtocolRAngleLoc, 12357 /*FailOnError=*/true); 12358 } 12359 12360 template<typename Derived> 12361 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12362 QualType PointeeType, 12363 SourceLocation Star) { 12364 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12365 } 12366 12367 template<typename Derived> 12368 QualType 12369 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12370 ArrayType::ArraySizeModifier SizeMod, 12371 const llvm::APInt *Size, 12372 Expr *SizeExpr, 12373 unsigned IndexTypeQuals, 12374 SourceRange BracketsRange) { 12375 if (SizeExpr || !Size) 12376 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12377 IndexTypeQuals, BracketsRange, 12378 getDerived().getBaseEntity()); 12379 12380 QualType Types[] = { 12381 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12382 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12383 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12384 }; 12385 const unsigned NumTypes = llvm::array_lengthof(Types); 12386 QualType SizeType; 12387 for (unsigned I = 0; I != NumTypes; ++I) 12388 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12389 SizeType = Types[I]; 12390 break; 12391 } 12392 12393 // Note that we can return a VariableArrayType here in the case where 12394 // the element type was a dependent VariableArrayType. 12395 IntegerLiteral *ArraySize 12396 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12397 /*FIXME*/BracketsRange.getBegin()); 12398 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12399 IndexTypeQuals, BracketsRange, 12400 getDerived().getBaseEntity()); 12401 } 12402 12403 template<typename Derived> 12404 QualType 12405 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12406 ArrayType::ArraySizeModifier SizeMod, 12407 const llvm::APInt &Size, 12408 unsigned IndexTypeQuals, 12409 SourceRange BracketsRange) { 12410 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12411 IndexTypeQuals, BracketsRange); 12412 } 12413 12414 template<typename Derived> 12415 QualType 12416 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12417 ArrayType::ArraySizeModifier SizeMod, 12418 unsigned IndexTypeQuals, 12419 SourceRange BracketsRange) { 12420 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12421 IndexTypeQuals, BracketsRange); 12422 } 12423 12424 template<typename Derived> 12425 QualType 12426 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12427 ArrayType::ArraySizeModifier SizeMod, 12428 Expr *SizeExpr, 12429 unsigned IndexTypeQuals, 12430 SourceRange BracketsRange) { 12431 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12432 SizeExpr, 12433 IndexTypeQuals, BracketsRange); 12434 } 12435 12436 template<typename Derived> 12437 QualType 12438 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12439 ArrayType::ArraySizeModifier SizeMod, 12440 Expr *SizeExpr, 12441 unsigned IndexTypeQuals, 12442 SourceRange BracketsRange) { 12443 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12444 SizeExpr, 12445 IndexTypeQuals, BracketsRange); 12446 } 12447 12448 template <typename Derived> 12449 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12450 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12451 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12452 AttributeLoc); 12453 } 12454 12455 template <typename Derived> 12456 QualType 12457 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12458 unsigned NumElements, 12459 VectorType::VectorKind VecKind) { 12460 // FIXME: semantic checking! 12461 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12462 } 12463 12464 template <typename Derived> 12465 QualType TreeTransform<Derived>::RebuildDependentVectorType( 12466 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 12467 VectorType::VectorKind VecKind) { 12468 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 12469 } 12470 12471 template<typename Derived> 12472 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12473 unsigned NumElements, 12474 SourceLocation AttributeLoc) { 12475 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12476 NumElements, true); 12477 IntegerLiteral *VectorSize 12478 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12479 AttributeLoc); 12480 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12481 } 12482 12483 template<typename Derived> 12484 QualType 12485 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12486 Expr *SizeExpr, 12487 SourceLocation AttributeLoc) { 12488 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12489 } 12490 12491 template<typename Derived> 12492 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12493 QualType T, 12494 MutableArrayRef<QualType> ParamTypes, 12495 const FunctionProtoType::ExtProtoInfo &EPI) { 12496 return SemaRef.BuildFunctionType(T, ParamTypes, 12497 getDerived().getBaseLocation(), 12498 getDerived().getBaseEntity(), 12499 EPI); 12500 } 12501 12502 template<typename Derived> 12503 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12504 return SemaRef.Context.getFunctionNoProtoType(T); 12505 } 12506 12507 template<typename Derived> 12508 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12509 Decl *D) { 12510 assert(D && "no decl found"); 12511 if (D->isInvalidDecl()) return QualType(); 12512 12513 // FIXME: Doesn't account for ObjCInterfaceDecl! 12514 TypeDecl *Ty; 12515 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12516 // A valid resolved using typename pack expansion decl can have multiple 12517 // UsingDecls, but they must each have exactly one type, and it must be 12518 // the same type in every case. But we must have at least one expansion! 12519 if (UPD->expansions().empty()) { 12520 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12521 << UPD->isCXXClassMember() << UPD; 12522 return QualType(); 12523 } 12524 12525 // We might still have some unresolved types. Try to pick a resolved type 12526 // if we can. The final instantiation will check that the remaining 12527 // unresolved types instantiate to the type we pick. 12528 QualType FallbackT; 12529 QualType T; 12530 for (auto *E : UPD->expansions()) { 12531 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12532 if (ThisT.isNull()) 12533 continue; 12534 else if (ThisT->getAs<UnresolvedUsingType>()) 12535 FallbackT = ThisT; 12536 else if (T.isNull()) 12537 T = ThisT; 12538 else 12539 assert(getSema().Context.hasSameType(ThisT, T) && 12540 "mismatched resolved types in using pack expansion"); 12541 } 12542 return T.isNull() ? FallbackT : T; 12543 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12544 assert(Using->hasTypename() && 12545 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12546 12547 // A valid resolved using typename decl points to exactly one type decl. 12548 assert(++Using->shadow_begin() == Using->shadow_end()); 12549 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12550 } else { 12551 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12552 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12553 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12554 } 12555 12556 return SemaRef.Context.getTypeDeclType(Ty); 12557 } 12558 12559 template<typename Derived> 12560 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12561 SourceLocation Loc) { 12562 return SemaRef.BuildTypeofExprType(E, Loc); 12563 } 12564 12565 template<typename Derived> 12566 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12567 return SemaRef.Context.getTypeOfType(Underlying); 12568 } 12569 12570 template<typename Derived> 12571 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12572 SourceLocation Loc) { 12573 return SemaRef.BuildDecltypeType(E, Loc); 12574 } 12575 12576 template<typename Derived> 12577 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12578 UnaryTransformType::UTTKind UKind, 12579 SourceLocation Loc) { 12580 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12581 } 12582 12583 template<typename Derived> 12584 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12585 TemplateName Template, 12586 SourceLocation TemplateNameLoc, 12587 TemplateArgumentListInfo &TemplateArgs) { 12588 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12589 } 12590 12591 template<typename Derived> 12592 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12593 SourceLocation KWLoc) { 12594 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12595 } 12596 12597 template<typename Derived> 12598 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12599 SourceLocation KWLoc, 12600 bool isReadPipe) { 12601 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12602 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12603 } 12604 12605 template<typename Derived> 12606 TemplateName 12607 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12608 bool TemplateKW, 12609 TemplateDecl *Template) { 12610 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12611 Template); 12612 } 12613 12614 template<typename Derived> 12615 TemplateName 12616 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12617 SourceLocation TemplateKWLoc, 12618 const IdentifierInfo &Name, 12619 SourceLocation NameLoc, 12620 QualType ObjectType, 12621 NamedDecl *FirstQualifierInScope, 12622 bool AllowInjectedClassName) { 12623 UnqualifiedId TemplateName; 12624 TemplateName.setIdentifier(&Name, NameLoc); 12625 Sema::TemplateTy Template; 12626 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12627 SS, TemplateKWLoc, TemplateName, 12628 ParsedType::make(ObjectType), 12629 /*EnteringContext=*/false, 12630 Template, AllowInjectedClassName); 12631 return Template.get(); 12632 } 12633 12634 template<typename Derived> 12635 TemplateName 12636 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12637 SourceLocation TemplateKWLoc, 12638 OverloadedOperatorKind Operator, 12639 SourceLocation NameLoc, 12640 QualType ObjectType, 12641 bool AllowInjectedClassName) { 12642 UnqualifiedId Name; 12643 // FIXME: Bogus location information. 12644 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12645 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12646 Sema::TemplateTy Template; 12647 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12648 SS, TemplateKWLoc, Name, 12649 ParsedType::make(ObjectType), 12650 /*EnteringContext=*/false, 12651 Template, AllowInjectedClassName); 12652 return Template.get(); 12653 } 12654 12655 template<typename Derived> 12656 ExprResult 12657 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12658 SourceLocation OpLoc, 12659 Expr *OrigCallee, 12660 Expr *First, 12661 Expr *Second) { 12662 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12663 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12664 12665 if (First->getObjectKind() == OK_ObjCProperty) { 12666 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12667 if (BinaryOperator::isAssignmentOp(Opc)) 12668 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12669 First, Second); 12670 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12671 if (Result.isInvalid()) 12672 return ExprError(); 12673 First = Result.get(); 12674 } 12675 12676 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12677 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12678 if (Result.isInvalid()) 12679 return ExprError(); 12680 Second = Result.get(); 12681 } 12682 12683 // Determine whether this should be a builtin operation. 12684 if (Op == OO_Subscript) { 12685 if (!First->getType()->isOverloadableType() && 12686 !Second->getType()->isOverloadableType()) 12687 return getSema().CreateBuiltinArraySubscriptExpr( 12688 First, Callee->getBeginLoc(), Second, OpLoc); 12689 } else if (Op == OO_Arrow) { 12690 // -> is never a builtin operation. 12691 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12692 } else if (Second == nullptr || isPostIncDec) { 12693 if (!First->getType()->isOverloadableType() || 12694 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 12695 // The argument is not of overloadable type, or this is an expression 12696 // of the form &Class::member, so try to create a built-in unary 12697 // operation. 12698 UnaryOperatorKind Opc 12699 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12700 12701 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12702 } 12703 } else { 12704 if (!First->getType()->isOverloadableType() && 12705 !Second->getType()->isOverloadableType()) { 12706 // Neither of the arguments is an overloadable type, so try to 12707 // create a built-in binary operation. 12708 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12709 ExprResult Result 12710 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12711 if (Result.isInvalid()) 12712 return ExprError(); 12713 12714 return Result; 12715 } 12716 } 12717 12718 // Compute the transformed set of functions (and function templates) to be 12719 // used during overload resolution. 12720 UnresolvedSet<16> Functions; 12721 bool RequiresADL; 12722 12723 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12724 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12725 // If the overload could not be resolved in the template definition 12726 // (because we had a dependent argument), ADL is performed as part of 12727 // template instantiation. 12728 RequiresADL = ULE->requiresADL(); 12729 } else { 12730 // If we've resolved this to a particular non-member function, just call 12731 // that function. If we resolved it to a member function, 12732 // CreateOverloaded* will find that function for us. 12733 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12734 if (!isa<CXXMethodDecl>(ND)) 12735 Functions.addDecl(ND); 12736 RequiresADL = false; 12737 } 12738 12739 // Add any functions found via argument-dependent lookup. 12740 Expr *Args[2] = { First, Second }; 12741 unsigned NumArgs = 1 + (Second != nullptr); 12742 12743 // Create the overloaded operator invocation for unary operators. 12744 if (NumArgs == 1 || isPostIncDec) { 12745 UnaryOperatorKind Opc 12746 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12747 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12748 RequiresADL); 12749 } 12750 12751 if (Op == OO_Subscript) { 12752 SourceLocation LBrace; 12753 SourceLocation RBrace; 12754 12755 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12756 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12757 LBrace = SourceLocation::getFromRawEncoding( 12758 NameLoc.CXXOperatorName.BeginOpNameLoc); 12759 RBrace = SourceLocation::getFromRawEncoding( 12760 NameLoc.CXXOperatorName.EndOpNameLoc); 12761 } else { 12762 LBrace = Callee->getBeginLoc(); 12763 RBrace = OpLoc; 12764 } 12765 12766 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12767 First, Second); 12768 } 12769 12770 // Create the overloaded operator invocation for binary operators. 12771 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12772 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12773 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12774 if (Result.isInvalid()) 12775 return ExprError(); 12776 12777 return Result; 12778 } 12779 12780 template<typename Derived> 12781 ExprResult 12782 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12783 SourceLocation OperatorLoc, 12784 bool isArrow, 12785 CXXScopeSpec &SS, 12786 TypeSourceInfo *ScopeType, 12787 SourceLocation CCLoc, 12788 SourceLocation TildeLoc, 12789 PseudoDestructorTypeStorage Destroyed) { 12790 QualType BaseType = Base->getType(); 12791 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12792 (!isArrow && !BaseType->getAs<RecordType>()) || 12793 (isArrow && BaseType->getAs<PointerType>() && 12794 !BaseType->getAs<PointerType>()->getPointeeType() 12795 ->template getAs<RecordType>())){ 12796 // This pseudo-destructor expression is still a pseudo-destructor. 12797 return SemaRef.BuildPseudoDestructorExpr( 12798 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12799 CCLoc, TildeLoc, Destroyed); 12800 } 12801 12802 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12803 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12804 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12805 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12806 NameInfo.setNamedTypeInfo(DestroyedType); 12807 12808 // The scope type is now known to be a valid nested name specifier 12809 // component. Tack it on to the end of the nested name specifier. 12810 if (ScopeType) { 12811 if (!ScopeType->getType()->getAs<TagType>()) { 12812 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12813 diag::err_expected_class_or_namespace) 12814 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12815 return ExprError(); 12816 } 12817 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12818 CCLoc); 12819 } 12820 12821 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12822 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12823 OperatorLoc, isArrow, 12824 SS, TemplateKWLoc, 12825 /*FIXME: FirstQualifier*/ nullptr, 12826 NameInfo, 12827 /*TemplateArgs*/ nullptr, 12828 /*S*/nullptr); 12829 } 12830 12831 template<typename Derived> 12832 StmtResult 12833 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12834 SourceLocation Loc = S->getBeginLoc(); 12835 CapturedDecl *CD = S->getCapturedDecl(); 12836 unsigned NumParams = CD->getNumParams(); 12837 unsigned ContextParamPos = CD->getContextParamPosition(); 12838 SmallVector<Sema::CapturedParamNameType, 4> Params; 12839 for (unsigned I = 0; I < NumParams; ++I) { 12840 if (I != ContextParamPos) { 12841 Params.push_back( 12842 std::make_pair( 12843 CD->getParam(I)->getName(), 12844 getDerived().TransformType(CD->getParam(I)->getType()))); 12845 } else { 12846 Params.push_back(std::make_pair(StringRef(), QualType())); 12847 } 12848 } 12849 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12850 S->getCapturedRegionKind(), Params); 12851 StmtResult Body; 12852 { 12853 Sema::CompoundScopeRAII CompoundScope(getSema()); 12854 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12855 } 12856 12857 if (Body.isInvalid()) { 12858 getSema().ActOnCapturedRegionError(); 12859 return StmtError(); 12860 } 12861 12862 return getSema().ActOnCapturedRegionEnd(Body.get()); 12863 } 12864 12865 } // end namespace clang 12866 12867 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12868