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