1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a semantic tree transformation that takes a given 10 // AST and rebuilds it, possibly transforming some nodes in the process. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 16 17 #include "CoroutineStmtBuilder.h" 18 #include "TypeLocBuilder.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclObjC.h" 21 #include "clang/AST/DeclTemplate.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/Stmt.h" 27 #include "clang/AST/StmtCXX.h" 28 #include "clang/AST/StmtObjC.h" 29 #include "clang/AST/StmtOpenMP.h" 30 #include "clang/Sema/Designator.h" 31 #include "clang/Sema/Lookup.h" 32 #include "clang/Sema/Ownership.h" 33 #include "clang/Sema/ParsedTemplate.h" 34 #include "clang/Sema/ScopeInfo.h" 35 #include "clang/Sema/SemaDiagnostic.h" 36 #include "clang/Sema/SemaInternal.h" 37 #include "llvm/ADT/ArrayRef.h" 38 #include "llvm/Support/ErrorHandling.h" 39 #include <algorithm> 40 41 namespace clang { 42 using namespace sema; 43 44 /// A semantic tree transformation that allows one to transform one 45 /// abstract syntax tree into another. 46 /// 47 /// A new tree transformation is defined by creating a new subclass \c X of 48 /// \c TreeTransform<X> and then overriding certain operations to provide 49 /// behavior specific to that transformation. For example, template 50 /// instantiation is implemented as a tree transformation where the 51 /// transformation of TemplateTypeParmType nodes involves substituting the 52 /// template arguments for their corresponding template parameters; a similar 53 /// transformation is performed for non-type template parameters and 54 /// template template parameters. 55 /// 56 /// This tree-transformation template uses static polymorphism to allow 57 /// subclasses to customize any of its operations. Thus, a subclass can 58 /// override any of the transformation or rebuild operators by providing an 59 /// operation with the same signature as the default implementation. The 60 /// overriding function should not be virtual. 61 /// 62 /// Semantic tree transformations are split into two stages, either of which 63 /// can be replaced by a subclass. The "transform" step transforms an AST node 64 /// or the parts of an AST node using the various transformation functions, 65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 66 /// node of the appropriate kind from the pieces. The default transformation 67 /// routines recursively transform the operands to composite AST nodes (e.g., 68 /// the pointee type of a PointerType node) and, if any of those operand nodes 69 /// were changed by the transformation, invokes the rebuild operation to create 70 /// a new AST node. 71 /// 72 /// Subclasses can customize the transformation at various levels. The 73 /// most coarse-grained transformations involve replacing TransformType(), 74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 76 /// new implementations. 77 /// 78 /// For more fine-grained transformations, subclasses can replace any of the 79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 81 /// replacing TransformTemplateTypeParmType() allows template instantiation 82 /// to substitute template arguments for their corresponding template 83 /// parameters. Additionally, subclasses can override the \c RebuildXXX 84 /// functions to control how AST nodes are rebuilt when their operands change. 85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 87 /// be able to use more efficient rebuild steps. 88 /// 89 /// There are a handful of other functions that can be overridden, allowing one 90 /// to avoid traversing nodes that don't need any transformation 91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 92 /// operands have not changed (\c AlwaysRebuild()), and customize the 93 /// default locations and entity names used for type-checking 94 /// (\c getBaseLocation(), \c getBaseEntity()). 95 template<typename Derived> 96 class TreeTransform { 97 /// Private RAII object that helps us forget and then re-remember 98 /// the template argument corresponding to a partially-substituted parameter 99 /// pack. 100 class ForgetPartiallySubstitutedPackRAII { 101 Derived &Self; 102 TemplateArgument Old; 103 104 public: 105 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 106 Old = Self.ForgetPartiallySubstitutedPack(); 107 } 108 109 ~ForgetPartiallySubstitutedPackRAII() { 110 Self.RememberPartiallySubstitutedPack(Old); 111 } 112 }; 113 114 protected: 115 Sema &SemaRef; 116 117 /// The set of local declarations that have been transformed, for 118 /// cases where we are forced to build new declarations within the transformer 119 /// rather than in the subclass (e.g., lambda closure types). 120 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 121 122 public: 123 /// Initializes a new tree transformer. 124 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 125 126 /// Retrieves a reference to the derived class. 127 Derived &getDerived() { return static_cast<Derived&>(*this); } 128 129 /// Retrieves a reference to the derived class. 130 const Derived &getDerived() const { 131 return static_cast<const Derived&>(*this); 132 } 133 134 static inline ExprResult Owned(Expr *E) { return E; } 135 static inline StmtResult Owned(Stmt *S) { return S; } 136 137 /// Retrieves a reference to the semantic analysis object used for 138 /// this tree transform. 139 Sema &getSema() const { return SemaRef; } 140 141 /// Whether the transformation should always rebuild AST nodes, even 142 /// if none of the children have changed. 143 /// 144 /// Subclasses may override this function to specify when the transformation 145 /// should rebuild all AST nodes. 146 /// 147 /// We must always rebuild all AST nodes when performing variadic template 148 /// pack expansion, in order to avoid violating the AST invariant that each 149 /// statement node appears at most once in its containing declaration. 150 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 151 152 /// Returns the location of the entity being transformed, if that 153 /// information was not available elsewhere in the AST. 154 /// 155 /// By default, returns no source-location information. Subclasses can 156 /// provide an alternative implementation that provides better location 157 /// information. 158 SourceLocation getBaseLocation() { return SourceLocation(); } 159 160 /// Returns the name of the entity being transformed, if that 161 /// information was not available elsewhere in the AST. 162 /// 163 /// By default, returns an empty name. Subclasses can provide an alternative 164 /// implementation with a more precise name. 165 DeclarationName getBaseEntity() { return DeclarationName(); } 166 167 /// Sets the "base" location and entity when that 168 /// information is known based on another transformation. 169 /// 170 /// By default, the source location and entity are ignored. Subclasses can 171 /// override this function to provide a customized implementation. 172 void setBase(SourceLocation Loc, DeclarationName Entity) { } 173 174 /// RAII object that temporarily sets the base location and entity 175 /// used for reporting diagnostics in types. 176 class TemporaryBase { 177 TreeTransform &Self; 178 SourceLocation OldLocation; 179 DeclarationName OldEntity; 180 181 public: 182 TemporaryBase(TreeTransform &Self, SourceLocation Location, 183 DeclarationName Entity) : Self(Self) { 184 OldLocation = Self.getDerived().getBaseLocation(); 185 OldEntity = Self.getDerived().getBaseEntity(); 186 187 if (Location.isValid()) 188 Self.getDerived().setBase(Location, Entity); 189 } 190 191 ~TemporaryBase() { 192 Self.getDerived().setBase(OldLocation, OldEntity); 193 } 194 }; 195 196 /// Determine whether the given type \p T has already been 197 /// transformed. 198 /// 199 /// Subclasses can provide an alternative implementation of this routine 200 /// to short-circuit evaluation when it is known that a given type will 201 /// not change. For example, template instantiation need not traverse 202 /// non-dependent types. 203 bool AlreadyTransformed(QualType T) { 204 return T.isNull(); 205 } 206 207 /// Determine whether the given call argument should be dropped, e.g., 208 /// because it is a default argument. 209 /// 210 /// Subclasses can provide an alternative implementation of this routine to 211 /// determine which kinds of call arguments get dropped. By default, 212 /// CXXDefaultArgument nodes are dropped (prior to transformation). 213 bool DropCallArgument(Expr *E) { 214 return E->isDefaultArgument(); 215 } 216 217 /// Determine whether we should expand a pack expansion with the 218 /// given set of parameter packs into separate arguments by repeatedly 219 /// transforming the pattern. 220 /// 221 /// By default, the transformer never tries to expand pack expansions. 222 /// Subclasses can override this routine to provide different behavior. 223 /// 224 /// \param EllipsisLoc The location of the ellipsis that identifies the 225 /// pack expansion. 226 /// 227 /// \param PatternRange The source range that covers the entire pattern of 228 /// the pack expansion. 229 /// 230 /// \param Unexpanded The set of unexpanded parameter packs within the 231 /// pattern. 232 /// 233 /// \param ShouldExpand Will be set to \c true if the transformer should 234 /// expand the corresponding pack expansions into separate arguments. When 235 /// set, \c NumExpansions must also be set. 236 /// 237 /// \param RetainExpansion Whether the caller should add an unexpanded 238 /// pack expansion after all of the expanded arguments. This is used 239 /// when extending explicitly-specified template argument packs per 240 /// C++0x [temp.arg.explicit]p9. 241 /// 242 /// \param NumExpansions The number of separate arguments that will be in 243 /// the expanded form of the corresponding pack expansion. This is both an 244 /// input and an output parameter, which can be set by the caller if the 245 /// number of expansions is known a priori (e.g., due to a prior substitution) 246 /// and will be set by the callee when the number of expansions is known. 247 /// The callee must set this value when \c ShouldExpand is \c true; it may 248 /// set this value in other cases. 249 /// 250 /// \returns true if an error occurred (e.g., because the parameter packs 251 /// are to be instantiated with arguments of different lengths), false 252 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 253 /// must be set. 254 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 255 SourceRange PatternRange, 256 ArrayRef<UnexpandedParameterPack> Unexpanded, 257 bool &ShouldExpand, 258 bool &RetainExpansion, 259 Optional<unsigned> &NumExpansions) { 260 ShouldExpand = false; 261 return false; 262 } 263 264 /// "Forget" about the partially-substituted pack template argument, 265 /// when performing an instantiation that must preserve the parameter pack 266 /// use. 267 /// 268 /// This routine is meant to be overridden by the template instantiator. 269 TemplateArgument ForgetPartiallySubstitutedPack() { 270 return TemplateArgument(); 271 } 272 273 /// "Remember" the partially-substituted pack template argument 274 /// after performing an instantiation that must preserve the parameter pack 275 /// use. 276 /// 277 /// This routine is meant to be overridden by the template instantiator. 278 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 279 280 /// Note to the derived class when a function parameter pack is 281 /// being expanded. 282 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 283 284 /// Transforms the given type into another type. 285 /// 286 /// By default, this routine transforms a type by creating a 287 /// TypeSourceInfo for it and delegating to the appropriate 288 /// function. This is expensive, but we don't mind, because 289 /// this method is deprecated anyway; all users should be 290 /// switched to storing TypeSourceInfos. 291 /// 292 /// \returns the transformed type. 293 QualType TransformType(QualType T); 294 295 /// Transforms the given type-with-location into a new 296 /// type-with-location. 297 /// 298 /// By default, this routine transforms a type by delegating to the 299 /// appropriate TransformXXXType to build a new type. Subclasses 300 /// may override this function (to take over all type 301 /// transformations) or some set of the TransformXXXType functions 302 /// to alter the transformation. 303 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 304 305 /// Transform the given type-with-location into a new 306 /// type, collecting location information in the given builder 307 /// as necessary. 308 /// 309 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 310 311 /// Transform a type that is permitted to produce a 312 /// DeducedTemplateSpecializationType. 313 /// 314 /// This is used in the (relatively rare) contexts where it is acceptable 315 /// for transformation to produce a class template type with deduced 316 /// template arguments. 317 /// @{ 318 QualType TransformTypeWithDeducedTST(QualType T); 319 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 320 /// @} 321 322 /// Transform the given statement. 323 /// 324 /// By default, this routine transforms a statement by delegating to the 325 /// appropriate TransformXXXStmt function to transform a specific kind of 326 /// statement or the TransformExpr() function to transform an expression. 327 /// Subclasses may override this function to transform statements using some 328 /// other mechanism. 329 /// 330 /// \returns the transformed statement. 331 StmtResult TransformStmt(Stmt *S); 332 333 /// Transform the given statement. 334 /// 335 /// By default, this routine transforms a statement by delegating to the 336 /// appropriate TransformOMPXXXClause function to transform a specific kind 337 /// of clause. Subclasses may override this function to transform statements 338 /// using some other mechanism. 339 /// 340 /// \returns the transformed OpenMP clause. 341 OMPClause *TransformOMPClause(OMPClause *S); 342 343 /// Transform the given attribute. 344 /// 345 /// By default, this routine transforms a statement by delegating to the 346 /// appropriate TransformXXXAttr function to transform a specific kind 347 /// of attribute. Subclasses may override this function to transform 348 /// attributed statements using some other mechanism. 349 /// 350 /// \returns the transformed attribute 351 const Attr *TransformAttr(const Attr *S); 352 353 /// Transform the specified attribute. 354 /// 355 /// Subclasses should override the transformation of attributes with a pragma 356 /// spelling to transform expressions stored within the attribute. 357 /// 358 /// \returns the transformed attribute. 359 #define ATTR(X) 360 #define PRAGMA_SPELLING_ATTR(X) \ 361 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 362 #include "clang/Basic/AttrList.inc" 363 364 /// Transform the given expression. 365 /// 366 /// By default, this routine transforms an expression by delegating to the 367 /// appropriate TransformXXXExpr function to build a new expression. 368 /// Subclasses may override this function to transform expressions using some 369 /// other mechanism. 370 /// 371 /// \returns the transformed expression. 372 ExprResult TransformExpr(Expr *E); 373 374 /// Transform the given initializer. 375 /// 376 /// By default, this routine transforms an initializer by stripping off the 377 /// semantic nodes added by initialization, then passing the result to 378 /// TransformExpr or TransformExprs. 379 /// 380 /// \returns the transformed initializer. 381 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 382 383 /// Transform the given list of expressions. 384 /// 385 /// This routine transforms a list of expressions by invoking 386 /// \c TransformExpr() for each subexpression. However, it also provides 387 /// support for variadic templates by expanding any pack expansions (if the 388 /// derived class permits such expansion) along the way. When pack expansions 389 /// are present, the number of outputs may not equal the number of inputs. 390 /// 391 /// \param Inputs The set of expressions to be transformed. 392 /// 393 /// \param NumInputs The number of expressions in \c Inputs. 394 /// 395 /// \param IsCall If \c true, then this transform is being performed on 396 /// function-call arguments, and any arguments that should be dropped, will 397 /// be. 398 /// 399 /// \param Outputs The transformed input expressions will be added to this 400 /// vector. 401 /// 402 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 403 /// due to transformation. 404 /// 405 /// \returns true if an error occurred, false otherwise. 406 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 407 SmallVectorImpl<Expr *> &Outputs, 408 bool *ArgChanged = nullptr); 409 410 /// Transform the given declaration, which is referenced from a type 411 /// or expression. 412 /// 413 /// By default, acts as the identity function on declarations, unless the 414 /// transformer has had to transform the declaration itself. Subclasses 415 /// may override this function to provide alternate behavior. 416 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 417 llvm::DenseMap<Decl *, Decl *>::iterator Known 418 = TransformedLocalDecls.find(D); 419 if (Known != TransformedLocalDecls.end()) 420 return Known->second; 421 422 return D; 423 } 424 425 /// Transform the specified condition. 426 /// 427 /// By default, this transforms the variable and expression and rebuilds 428 /// the condition. 429 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 430 Expr *Expr, 431 Sema::ConditionKind Kind); 432 433 /// Transform the attributes associated with the given declaration and 434 /// place them on the new declaration. 435 /// 436 /// By default, this operation does nothing. Subclasses may override this 437 /// behavior to transform attributes. 438 void transformAttrs(Decl *Old, Decl *New) { } 439 440 /// Note that a local declaration has been transformed by this 441 /// transformer. 442 /// 443 /// Local declarations are typically transformed via a call to 444 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 445 /// the transformer itself has to transform the declarations. This routine 446 /// can be overridden by a subclass that keeps track of such mappings. 447 void transformedLocalDecl(Decl *Old, Decl *New) { 448 TransformedLocalDecls[Old] = New; 449 } 450 451 /// Transform the definition of the given declaration. 452 /// 453 /// By default, invokes TransformDecl() to transform the declaration. 454 /// Subclasses may override this function to provide alternate behavior. 455 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 456 return getDerived().TransformDecl(Loc, D); 457 } 458 459 /// Transform the given declaration, which was the first part of a 460 /// nested-name-specifier in a member access expression. 461 /// 462 /// This specific declaration transformation only applies to the first 463 /// identifier in a nested-name-specifier of a member access expression, e.g., 464 /// the \c T in \c x->T::member 465 /// 466 /// By default, invokes TransformDecl() to transform the declaration. 467 /// Subclasses may override this function to provide alternate behavior. 468 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 469 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 470 } 471 472 /// Transform the set of declarations in an OverloadExpr. 473 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 474 LookupResult &R); 475 476 /// Transform the given nested-name-specifier with source-location 477 /// information. 478 /// 479 /// By default, transforms all of the types and declarations within the 480 /// nested-name-specifier. Subclasses may override this function to provide 481 /// alternate behavior. 482 NestedNameSpecifierLoc 483 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 484 QualType ObjectType = QualType(), 485 NamedDecl *FirstQualifierInScope = nullptr); 486 487 /// Transform the given declaration name. 488 /// 489 /// By default, transforms the types of conversion function, constructor, 490 /// and destructor names and then (if needed) rebuilds the declaration name. 491 /// Identifiers and selectors are returned unmodified. Sublcasses may 492 /// override this function to provide alternate behavior. 493 DeclarationNameInfo 494 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 495 496 /// Transform the given template name. 497 /// 498 /// \param SS The nested-name-specifier that qualifies the template 499 /// name. This nested-name-specifier must already have been transformed. 500 /// 501 /// \param Name The template name to transform. 502 /// 503 /// \param NameLoc The source location of the template name. 504 /// 505 /// \param ObjectType If we're translating a template name within a member 506 /// access expression, this is the type of the object whose member template 507 /// is being referenced. 508 /// 509 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 510 /// also refers to a name within the current (lexical) scope, this is the 511 /// declaration it refers to. 512 /// 513 /// By default, transforms the template name by transforming the declarations 514 /// and nested-name-specifiers that occur within the template name. 515 /// Subclasses may override this function to provide alternate behavior. 516 TemplateName 517 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 518 SourceLocation NameLoc, 519 QualType ObjectType = QualType(), 520 NamedDecl *FirstQualifierInScope = nullptr, 521 bool AllowInjectedClassName = false); 522 523 /// Transform the given template argument. 524 /// 525 /// By default, this operation transforms the type, expression, or 526 /// declaration stored within the template argument and constructs a 527 /// new template argument from the transformed result. Subclasses may 528 /// override this function to provide alternate behavior. 529 /// 530 /// Returns true if there was an error. 531 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 532 TemplateArgumentLoc &Output, 533 bool Uneval = false); 534 535 /// Transform the given set of template arguments. 536 /// 537 /// By default, this operation transforms all of the template arguments 538 /// in the input set using \c TransformTemplateArgument(), and appends 539 /// the transformed arguments to the output list. 540 /// 541 /// Note that this overload of \c TransformTemplateArguments() is merely 542 /// a convenience function. Subclasses that wish to override this behavior 543 /// should override the iterator-based member template version. 544 /// 545 /// \param Inputs The set of template arguments to be transformed. 546 /// 547 /// \param NumInputs The number of template arguments in \p Inputs. 548 /// 549 /// \param Outputs The set of transformed template arguments output by this 550 /// routine. 551 /// 552 /// Returns true if an error occurred. 553 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 554 unsigned NumInputs, 555 TemplateArgumentListInfo &Outputs, 556 bool Uneval = false) { 557 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 558 Uneval); 559 } 560 561 /// Transform the given set of template arguments. 562 /// 563 /// By default, this operation transforms all of the template arguments 564 /// in the input set using \c TransformTemplateArgument(), and appends 565 /// the transformed arguments to the output list. 566 /// 567 /// \param First An iterator to the first template argument. 568 /// 569 /// \param Last An iterator one step past the last template argument. 570 /// 571 /// \param Outputs The set of transformed template arguments output by this 572 /// routine. 573 /// 574 /// Returns true if an error occurred. 575 template<typename InputIterator> 576 bool TransformTemplateArguments(InputIterator First, 577 InputIterator Last, 578 TemplateArgumentListInfo &Outputs, 579 bool Uneval = false); 580 581 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 582 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 583 TemplateArgumentLoc &ArgLoc); 584 585 /// Fakes up a TypeSourceInfo for a type. 586 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 587 return SemaRef.Context.getTrivialTypeSourceInfo(T, 588 getDerived().getBaseLocation()); 589 } 590 591 #define ABSTRACT_TYPELOC(CLASS, PARENT) 592 #define TYPELOC(CLASS, PARENT) \ 593 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 594 #include "clang/AST/TypeLocNodes.def" 595 596 template<typename Fn> 597 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 598 FunctionProtoTypeLoc TL, 599 CXXRecordDecl *ThisContext, 600 unsigned ThisTypeQuals, 601 Fn TransformExceptionSpec); 602 603 bool TransformExceptionSpec(SourceLocation Loc, 604 FunctionProtoType::ExceptionSpecInfo &ESI, 605 SmallVectorImpl<QualType> &Exceptions, 606 bool &Changed); 607 608 StmtResult TransformSEHHandler(Stmt *Handler); 609 610 QualType 611 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 612 TemplateSpecializationTypeLoc TL, 613 TemplateName Template); 614 615 QualType 616 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 617 DependentTemplateSpecializationTypeLoc TL, 618 TemplateName Template, 619 CXXScopeSpec &SS); 620 621 QualType TransformDependentTemplateSpecializationType( 622 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 623 NestedNameSpecifierLoc QualifierLoc); 624 625 /// Transforms the parameters of a function type into the 626 /// given vectors. 627 /// 628 /// The result vectors should be kept in sync; null entries in the 629 /// variables vector are acceptable. 630 /// 631 /// Return true on error. 632 bool TransformFunctionTypeParams( 633 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 634 const QualType *ParamTypes, 635 const FunctionProtoType::ExtParameterInfo *ParamInfos, 636 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 637 Sema::ExtParameterInfoBuilder &PInfos); 638 639 /// Transforms a single function-type parameter. Return null 640 /// on error. 641 /// 642 /// \param indexAdjustment - A number to add to the parameter's 643 /// scope index; can be negative 644 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 645 int indexAdjustment, 646 Optional<unsigned> NumExpansions, 647 bool ExpectParameterPack); 648 649 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 650 651 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 652 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 653 654 TemplateParameterList *TransformTemplateParameterList( 655 TemplateParameterList *TPL) { 656 return TPL; 657 } 658 659 ExprResult TransformAddressOfOperand(Expr *E); 660 661 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 662 bool IsAddressOfOperand, 663 TypeSourceInfo **RecoveryTSI); 664 665 ExprResult TransformParenDependentScopeDeclRefExpr( 666 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 667 TypeSourceInfo **RecoveryTSI); 668 669 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 670 671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 672 // amount of stack usage with clang. 673 #define STMT(Node, Parent) \ 674 LLVM_ATTRIBUTE_NOINLINE \ 675 StmtResult Transform##Node(Node *S); 676 #define EXPR(Node, Parent) \ 677 LLVM_ATTRIBUTE_NOINLINE \ 678 ExprResult Transform##Node(Node *E); 679 #define ABSTRACT_STMT(Stmt) 680 #include "clang/AST/StmtNodes.inc" 681 682 #define OPENMP_CLAUSE(Name, Class) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 OMPClause *Transform ## Class(Class *S); 685 #include "clang/Basic/OpenMPKinds.def" 686 687 /// Build a new qualified type given its unqualified type and type 688 /// qualifiers. 689 /// 690 /// By default, this routine adds type qualifiers only to types that can 691 /// have qualifiers, and silently suppresses those qualifiers that are not 692 /// permitted. Subclasses may override this routine to provide different 693 /// behavior. 694 QualType RebuildQualifiedType(QualType T, SourceLocation Loc, 695 Qualifiers Quals); 696 697 /// Build a new pointer type given its pointee type. 698 /// 699 /// By default, performs semantic analysis when building the pointer type. 700 /// Subclasses may override this routine to provide different behavior. 701 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 702 703 /// Build a new block pointer type given its pointee type. 704 /// 705 /// By default, performs semantic analysis when building the block pointer 706 /// type. Subclasses may override this routine to provide different behavior. 707 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 708 709 /// Build a new reference type given the type it references. 710 /// 711 /// By default, performs semantic analysis when building the 712 /// reference type. Subclasses may override this routine to provide 713 /// different behavior. 714 /// 715 /// \param LValue whether the type was written with an lvalue sigil 716 /// or an rvalue sigil. 717 QualType RebuildReferenceType(QualType ReferentType, 718 bool LValue, 719 SourceLocation Sigil); 720 721 /// Build a new member pointer type given the pointee type and the 722 /// class type it refers into. 723 /// 724 /// By default, performs semantic analysis when building the member pointer 725 /// type. Subclasses may override this routine to provide different behavior. 726 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 727 SourceLocation Sigil); 728 729 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 730 SourceLocation ProtocolLAngleLoc, 731 ArrayRef<ObjCProtocolDecl *> Protocols, 732 ArrayRef<SourceLocation> ProtocolLocs, 733 SourceLocation ProtocolRAngleLoc); 734 735 /// Build an Objective-C object type. 736 /// 737 /// By default, performs semantic analysis when building the object type. 738 /// Subclasses may override this routine to provide different behavior. 739 QualType RebuildObjCObjectType(QualType BaseType, 740 SourceLocation Loc, 741 SourceLocation TypeArgsLAngleLoc, 742 ArrayRef<TypeSourceInfo *> TypeArgs, 743 SourceLocation TypeArgsRAngleLoc, 744 SourceLocation ProtocolLAngleLoc, 745 ArrayRef<ObjCProtocolDecl *> Protocols, 746 ArrayRef<SourceLocation> ProtocolLocs, 747 SourceLocation ProtocolRAngleLoc); 748 749 /// Build a new Objective-C object pointer type given the pointee type. 750 /// 751 /// By default, directly builds the pointer type, with no additional semantic 752 /// analysis. 753 QualType RebuildObjCObjectPointerType(QualType PointeeType, 754 SourceLocation Star); 755 756 /// Build a new array type given the element type, size 757 /// modifier, size of the array (if known), size expression, and index type 758 /// qualifiers. 759 /// 760 /// By default, performs semantic analysis when building the array type. 761 /// Subclasses may override this routine to provide different behavior. 762 /// Also by default, all of the other Rebuild*Array 763 QualType RebuildArrayType(QualType ElementType, 764 ArrayType::ArraySizeModifier SizeMod, 765 const llvm::APInt *Size, 766 Expr *SizeExpr, 767 unsigned IndexTypeQuals, 768 SourceRange BracketsRange); 769 770 /// Build a new constant array type given the element type, size 771 /// modifier, (known) size of the array, and index type qualifiers. 772 /// 773 /// By default, performs semantic analysis when building the array type. 774 /// Subclasses may override this routine to provide different behavior. 775 QualType RebuildConstantArrayType(QualType ElementType, 776 ArrayType::ArraySizeModifier SizeMod, 777 const llvm::APInt &Size, 778 unsigned IndexTypeQuals, 779 SourceRange BracketsRange); 780 781 /// Build a new incomplete array type given the element type, size 782 /// modifier, and index type qualifiers. 783 /// 784 /// By default, performs semantic analysis when building the array type. 785 /// Subclasses may override this routine to provide different behavior. 786 QualType RebuildIncompleteArrayType(QualType ElementType, 787 ArrayType::ArraySizeModifier SizeMod, 788 unsigned IndexTypeQuals, 789 SourceRange BracketsRange); 790 791 /// Build a new variable-length array type given the element type, 792 /// size modifier, size expression, and index type qualifiers. 793 /// 794 /// By default, performs semantic analysis when building the array type. 795 /// Subclasses may override this routine to provide different behavior. 796 QualType RebuildVariableArrayType(QualType ElementType, 797 ArrayType::ArraySizeModifier SizeMod, 798 Expr *SizeExpr, 799 unsigned IndexTypeQuals, 800 SourceRange BracketsRange); 801 802 /// Build a new dependent-sized array type given the element type, 803 /// size modifier, size expression, and index type qualifiers. 804 /// 805 /// By default, performs semantic analysis when building the array type. 806 /// Subclasses may override this routine to provide different behavior. 807 QualType RebuildDependentSizedArrayType(QualType ElementType, 808 ArrayType::ArraySizeModifier SizeMod, 809 Expr *SizeExpr, 810 unsigned IndexTypeQuals, 811 SourceRange BracketsRange); 812 813 /// Build a new vector type given the element type and 814 /// number of elements. 815 /// 816 /// By default, performs semantic analysis when building the vector type. 817 /// Subclasses may override this routine to provide different behavior. 818 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 819 VectorType::VectorKind VecKind); 820 821 /// Build a new extended vector type given the element type and 822 /// number of elements. 823 /// 824 /// By default, performs semantic analysis when building the vector type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 827 SourceLocation AttributeLoc); 828 829 /// Build a new potentially dependently-sized extended vector type 830 /// given the element type and number of elements. 831 /// 832 /// By default, performs semantic analysis when building the vector type. 833 /// Subclasses may override this routine to provide different behavior. 834 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 835 Expr *SizeExpr, 836 SourceLocation AttributeLoc); 837 838 /// Build a new DependentAddressSpaceType or return the pointee 839 /// type variable with the correct address space (retrieved from 840 /// AddrSpaceExpr) applied to it. The former will be returned in cases 841 /// where the address space remains dependent. 842 /// 843 /// By default, performs semantic analysis when building the type with address 844 /// space applied. Subclasses may override this routine to provide different 845 /// behavior. 846 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 847 Expr *AddrSpaceExpr, 848 SourceLocation AttributeLoc); 849 850 /// Build a new function type. 851 /// 852 /// By default, performs semantic analysis when building the function type. 853 /// Subclasses may override this routine to provide different behavior. 854 QualType RebuildFunctionProtoType(QualType T, 855 MutableArrayRef<QualType> ParamTypes, 856 const FunctionProtoType::ExtProtoInfo &EPI); 857 858 /// Build a new unprototyped function type. 859 QualType RebuildFunctionNoProtoType(QualType ResultType); 860 861 /// Rebuild an unresolved typename type, given the decl that 862 /// the UnresolvedUsingTypenameDecl was transformed to. 863 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 864 865 /// Build a new typedef type. 866 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 867 return SemaRef.Context.getTypeDeclType(Typedef); 868 } 869 870 /// Build a new class/struct/union type. 871 QualType RebuildRecordType(RecordDecl *Record) { 872 return SemaRef.Context.getTypeDeclType(Record); 873 } 874 875 /// Build a new Enum type. 876 QualType RebuildEnumType(EnumDecl *Enum) { 877 return SemaRef.Context.getTypeDeclType(Enum); 878 } 879 880 /// Build a new typeof(expr) type. 881 /// 882 /// By default, performs semantic analysis when building the typeof type. 883 /// Subclasses may override this routine to provide different behavior. 884 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 885 886 /// Build a new typeof(type) type. 887 /// 888 /// By default, builds a new TypeOfType with the given underlying type. 889 QualType RebuildTypeOfType(QualType Underlying); 890 891 /// Build a new unary transform type. 892 QualType RebuildUnaryTransformType(QualType BaseType, 893 UnaryTransformType::UTTKind UKind, 894 SourceLocation Loc); 895 896 /// Build a new C++11 decltype type. 897 /// 898 /// By default, performs semantic analysis when building the decltype type. 899 /// Subclasses may override this routine to provide different behavior. 900 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 901 902 /// Build a new C++11 auto type. 903 /// 904 /// By default, builds a new AutoType with the given deduced type. 905 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 906 // Note, IsDependent is always false here: we implicitly convert an 'auto' 907 // which has been deduced to a dependent type into an undeduced 'auto', so 908 // that we'll retry deduction after the transformation. 909 return SemaRef.Context.getAutoType(Deduced, Keyword, 910 /*IsDependent*/ false); 911 } 912 913 /// By default, builds a new DeducedTemplateSpecializationType with the given 914 /// deduced type. 915 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 916 QualType Deduced) { 917 return SemaRef.Context.getDeducedTemplateSpecializationType( 918 Template, Deduced, /*IsDependent*/ false); 919 } 920 921 /// Build a new template specialization type. 922 /// 923 /// By default, performs semantic analysis when building the template 924 /// specialization type. Subclasses may override this routine to provide 925 /// different behavior. 926 QualType RebuildTemplateSpecializationType(TemplateName Template, 927 SourceLocation TemplateLoc, 928 TemplateArgumentListInfo &Args); 929 930 /// Build a new parenthesized type. 931 /// 932 /// By default, builds a new ParenType type from the inner type. 933 /// Subclasses may override this routine to provide different behavior. 934 QualType RebuildParenType(QualType InnerType) { 935 return SemaRef.BuildParenType(InnerType); 936 } 937 938 /// Build a new qualified name type. 939 /// 940 /// By default, builds a new ElaboratedType type from the keyword, 941 /// the nested-name-specifier and the named type. 942 /// Subclasses may override this routine to provide different behavior. 943 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 944 ElaboratedTypeKeyword Keyword, 945 NestedNameSpecifierLoc QualifierLoc, 946 QualType Named) { 947 return SemaRef.Context.getElaboratedType(Keyword, 948 QualifierLoc.getNestedNameSpecifier(), 949 Named); 950 } 951 952 /// Build a new typename type that refers to a template-id. 953 /// 954 /// By default, builds a new DependentNameType type from the 955 /// nested-name-specifier and the given type. Subclasses may override 956 /// this routine to provide different behavior. 957 QualType RebuildDependentTemplateSpecializationType( 958 ElaboratedTypeKeyword Keyword, 959 NestedNameSpecifierLoc QualifierLoc, 960 SourceLocation TemplateKWLoc, 961 const IdentifierInfo *Name, 962 SourceLocation NameLoc, 963 TemplateArgumentListInfo &Args, 964 bool AllowInjectedClassName) { 965 // Rebuild the template name. 966 // TODO: avoid TemplateName abstraction 967 CXXScopeSpec SS; 968 SS.Adopt(QualifierLoc); 969 TemplateName InstName = getDerived().RebuildTemplateName( 970 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 971 AllowInjectedClassName); 972 973 if (InstName.isNull()) 974 return QualType(); 975 976 // If it's still dependent, make a dependent specialization. 977 if (InstName.getAsDependentTemplateName()) 978 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 979 QualifierLoc.getNestedNameSpecifier(), 980 Name, 981 Args); 982 983 // Otherwise, make an elaborated type wrapping a non-dependent 984 // specialization. 985 QualType T = 986 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 987 if (T.isNull()) return QualType(); 988 989 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 990 return T; 991 992 return SemaRef.Context.getElaboratedType(Keyword, 993 QualifierLoc.getNestedNameSpecifier(), 994 T); 995 } 996 997 /// Build a new typename type that refers to an identifier. 998 /// 999 /// By default, performs semantic analysis when building the typename type 1000 /// (or elaborated type). Subclasses may override this routine to provide 1001 /// different behavior. 1002 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1003 SourceLocation KeywordLoc, 1004 NestedNameSpecifierLoc QualifierLoc, 1005 const IdentifierInfo *Id, 1006 SourceLocation IdLoc, 1007 bool DeducedTSTContext) { 1008 CXXScopeSpec SS; 1009 SS.Adopt(QualifierLoc); 1010 1011 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1012 // If the name is still dependent, just build a new dependent name type. 1013 if (!SemaRef.computeDeclContext(SS)) 1014 return SemaRef.Context.getDependentNameType(Keyword, 1015 QualifierLoc.getNestedNameSpecifier(), 1016 Id); 1017 } 1018 1019 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1020 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1021 *Id, IdLoc); 1022 // If a dependent name resolves to a deduced template specialization type, 1023 // check that we're in one of the syntactic contexts permitting it. 1024 if (!DeducedTSTContext) { 1025 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1026 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1027 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1028 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1029 Deduced->getTemplateName()) 1030 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1031 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1032 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1033 return QualType(); 1034 } 1035 } 1036 return T; 1037 } 1038 1039 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1040 1041 // We had a dependent elaborated-type-specifier that has been transformed 1042 // into a non-dependent elaborated-type-specifier. Find the tag we're 1043 // referring to. 1044 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1045 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1046 if (!DC) 1047 return QualType(); 1048 1049 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1050 return QualType(); 1051 1052 TagDecl *Tag = nullptr; 1053 SemaRef.LookupQualifiedName(Result, DC); 1054 switch (Result.getResultKind()) { 1055 case LookupResult::NotFound: 1056 case LookupResult::NotFoundInCurrentInstantiation: 1057 break; 1058 1059 case LookupResult::Found: 1060 Tag = Result.getAsSingle<TagDecl>(); 1061 break; 1062 1063 case LookupResult::FoundOverloaded: 1064 case LookupResult::FoundUnresolvedValue: 1065 llvm_unreachable("Tag lookup cannot find non-tags"); 1066 1067 case LookupResult::Ambiguous: 1068 // Let the LookupResult structure handle ambiguities. 1069 return QualType(); 1070 } 1071 1072 if (!Tag) { 1073 // Check where the name exists but isn't a tag type and use that to emit 1074 // better diagnostics. 1075 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1076 SemaRef.LookupQualifiedName(Result, DC); 1077 switch (Result.getResultKind()) { 1078 case LookupResult::Found: 1079 case LookupResult::FoundOverloaded: 1080 case LookupResult::FoundUnresolvedValue: { 1081 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1082 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1083 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1084 << NTK << Kind; 1085 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1086 break; 1087 } 1088 default: 1089 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1090 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1091 break; 1092 } 1093 return QualType(); 1094 } 1095 1096 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1097 IdLoc, Id)) { 1098 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1099 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1100 return QualType(); 1101 } 1102 1103 // Build the elaborated-type-specifier type. 1104 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1105 return SemaRef.Context.getElaboratedType(Keyword, 1106 QualifierLoc.getNestedNameSpecifier(), 1107 T); 1108 } 1109 1110 /// Build a new pack expansion type. 1111 /// 1112 /// By default, builds a new PackExpansionType type from the given pattern. 1113 /// Subclasses may override this routine to provide different behavior. 1114 QualType RebuildPackExpansionType(QualType Pattern, 1115 SourceRange PatternRange, 1116 SourceLocation EllipsisLoc, 1117 Optional<unsigned> NumExpansions) { 1118 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1119 NumExpansions); 1120 } 1121 1122 /// Build a new atomic type given its value type. 1123 /// 1124 /// By default, performs semantic analysis when building the atomic type. 1125 /// Subclasses may override this routine to provide different behavior. 1126 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1127 1128 /// Build a new pipe type given its value type. 1129 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1130 bool isReadPipe); 1131 1132 /// Build a new template name given a nested name specifier, a flag 1133 /// indicating whether the "template" keyword was provided, and the template 1134 /// that the template name refers to. 1135 /// 1136 /// By default, builds the new template name directly. Subclasses may override 1137 /// this routine to provide different behavior. 1138 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1139 bool TemplateKW, 1140 TemplateDecl *Template); 1141 1142 /// Build a new template name given a nested name specifier and the 1143 /// name that is referred to as a template. 1144 /// 1145 /// By default, performs semantic analysis to determine whether the name can 1146 /// be resolved to a specific template, then builds the appropriate kind of 1147 /// template name. Subclasses may override this routine to provide different 1148 /// behavior. 1149 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1150 SourceLocation TemplateKWLoc, 1151 const IdentifierInfo &Name, 1152 SourceLocation NameLoc, QualType ObjectType, 1153 NamedDecl *FirstQualifierInScope, 1154 bool AllowInjectedClassName); 1155 1156 /// Build a new template name given a nested name specifier and the 1157 /// overloaded operator name that is referred to as a template. 1158 /// 1159 /// By default, performs semantic analysis to determine whether the name can 1160 /// be resolved to a specific template, then builds the appropriate kind of 1161 /// template name. Subclasses may override this routine to provide different 1162 /// behavior. 1163 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1164 SourceLocation TemplateKWLoc, 1165 OverloadedOperatorKind Operator, 1166 SourceLocation NameLoc, QualType ObjectType, 1167 bool AllowInjectedClassName); 1168 1169 /// Build a new template name given a template template parameter pack 1170 /// and the 1171 /// 1172 /// By default, performs semantic analysis to determine whether the name can 1173 /// be resolved to a specific template, then builds the appropriate kind of 1174 /// template name. Subclasses may override this routine to provide different 1175 /// behavior. 1176 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1177 const TemplateArgument &ArgPack) { 1178 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1179 } 1180 1181 /// Build a new compound statement. 1182 /// 1183 /// By default, performs semantic analysis to build the new statement. 1184 /// Subclasses may override this routine to provide different behavior. 1185 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1186 MultiStmtArg Statements, 1187 SourceLocation RBraceLoc, 1188 bool IsStmtExpr) { 1189 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1190 IsStmtExpr); 1191 } 1192 1193 /// Build a new case statement. 1194 /// 1195 /// By default, performs semantic analysis to build the new statement. 1196 /// Subclasses may override this routine to provide different behavior. 1197 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1198 Expr *LHS, 1199 SourceLocation EllipsisLoc, 1200 Expr *RHS, 1201 SourceLocation ColonLoc) { 1202 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1203 ColonLoc); 1204 } 1205 1206 /// Attach the body to a new case statement. 1207 /// 1208 /// By default, performs semantic analysis to build the new statement. 1209 /// Subclasses may override this routine to provide different behavior. 1210 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1211 getSema().ActOnCaseStmtBody(S, Body); 1212 return S; 1213 } 1214 1215 /// Build a new default statement. 1216 /// 1217 /// By default, performs semantic analysis to build the new statement. 1218 /// Subclasses may override this routine to provide different behavior. 1219 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1220 SourceLocation ColonLoc, 1221 Stmt *SubStmt) { 1222 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1223 /*CurScope=*/nullptr); 1224 } 1225 1226 /// Build a new label statement. 1227 /// 1228 /// By default, performs semantic analysis to build the new statement. 1229 /// Subclasses may override this routine to provide different behavior. 1230 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1231 SourceLocation ColonLoc, Stmt *SubStmt) { 1232 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1233 } 1234 1235 /// Build a new label statement. 1236 /// 1237 /// By default, performs semantic analysis to build the new statement. 1238 /// Subclasses may override this routine to provide different behavior. 1239 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1240 ArrayRef<const Attr*> Attrs, 1241 Stmt *SubStmt) { 1242 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1243 } 1244 1245 /// Build a new "if" statement. 1246 /// 1247 /// By default, performs semantic analysis to build the new statement. 1248 /// Subclasses may override this routine to provide different behavior. 1249 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1250 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1251 SourceLocation ElseLoc, Stmt *Else) { 1252 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1253 ElseLoc, Else); 1254 } 1255 1256 /// Start building a new switch statement. 1257 /// 1258 /// By default, performs semantic analysis to build the new statement. 1259 /// Subclasses may override this routine to provide different behavior. 1260 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1261 Sema::ConditionResult Cond) { 1262 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1263 } 1264 1265 /// Attach the body to the switch statement. 1266 /// 1267 /// By default, performs semantic analysis to build the new statement. 1268 /// Subclasses may override this routine to provide different behavior. 1269 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1270 Stmt *Switch, Stmt *Body) { 1271 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1272 } 1273 1274 /// Build a new while statement. 1275 /// 1276 /// By default, performs semantic analysis to build the new statement. 1277 /// Subclasses may override this routine to provide different behavior. 1278 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1279 Sema::ConditionResult Cond, Stmt *Body) { 1280 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1281 } 1282 1283 /// Build a new do-while statement. 1284 /// 1285 /// By default, performs semantic analysis to build the new statement. 1286 /// Subclasses may override this routine to provide different behavior. 1287 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1288 SourceLocation WhileLoc, SourceLocation LParenLoc, 1289 Expr *Cond, SourceLocation RParenLoc) { 1290 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1291 Cond, RParenLoc); 1292 } 1293 1294 /// Build a new for statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1299 Stmt *Init, Sema::ConditionResult Cond, 1300 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1301 Stmt *Body) { 1302 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1303 Inc, RParenLoc, Body); 1304 } 1305 1306 /// Build a new goto statement. 1307 /// 1308 /// By default, performs semantic analysis to build the new statement. 1309 /// Subclasses may override this routine to provide different behavior. 1310 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1311 LabelDecl *Label) { 1312 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1313 } 1314 1315 /// Build a new indirect goto statement. 1316 /// 1317 /// By default, performs semantic analysis to build the new statement. 1318 /// Subclasses may override this routine to provide different behavior. 1319 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1320 SourceLocation StarLoc, 1321 Expr *Target) { 1322 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1323 } 1324 1325 /// Build a new return statement. 1326 /// 1327 /// By default, performs semantic analysis to build the new statement. 1328 /// Subclasses may override this routine to provide different behavior. 1329 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1330 return getSema().BuildReturnStmt(ReturnLoc, Result); 1331 } 1332 1333 /// Build a new declaration statement. 1334 /// 1335 /// By default, performs semantic analysis to build the new statement. 1336 /// Subclasses may override this routine to provide different behavior. 1337 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1338 SourceLocation StartLoc, SourceLocation EndLoc) { 1339 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1340 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1341 } 1342 1343 /// Build a new inline asm statement. 1344 /// 1345 /// By default, performs semantic analysis to build the new statement. 1346 /// Subclasses may override this routine to provide different behavior. 1347 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1348 bool IsVolatile, unsigned NumOutputs, 1349 unsigned NumInputs, IdentifierInfo **Names, 1350 MultiExprArg Constraints, MultiExprArg Exprs, 1351 Expr *AsmString, MultiExprArg Clobbers, 1352 SourceLocation RParenLoc) { 1353 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1354 NumInputs, Names, Constraints, Exprs, 1355 AsmString, Clobbers, RParenLoc); 1356 } 1357 1358 /// Build a new MS style inline asm statement. 1359 /// 1360 /// By default, performs semantic analysis to build the new statement. 1361 /// Subclasses may override this routine to provide different behavior. 1362 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1363 ArrayRef<Token> AsmToks, 1364 StringRef AsmString, 1365 unsigned NumOutputs, unsigned NumInputs, 1366 ArrayRef<StringRef> Constraints, 1367 ArrayRef<StringRef> Clobbers, 1368 ArrayRef<Expr*> Exprs, 1369 SourceLocation EndLoc) { 1370 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1371 NumOutputs, NumInputs, 1372 Constraints, Clobbers, Exprs, EndLoc); 1373 } 1374 1375 /// Build a new co_return statement. 1376 /// 1377 /// By default, performs semantic analysis to build the new statement. 1378 /// Subclasses may override this routine to provide different behavior. 1379 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1380 bool IsImplicit) { 1381 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1382 } 1383 1384 /// Build a new co_await expression. 1385 /// 1386 /// By default, performs semantic analysis to build the new expression. 1387 /// Subclasses may override this routine to provide different behavior. 1388 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1389 bool IsImplicit) { 1390 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1391 } 1392 1393 /// Build a new co_await expression. 1394 /// 1395 /// By default, performs semantic analysis to build the new expression. 1396 /// Subclasses may override this routine to provide different behavior. 1397 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1398 Expr *Result, 1399 UnresolvedLookupExpr *Lookup) { 1400 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1401 } 1402 1403 /// Build a new co_yield expression. 1404 /// 1405 /// By default, performs semantic analysis to build the new expression. 1406 /// Subclasses may override this routine to provide different behavior. 1407 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1408 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1409 } 1410 1411 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1412 return getSema().BuildCoroutineBodyStmt(Args); 1413 } 1414 1415 /// Build a new Objective-C \@try statement. 1416 /// 1417 /// By default, performs semantic analysis to build the new statement. 1418 /// Subclasses may override this routine to provide different behavior. 1419 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1420 Stmt *TryBody, 1421 MultiStmtArg CatchStmts, 1422 Stmt *Finally) { 1423 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1424 Finally); 1425 } 1426 1427 /// Rebuild an Objective-C exception declaration. 1428 /// 1429 /// By default, performs semantic analysis to build the new declaration. 1430 /// Subclasses may override this routine to provide different behavior. 1431 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1432 TypeSourceInfo *TInfo, QualType T) { 1433 return getSema().BuildObjCExceptionDecl(TInfo, T, 1434 ExceptionDecl->getInnerLocStart(), 1435 ExceptionDecl->getLocation(), 1436 ExceptionDecl->getIdentifier()); 1437 } 1438 1439 /// Build a new Objective-C \@catch statement. 1440 /// 1441 /// By default, performs semantic analysis to build the new statement. 1442 /// Subclasses may override this routine to provide different behavior. 1443 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1444 SourceLocation RParenLoc, 1445 VarDecl *Var, 1446 Stmt *Body) { 1447 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1448 Var, Body); 1449 } 1450 1451 /// Build a new Objective-C \@finally statement. 1452 /// 1453 /// By default, performs semantic analysis to build the new statement. 1454 /// Subclasses may override this routine to provide different behavior. 1455 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1456 Stmt *Body) { 1457 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1458 } 1459 1460 /// Build a new Objective-C \@throw statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1465 Expr *Operand) { 1466 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1467 } 1468 1469 /// Build a new OpenMP executable directive. 1470 /// 1471 /// By default, performs semantic analysis to build the new statement. 1472 /// Subclasses may override this routine to provide different behavior. 1473 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1474 DeclarationNameInfo DirName, 1475 OpenMPDirectiveKind CancelRegion, 1476 ArrayRef<OMPClause *> Clauses, 1477 Stmt *AStmt, SourceLocation StartLoc, 1478 SourceLocation EndLoc) { 1479 return getSema().ActOnOpenMPExecutableDirective( 1480 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1481 } 1482 1483 /// Build a new OpenMP 'if' clause. 1484 /// 1485 /// By default, performs semantic analysis to build the new OpenMP clause. 1486 /// Subclasses may override this routine to provide different behavior. 1487 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1488 Expr *Condition, SourceLocation StartLoc, 1489 SourceLocation LParenLoc, 1490 SourceLocation NameModifierLoc, 1491 SourceLocation ColonLoc, 1492 SourceLocation EndLoc) { 1493 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1494 LParenLoc, NameModifierLoc, ColonLoc, 1495 EndLoc); 1496 } 1497 1498 /// Build a new OpenMP 'final' clause. 1499 /// 1500 /// By default, performs semantic analysis to build the new OpenMP clause. 1501 /// Subclasses may override this routine to provide different behavior. 1502 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1503 SourceLocation LParenLoc, 1504 SourceLocation EndLoc) { 1505 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1506 EndLoc); 1507 } 1508 1509 /// Build a new OpenMP 'num_threads' clause. 1510 /// 1511 /// By default, performs semantic analysis to build the new OpenMP clause. 1512 /// Subclasses may override this routine to provide different behavior. 1513 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1514 SourceLocation StartLoc, 1515 SourceLocation LParenLoc, 1516 SourceLocation EndLoc) { 1517 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1518 LParenLoc, EndLoc); 1519 } 1520 1521 /// Build a new OpenMP 'safelen' clause. 1522 /// 1523 /// By default, performs semantic analysis to build the new OpenMP clause. 1524 /// Subclasses may override this routine to provide different behavior. 1525 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1526 SourceLocation LParenLoc, 1527 SourceLocation EndLoc) { 1528 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1529 } 1530 1531 /// Build a new OpenMP 'simdlen' clause. 1532 /// 1533 /// By default, performs semantic analysis to build the new OpenMP clause. 1534 /// Subclasses may override this routine to provide different behavior. 1535 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1536 SourceLocation LParenLoc, 1537 SourceLocation EndLoc) { 1538 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1539 } 1540 1541 /// Build a new OpenMP 'collapse' clause. 1542 /// 1543 /// By default, performs semantic analysis to build the new OpenMP clause. 1544 /// Subclasses may override this routine to provide different behavior. 1545 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1546 SourceLocation LParenLoc, 1547 SourceLocation EndLoc) { 1548 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1549 EndLoc); 1550 } 1551 1552 /// Build a new OpenMP 'default' clause. 1553 /// 1554 /// By default, performs semantic analysis to build the new OpenMP clause. 1555 /// Subclasses may override this routine to provide different behavior. 1556 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1557 SourceLocation KindKwLoc, 1558 SourceLocation StartLoc, 1559 SourceLocation LParenLoc, 1560 SourceLocation EndLoc) { 1561 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1562 StartLoc, LParenLoc, EndLoc); 1563 } 1564 1565 /// Build a new OpenMP 'proc_bind' clause. 1566 /// 1567 /// By default, performs semantic analysis to build the new OpenMP clause. 1568 /// Subclasses may override this routine to provide different behavior. 1569 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1570 SourceLocation KindKwLoc, 1571 SourceLocation StartLoc, 1572 SourceLocation LParenLoc, 1573 SourceLocation EndLoc) { 1574 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1575 StartLoc, LParenLoc, EndLoc); 1576 } 1577 1578 /// Build a new OpenMP 'schedule' clause. 1579 /// 1580 /// By default, performs semantic analysis to build the new OpenMP clause. 1581 /// Subclasses may override this routine to provide different behavior. 1582 OMPClause *RebuildOMPScheduleClause( 1583 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1584 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1585 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1586 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1587 return getSema().ActOnOpenMPScheduleClause( 1588 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1589 CommaLoc, EndLoc); 1590 } 1591 1592 /// Build a new OpenMP 'ordered' clause. 1593 /// 1594 /// By default, performs semantic analysis to build the new OpenMP clause. 1595 /// Subclasses may override this routine to provide different behavior. 1596 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1597 SourceLocation EndLoc, 1598 SourceLocation LParenLoc, Expr *Num) { 1599 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1600 } 1601 1602 /// Build a new OpenMP 'private' clause. 1603 /// 1604 /// By default, performs semantic analysis to build the new OpenMP clause. 1605 /// Subclasses may override this routine to provide different behavior. 1606 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1611 EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'firstprivate' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1619 SourceLocation StartLoc, 1620 SourceLocation LParenLoc, 1621 SourceLocation EndLoc) { 1622 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1623 EndLoc); 1624 } 1625 1626 /// Build a new OpenMP 'lastprivate' clause. 1627 /// 1628 /// By default, performs semantic analysis to build the new OpenMP clause. 1629 /// Subclasses may override this routine to provide different behavior. 1630 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1631 SourceLocation StartLoc, 1632 SourceLocation LParenLoc, 1633 SourceLocation EndLoc) { 1634 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1635 EndLoc); 1636 } 1637 1638 /// Build a new OpenMP 'shared' clause. 1639 /// 1640 /// By default, performs semantic analysis to build the new OpenMP clause. 1641 /// Subclasses may override this routine to provide different behavior. 1642 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1643 SourceLocation StartLoc, 1644 SourceLocation LParenLoc, 1645 SourceLocation EndLoc) { 1646 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1647 EndLoc); 1648 } 1649 1650 /// Build a new OpenMP 'reduction' clause. 1651 /// 1652 /// By default, performs semantic analysis to build the new statement. 1653 /// Subclasses may override this routine to provide different behavior. 1654 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1655 SourceLocation StartLoc, 1656 SourceLocation LParenLoc, 1657 SourceLocation ColonLoc, 1658 SourceLocation EndLoc, 1659 CXXScopeSpec &ReductionIdScopeSpec, 1660 const DeclarationNameInfo &ReductionId, 1661 ArrayRef<Expr *> UnresolvedReductions) { 1662 return getSema().ActOnOpenMPReductionClause( 1663 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1664 ReductionId, UnresolvedReductions); 1665 } 1666 1667 /// Build a new OpenMP 'task_reduction' clause. 1668 /// 1669 /// By default, performs semantic analysis to build the new statement. 1670 /// Subclasses may override this routine to provide different behavior. 1671 OMPClause *RebuildOMPTaskReductionClause( 1672 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1673 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1674 CXXScopeSpec &ReductionIdScopeSpec, 1675 const DeclarationNameInfo &ReductionId, 1676 ArrayRef<Expr *> UnresolvedReductions) { 1677 return getSema().ActOnOpenMPTaskReductionClause( 1678 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1679 ReductionId, UnresolvedReductions); 1680 } 1681 1682 /// Build a new OpenMP 'in_reduction' clause. 1683 /// 1684 /// By default, performs semantic analysis to build the new statement. 1685 /// Subclasses may override this routine to provide different behavior. 1686 OMPClause * 1687 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1688 SourceLocation LParenLoc, SourceLocation ColonLoc, 1689 SourceLocation EndLoc, 1690 CXXScopeSpec &ReductionIdScopeSpec, 1691 const DeclarationNameInfo &ReductionId, 1692 ArrayRef<Expr *> UnresolvedReductions) { 1693 return getSema().ActOnOpenMPInReductionClause( 1694 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1695 ReductionId, UnresolvedReductions); 1696 } 1697 1698 /// Build a new OpenMP 'linear' clause. 1699 /// 1700 /// By default, performs semantic analysis to build the new OpenMP clause. 1701 /// Subclasses may override this routine to provide different behavior. 1702 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1703 SourceLocation StartLoc, 1704 SourceLocation LParenLoc, 1705 OpenMPLinearClauseKind Modifier, 1706 SourceLocation ModifierLoc, 1707 SourceLocation ColonLoc, 1708 SourceLocation EndLoc) { 1709 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1710 Modifier, ModifierLoc, ColonLoc, 1711 EndLoc); 1712 } 1713 1714 /// Build a new OpenMP 'aligned' clause. 1715 /// 1716 /// By default, performs semantic analysis to build the new OpenMP clause. 1717 /// Subclasses may override this routine to provide different behavior. 1718 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1719 SourceLocation StartLoc, 1720 SourceLocation LParenLoc, 1721 SourceLocation ColonLoc, 1722 SourceLocation EndLoc) { 1723 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1724 LParenLoc, ColonLoc, EndLoc); 1725 } 1726 1727 /// Build a new OpenMP 'copyin' clause. 1728 /// 1729 /// By default, performs semantic analysis to build the new OpenMP clause. 1730 /// Subclasses may override this routine to provide different behavior. 1731 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1732 SourceLocation StartLoc, 1733 SourceLocation LParenLoc, 1734 SourceLocation EndLoc) { 1735 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1736 EndLoc); 1737 } 1738 1739 /// Build a new OpenMP 'copyprivate' clause. 1740 /// 1741 /// By default, performs semantic analysis to build the new OpenMP clause. 1742 /// Subclasses may override this routine to provide different behavior. 1743 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1744 SourceLocation StartLoc, 1745 SourceLocation LParenLoc, 1746 SourceLocation EndLoc) { 1747 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1748 EndLoc); 1749 } 1750 1751 /// Build a new OpenMP 'flush' pseudo clause. 1752 /// 1753 /// By default, performs semantic analysis to build the new OpenMP clause. 1754 /// Subclasses may override this routine to provide different behavior. 1755 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1756 SourceLocation StartLoc, 1757 SourceLocation LParenLoc, 1758 SourceLocation EndLoc) { 1759 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1760 EndLoc); 1761 } 1762 1763 /// Build a new OpenMP 'depend' pseudo clause. 1764 /// 1765 /// By default, performs semantic analysis to build the new OpenMP clause. 1766 /// Subclasses may override this routine to provide different behavior. 1767 OMPClause * 1768 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1769 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1770 SourceLocation StartLoc, SourceLocation LParenLoc, 1771 SourceLocation EndLoc) { 1772 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1773 StartLoc, LParenLoc, EndLoc); 1774 } 1775 1776 /// Build a new OpenMP 'device' clause. 1777 /// 1778 /// By default, performs semantic analysis to build the new statement. 1779 /// Subclasses may override this routine to provide different behavior. 1780 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1781 SourceLocation LParenLoc, 1782 SourceLocation EndLoc) { 1783 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1784 EndLoc); 1785 } 1786 1787 /// Build a new OpenMP 'map' clause. 1788 /// 1789 /// By default, performs semantic analysis to build the new OpenMP clause. 1790 /// Subclasses may override this routine to provide different behavior. 1791 OMPClause * 1792 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1793 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1794 SourceLocation MapLoc, SourceLocation ColonLoc, 1795 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1796 SourceLocation LParenLoc, SourceLocation EndLoc) { 1797 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1798 IsMapTypeImplicit, MapLoc, ColonLoc, 1799 VarList, StartLoc, LParenLoc, EndLoc); 1800 } 1801 1802 /// Build a new OpenMP 'num_teams' clause. 1803 /// 1804 /// By default, performs semantic analysis to build the new statement. 1805 /// Subclasses may override this routine to provide different behavior. 1806 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1807 SourceLocation LParenLoc, 1808 SourceLocation EndLoc) { 1809 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1810 EndLoc); 1811 } 1812 1813 /// Build a new OpenMP 'thread_limit' clause. 1814 /// 1815 /// By default, performs semantic analysis to build the new statement. 1816 /// Subclasses may override this routine to provide different behavior. 1817 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1818 SourceLocation StartLoc, 1819 SourceLocation LParenLoc, 1820 SourceLocation EndLoc) { 1821 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1822 LParenLoc, EndLoc); 1823 } 1824 1825 /// Build a new OpenMP 'priority' clause. 1826 /// 1827 /// By default, performs semantic analysis to build the new statement. 1828 /// Subclasses may override this routine to provide different behavior. 1829 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1830 SourceLocation LParenLoc, 1831 SourceLocation EndLoc) { 1832 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1833 EndLoc); 1834 } 1835 1836 /// Build a new OpenMP 'grainsize' clause. 1837 /// 1838 /// By default, performs semantic analysis to build the new statement. 1839 /// Subclasses may override this routine to provide different behavior. 1840 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1841 SourceLocation LParenLoc, 1842 SourceLocation EndLoc) { 1843 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1844 EndLoc); 1845 } 1846 1847 /// Build a new OpenMP 'num_tasks' clause. 1848 /// 1849 /// By default, performs semantic analysis to build the new statement. 1850 /// Subclasses may override this routine to provide different behavior. 1851 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1852 SourceLocation LParenLoc, 1853 SourceLocation EndLoc) { 1854 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1855 EndLoc); 1856 } 1857 1858 /// Build a new OpenMP 'hint' clause. 1859 /// 1860 /// By default, performs semantic analysis to build the new statement. 1861 /// Subclasses may override this routine to provide different behavior. 1862 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1863 SourceLocation LParenLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1866 } 1867 1868 /// Build a new OpenMP 'dist_schedule' clause. 1869 /// 1870 /// By default, performs semantic analysis to build the new OpenMP clause. 1871 /// Subclasses may override this routine to provide different behavior. 1872 OMPClause * 1873 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1874 Expr *ChunkSize, SourceLocation StartLoc, 1875 SourceLocation LParenLoc, SourceLocation KindLoc, 1876 SourceLocation CommaLoc, SourceLocation EndLoc) { 1877 return getSema().ActOnOpenMPDistScheduleClause( 1878 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1879 } 1880 1881 /// Build a new OpenMP 'to' clause. 1882 /// 1883 /// By default, performs semantic analysis to build the new statement. 1884 /// Subclasses may override this routine to provide different behavior. 1885 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1886 SourceLocation StartLoc, 1887 SourceLocation LParenLoc, 1888 SourceLocation EndLoc) { 1889 return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); 1890 } 1891 1892 /// Build a new OpenMP 'from' clause. 1893 /// 1894 /// By default, performs semantic analysis to build the new statement. 1895 /// Subclasses may override this routine to provide different behavior. 1896 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1897 SourceLocation StartLoc, 1898 SourceLocation LParenLoc, 1899 SourceLocation EndLoc) { 1900 return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, 1901 EndLoc); 1902 } 1903 1904 /// Build a new OpenMP 'use_device_ptr' clause. 1905 /// 1906 /// By default, performs semantic analysis to build the new OpenMP clause. 1907 /// Subclasses may override this routine to provide different behavior. 1908 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1909 SourceLocation StartLoc, 1910 SourceLocation LParenLoc, 1911 SourceLocation EndLoc) { 1912 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc, 1913 EndLoc); 1914 } 1915 1916 /// Build a new OpenMP 'is_device_ptr' clause. 1917 /// 1918 /// By default, performs semantic analysis to build the new OpenMP clause. 1919 /// Subclasses may override this routine to provide different behavior. 1920 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1921 SourceLocation StartLoc, 1922 SourceLocation LParenLoc, 1923 SourceLocation EndLoc) { 1924 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc, 1925 EndLoc); 1926 } 1927 1928 /// Rebuild the operand to an Objective-C \@synchronized statement. 1929 /// 1930 /// By default, performs semantic analysis to build the new statement. 1931 /// Subclasses may override this routine to provide different behavior. 1932 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1933 Expr *object) { 1934 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1935 } 1936 1937 /// Build a new Objective-C \@synchronized statement. 1938 /// 1939 /// By default, performs semantic analysis to build the new statement. 1940 /// Subclasses may override this routine to provide different behavior. 1941 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1942 Expr *Object, Stmt *Body) { 1943 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1944 } 1945 1946 /// Build a new Objective-C \@autoreleasepool statement. 1947 /// 1948 /// By default, performs semantic analysis to build the new statement. 1949 /// Subclasses may override this routine to provide different behavior. 1950 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1951 Stmt *Body) { 1952 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1953 } 1954 1955 /// Build a new Objective-C fast enumeration statement. 1956 /// 1957 /// By default, performs semantic analysis to build the new statement. 1958 /// Subclasses may override this routine to provide different behavior. 1959 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1960 Stmt *Element, 1961 Expr *Collection, 1962 SourceLocation RParenLoc, 1963 Stmt *Body) { 1964 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1965 Element, 1966 Collection, 1967 RParenLoc); 1968 if (ForEachStmt.isInvalid()) 1969 return StmtError(); 1970 1971 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1972 } 1973 1974 /// Build a new C++ exception declaration. 1975 /// 1976 /// By default, performs semantic analysis to build the new decaration. 1977 /// Subclasses may override this routine to provide different behavior. 1978 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1979 TypeSourceInfo *Declarator, 1980 SourceLocation StartLoc, 1981 SourceLocation IdLoc, 1982 IdentifierInfo *Id) { 1983 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1984 StartLoc, IdLoc, Id); 1985 if (Var) 1986 getSema().CurContext->addDecl(Var); 1987 return Var; 1988 } 1989 1990 /// Build a new C++ catch statement. 1991 /// 1992 /// By default, performs semantic analysis to build the new statement. 1993 /// Subclasses may override this routine to provide different behavior. 1994 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1995 VarDecl *ExceptionDecl, 1996 Stmt *Handler) { 1997 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1998 Handler)); 1999 } 2000 2001 /// Build a new C++ try statement. 2002 /// 2003 /// By default, performs semantic analysis to build the new statement. 2004 /// Subclasses may override this routine to provide different behavior. 2005 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2006 ArrayRef<Stmt *> Handlers) { 2007 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2008 } 2009 2010 /// Build a new C++0x range-based for statement. 2011 /// 2012 /// By default, performs semantic analysis to build the new statement. 2013 /// Subclasses may override this routine to provide different behavior. 2014 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2015 SourceLocation CoawaitLoc, 2016 SourceLocation ColonLoc, 2017 Stmt *Range, Stmt *Begin, Stmt *End, 2018 Expr *Cond, Expr *Inc, 2019 Stmt *LoopVar, 2020 SourceLocation RParenLoc) { 2021 // If we've just learned that the range is actually an Objective-C 2022 // collection, treat this as an Objective-C fast enumeration loop. 2023 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2024 if (RangeStmt->isSingleDecl()) { 2025 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2026 if (RangeVar->isInvalidDecl()) 2027 return StmtError(); 2028 2029 Expr *RangeExpr = RangeVar->getInit(); 2030 if (!RangeExpr->isTypeDependent() && 2031 RangeExpr->getType()->isObjCObjectPointerType()) 2032 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 2033 RParenLoc); 2034 } 2035 } 2036 } 2037 2038 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc, 2039 Range, Begin, End, 2040 Cond, Inc, LoopVar, RParenLoc, 2041 Sema::BFRK_Rebuild); 2042 } 2043 2044 /// Build a new C++0x range-based for statement. 2045 /// 2046 /// By default, performs semantic analysis to build the new statement. 2047 /// Subclasses may override this routine to provide different behavior. 2048 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2049 bool IsIfExists, 2050 NestedNameSpecifierLoc QualifierLoc, 2051 DeclarationNameInfo NameInfo, 2052 Stmt *Nested) { 2053 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2054 QualifierLoc, NameInfo, Nested); 2055 } 2056 2057 /// Attach body to a C++0x range-based for statement. 2058 /// 2059 /// By default, performs semantic analysis to finish the new statement. 2060 /// Subclasses may override this routine to provide different behavior. 2061 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2062 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2063 } 2064 2065 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2066 Stmt *TryBlock, Stmt *Handler) { 2067 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2068 } 2069 2070 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2071 Stmt *Block) { 2072 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2073 } 2074 2075 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2076 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2077 } 2078 2079 /// Build a new predefined expression. 2080 /// 2081 /// By default, performs semantic analysis to build the new expression. 2082 /// Subclasses may override this routine to provide different behavior. 2083 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2084 PredefinedExpr::IdentType IT) { 2085 return getSema().BuildPredefinedExpr(Loc, IT); 2086 } 2087 2088 /// Build a new expression that references a declaration. 2089 /// 2090 /// By default, performs semantic analysis to build the new expression. 2091 /// Subclasses may override this routine to provide different behavior. 2092 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2093 LookupResult &R, 2094 bool RequiresADL) { 2095 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2096 } 2097 2098 2099 /// Build a new expression that references a declaration. 2100 /// 2101 /// By default, performs semantic analysis to build the new expression. 2102 /// Subclasses may override this routine to provide different behavior. 2103 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2104 ValueDecl *VD, 2105 const DeclarationNameInfo &NameInfo, 2106 TemplateArgumentListInfo *TemplateArgs) { 2107 CXXScopeSpec SS; 2108 SS.Adopt(QualifierLoc); 2109 2110 // FIXME: loses template args. 2111 2112 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2113 } 2114 2115 /// Build a new expression in parentheses. 2116 /// 2117 /// By default, performs semantic analysis to build the new expression. 2118 /// Subclasses may override this routine to provide different behavior. 2119 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2120 SourceLocation RParen) { 2121 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2122 } 2123 2124 /// Build a new pseudo-destructor expression. 2125 /// 2126 /// By default, performs semantic analysis to build the new expression. 2127 /// Subclasses may override this routine to provide different behavior. 2128 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2129 SourceLocation OperatorLoc, 2130 bool isArrow, 2131 CXXScopeSpec &SS, 2132 TypeSourceInfo *ScopeType, 2133 SourceLocation CCLoc, 2134 SourceLocation TildeLoc, 2135 PseudoDestructorTypeStorage Destroyed); 2136 2137 /// Build a new unary operator 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 RebuildUnaryOperator(SourceLocation OpLoc, 2142 UnaryOperatorKind Opc, 2143 Expr *SubExpr) { 2144 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2145 } 2146 2147 /// Build a new builtin offsetof expression. 2148 /// 2149 /// By default, performs semantic analysis to build the new expression. 2150 /// Subclasses may override this routine to provide different behavior. 2151 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2152 TypeSourceInfo *Type, 2153 ArrayRef<Sema::OffsetOfComponent> Components, 2154 SourceLocation RParenLoc) { 2155 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2156 RParenLoc); 2157 } 2158 2159 /// Build a new sizeof, alignof or vec_step expression with a 2160 /// type argument. 2161 /// 2162 /// By default, performs semantic analysis to build the new expression. 2163 /// Subclasses may override this routine to provide different behavior. 2164 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2165 SourceLocation OpLoc, 2166 UnaryExprOrTypeTrait ExprKind, 2167 SourceRange R) { 2168 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2169 } 2170 2171 /// Build a new sizeof, alignof or vec step expression with an 2172 /// expression argument. 2173 /// 2174 /// By default, performs semantic analysis to build the new expression. 2175 /// Subclasses may override this routine to provide different behavior. 2176 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2177 UnaryExprOrTypeTrait ExprKind, 2178 SourceRange R) { 2179 ExprResult Result 2180 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2181 if (Result.isInvalid()) 2182 return ExprError(); 2183 2184 return Result; 2185 } 2186 2187 /// Build a new array subscript expression. 2188 /// 2189 /// By default, performs semantic analysis to build the new expression. 2190 /// Subclasses may override this routine to provide different behavior. 2191 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2192 SourceLocation LBracketLoc, 2193 Expr *RHS, 2194 SourceLocation RBracketLoc) { 2195 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2196 LBracketLoc, RHS, 2197 RBracketLoc); 2198 } 2199 2200 /// Build a new array section 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 RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2205 Expr *LowerBound, 2206 SourceLocation ColonLoc, Expr *Length, 2207 SourceLocation RBracketLoc) { 2208 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2209 ColonLoc, Length, RBracketLoc); 2210 } 2211 2212 /// Build a new call expression. 2213 /// 2214 /// By default, performs semantic analysis to build the new expression. 2215 /// Subclasses may override this routine to provide different behavior. 2216 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2217 MultiExprArg Args, 2218 SourceLocation RParenLoc, 2219 Expr *ExecConfig = nullptr) { 2220 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2221 Args, RParenLoc, ExecConfig); 2222 } 2223 2224 /// Build a new member access expression. 2225 /// 2226 /// By default, performs semantic analysis to build the new expression. 2227 /// Subclasses may override this routine to provide different behavior. 2228 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2229 bool isArrow, 2230 NestedNameSpecifierLoc QualifierLoc, 2231 SourceLocation TemplateKWLoc, 2232 const DeclarationNameInfo &MemberNameInfo, 2233 ValueDecl *Member, 2234 NamedDecl *FoundDecl, 2235 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2236 NamedDecl *FirstQualifierInScope) { 2237 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2238 isArrow); 2239 if (!Member->getDeclName()) { 2240 // We have a reference to an unnamed field. This is always the 2241 // base of an anonymous struct/union member access, i.e. the 2242 // field is always of record type. 2243 assert(Member->getType()->isRecordType() && 2244 "unnamed member not of record type?"); 2245 2246 BaseResult = 2247 getSema().PerformObjectMemberConversion(BaseResult.get(), 2248 QualifierLoc.getNestedNameSpecifier(), 2249 FoundDecl, Member); 2250 if (BaseResult.isInvalid()) 2251 return ExprError(); 2252 Base = BaseResult.get(); 2253 2254 CXXScopeSpec EmptySS; 2255 return getSema().BuildFieldReferenceExpr( 2256 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2257 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2258 } 2259 2260 CXXScopeSpec SS; 2261 SS.Adopt(QualifierLoc); 2262 2263 Base = BaseResult.get(); 2264 QualType BaseType = Base->getType(); 2265 2266 if (isArrow && !BaseType->isPointerType()) 2267 return ExprError(); 2268 2269 // FIXME: this involves duplicating earlier analysis in a lot of 2270 // cases; we should avoid this when possible. 2271 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2272 R.addDecl(FoundDecl); 2273 R.resolveKind(); 2274 2275 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2276 SS, TemplateKWLoc, 2277 FirstQualifierInScope, 2278 R, ExplicitTemplateArgs, 2279 /*S*/nullptr); 2280 } 2281 2282 /// Build a new binary operator expression. 2283 /// 2284 /// By default, performs semantic analysis to build the new expression. 2285 /// Subclasses may override this routine to provide different behavior. 2286 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2287 BinaryOperatorKind Opc, 2288 Expr *LHS, Expr *RHS) { 2289 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2290 } 2291 2292 /// Build a new conditional operator expression. 2293 /// 2294 /// By default, performs semantic analysis to build the new expression. 2295 /// Subclasses may override this routine to provide different behavior. 2296 ExprResult RebuildConditionalOperator(Expr *Cond, 2297 SourceLocation QuestionLoc, 2298 Expr *LHS, 2299 SourceLocation ColonLoc, 2300 Expr *RHS) { 2301 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2302 LHS, RHS); 2303 } 2304 2305 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2310 TypeSourceInfo *TInfo, 2311 SourceLocation RParenLoc, 2312 Expr *SubExpr) { 2313 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2314 SubExpr); 2315 } 2316 2317 /// Build a new compound literal expression. 2318 /// 2319 /// By default, performs semantic analysis to build the new expression. 2320 /// Subclasses may override this routine to provide different behavior. 2321 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2322 TypeSourceInfo *TInfo, 2323 SourceLocation RParenLoc, 2324 Expr *Init) { 2325 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2326 Init); 2327 } 2328 2329 /// Build a new extended vector element access expression. 2330 /// 2331 /// By default, performs semantic analysis to build the new expression. 2332 /// Subclasses may override this routine to provide different behavior. 2333 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2334 SourceLocation OpLoc, 2335 SourceLocation AccessorLoc, 2336 IdentifierInfo &Accessor) { 2337 2338 CXXScopeSpec SS; 2339 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2340 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2341 OpLoc, /*IsArrow*/ false, 2342 SS, SourceLocation(), 2343 /*FirstQualifierInScope*/ nullptr, 2344 NameInfo, 2345 /* TemplateArgs */ nullptr, 2346 /*S*/ nullptr); 2347 } 2348 2349 /// Build a new initializer list expression. 2350 /// 2351 /// By default, performs semantic analysis to build the new expression. 2352 /// Subclasses may override this routine to provide different behavior. 2353 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2354 MultiExprArg Inits, 2355 SourceLocation RBraceLoc) { 2356 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2357 } 2358 2359 /// Build a new designated initializer expression. 2360 /// 2361 /// By default, performs semantic analysis to build the new expression. 2362 /// Subclasses may override this routine to provide different behavior. 2363 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2364 MultiExprArg ArrayExprs, 2365 SourceLocation EqualOrColonLoc, 2366 bool GNUSyntax, 2367 Expr *Init) { 2368 ExprResult Result 2369 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2370 Init); 2371 if (Result.isInvalid()) 2372 return ExprError(); 2373 2374 return Result; 2375 } 2376 2377 /// Build a new value-initialized expression. 2378 /// 2379 /// By default, builds the implicit value initialization without performing 2380 /// any semantic analysis. Subclasses may override this routine to provide 2381 /// different behavior. 2382 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2383 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2384 } 2385 2386 /// Build a new \c va_arg expression. 2387 /// 2388 /// By default, performs semantic analysis to build the new expression. 2389 /// Subclasses may override this routine to provide different behavior. 2390 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2391 Expr *SubExpr, TypeSourceInfo *TInfo, 2392 SourceLocation RParenLoc) { 2393 return getSema().BuildVAArgExpr(BuiltinLoc, 2394 SubExpr, TInfo, 2395 RParenLoc); 2396 } 2397 2398 /// Build a new expression list in parentheses. 2399 /// 2400 /// By default, performs semantic analysis to build the new expression. 2401 /// Subclasses may override this routine to provide different behavior. 2402 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2403 MultiExprArg SubExprs, 2404 SourceLocation RParenLoc) { 2405 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2406 } 2407 2408 /// Build a new address-of-label expression. 2409 /// 2410 /// By default, performs semantic analysis, using the name of the label 2411 /// rather than attempting to map the label statement itself. 2412 /// Subclasses may override this routine to provide different behavior. 2413 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2414 SourceLocation LabelLoc, LabelDecl *Label) { 2415 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2416 } 2417 2418 /// Build a new GNU statement expression. 2419 /// 2420 /// By default, performs semantic analysis to build the new expression. 2421 /// Subclasses may override this routine to provide different behavior. 2422 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2423 Stmt *SubStmt, 2424 SourceLocation RParenLoc) { 2425 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2426 } 2427 2428 /// Build a new __builtin_choose_expr expression. 2429 /// 2430 /// By default, performs semantic analysis to build the new expression. 2431 /// Subclasses may override this routine to provide different behavior. 2432 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2433 Expr *Cond, Expr *LHS, Expr *RHS, 2434 SourceLocation RParenLoc) { 2435 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2436 Cond, LHS, RHS, 2437 RParenLoc); 2438 } 2439 2440 /// Build a new generic selection expression. 2441 /// 2442 /// By default, performs semantic analysis to build the new expression. 2443 /// Subclasses may override this routine to provide different behavior. 2444 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2445 SourceLocation DefaultLoc, 2446 SourceLocation RParenLoc, 2447 Expr *ControllingExpr, 2448 ArrayRef<TypeSourceInfo *> Types, 2449 ArrayRef<Expr *> Exprs) { 2450 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2451 ControllingExpr, Types, Exprs); 2452 } 2453 2454 /// Build a new overloaded operator call expression. 2455 /// 2456 /// By default, performs semantic analysis to build the new expression. 2457 /// The semantic analysis provides the behavior of template instantiation, 2458 /// copying with transformations that turn what looks like an overloaded 2459 /// operator call into a use of a builtin operator, performing 2460 /// argument-dependent lookup, etc. Subclasses may override this routine to 2461 /// provide different behavior. 2462 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2463 SourceLocation OpLoc, 2464 Expr *Callee, 2465 Expr *First, 2466 Expr *Second); 2467 2468 /// Build a new C++ "named" cast expression, such as static_cast or 2469 /// reinterpret_cast. 2470 /// 2471 /// By default, this routine dispatches to one of the more-specific routines 2472 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2473 /// Subclasses may override this routine to provide different behavior. 2474 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2475 Stmt::StmtClass Class, 2476 SourceLocation LAngleLoc, 2477 TypeSourceInfo *TInfo, 2478 SourceLocation RAngleLoc, 2479 SourceLocation LParenLoc, 2480 Expr *SubExpr, 2481 SourceLocation RParenLoc) { 2482 switch (Class) { 2483 case Stmt::CXXStaticCastExprClass: 2484 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2485 RAngleLoc, LParenLoc, 2486 SubExpr, RParenLoc); 2487 2488 case Stmt::CXXDynamicCastExprClass: 2489 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2490 RAngleLoc, LParenLoc, 2491 SubExpr, RParenLoc); 2492 2493 case Stmt::CXXReinterpretCastExprClass: 2494 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2495 RAngleLoc, LParenLoc, 2496 SubExpr, 2497 RParenLoc); 2498 2499 case Stmt::CXXConstCastExprClass: 2500 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2501 RAngleLoc, LParenLoc, 2502 SubExpr, RParenLoc); 2503 2504 default: 2505 llvm_unreachable("Invalid C++ named cast"); 2506 } 2507 } 2508 2509 /// Build a new C++ static_cast expression. 2510 /// 2511 /// By default, performs semantic analysis to build the new expression. 2512 /// Subclasses may override this routine to provide different behavior. 2513 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2514 SourceLocation LAngleLoc, 2515 TypeSourceInfo *TInfo, 2516 SourceLocation RAngleLoc, 2517 SourceLocation LParenLoc, 2518 Expr *SubExpr, 2519 SourceLocation RParenLoc) { 2520 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2521 TInfo, SubExpr, 2522 SourceRange(LAngleLoc, RAngleLoc), 2523 SourceRange(LParenLoc, RParenLoc)); 2524 } 2525 2526 /// Build a new C++ dynamic_cast expression. 2527 /// 2528 /// By default, performs semantic analysis to build the new expression. 2529 /// Subclasses may override this routine to provide different behavior. 2530 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2531 SourceLocation LAngleLoc, 2532 TypeSourceInfo *TInfo, 2533 SourceLocation RAngleLoc, 2534 SourceLocation LParenLoc, 2535 Expr *SubExpr, 2536 SourceLocation RParenLoc) { 2537 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2538 TInfo, SubExpr, 2539 SourceRange(LAngleLoc, RAngleLoc), 2540 SourceRange(LParenLoc, RParenLoc)); 2541 } 2542 2543 /// Build a new C++ reinterpret_cast expression. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2548 SourceLocation LAngleLoc, 2549 TypeSourceInfo *TInfo, 2550 SourceLocation RAngleLoc, 2551 SourceLocation LParenLoc, 2552 Expr *SubExpr, 2553 SourceLocation RParenLoc) { 2554 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2555 TInfo, SubExpr, 2556 SourceRange(LAngleLoc, RAngleLoc), 2557 SourceRange(LParenLoc, RParenLoc)); 2558 } 2559 2560 /// Build a new C++ const_cast expression. 2561 /// 2562 /// By default, performs semantic analysis to build the new expression. 2563 /// Subclasses may override this routine to provide different behavior. 2564 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2565 SourceLocation LAngleLoc, 2566 TypeSourceInfo *TInfo, 2567 SourceLocation RAngleLoc, 2568 SourceLocation LParenLoc, 2569 Expr *SubExpr, 2570 SourceLocation RParenLoc) { 2571 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2572 TInfo, SubExpr, 2573 SourceRange(LAngleLoc, RAngleLoc), 2574 SourceRange(LParenLoc, RParenLoc)); 2575 } 2576 2577 /// Build a new C++ functional-style cast expression. 2578 /// 2579 /// By default, performs semantic analysis to build the new expression. 2580 /// Subclasses may override this routine to provide different behavior. 2581 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2582 SourceLocation LParenLoc, 2583 Expr *Sub, 2584 SourceLocation RParenLoc, 2585 bool ListInitialization) { 2586 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2587 MultiExprArg(&Sub, 1), RParenLoc, 2588 ListInitialization); 2589 } 2590 2591 /// Build a new C++ typeid(type) expression. 2592 /// 2593 /// By default, performs semantic analysis to build the new expression. 2594 /// Subclasses may override this routine to provide different behavior. 2595 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2596 SourceLocation TypeidLoc, 2597 TypeSourceInfo *Operand, 2598 SourceLocation RParenLoc) { 2599 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2600 RParenLoc); 2601 } 2602 2603 2604 /// Build a new C++ typeid(expr) 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 Expr *Operand, 2611 SourceLocation RParenLoc) { 2612 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2613 RParenLoc); 2614 } 2615 2616 /// Build a new C++ __uuidof(type) expression. 2617 /// 2618 /// By default, performs semantic analysis to build the new expression. 2619 /// Subclasses may override this routine to provide different behavior. 2620 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2621 SourceLocation TypeidLoc, 2622 TypeSourceInfo *Operand, 2623 SourceLocation RParenLoc) { 2624 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2625 RParenLoc); 2626 } 2627 2628 /// Build a new C++ __uuidof(expr) expression. 2629 /// 2630 /// By default, performs semantic analysis to build the new expression. 2631 /// Subclasses may override this routine to provide different behavior. 2632 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2633 SourceLocation TypeidLoc, 2634 Expr *Operand, 2635 SourceLocation RParenLoc) { 2636 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2637 RParenLoc); 2638 } 2639 2640 /// Build a new C++ "this" expression. 2641 /// 2642 /// By default, builds a new "this" expression without performing any 2643 /// semantic analysis. Subclasses may override this routine to provide 2644 /// different behavior. 2645 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2646 QualType ThisType, 2647 bool isImplicit) { 2648 getSema().CheckCXXThisCapture(ThisLoc); 2649 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2650 } 2651 2652 /// Build a new C++ throw expression. 2653 /// 2654 /// By default, performs semantic analysis to build the new expression. 2655 /// Subclasses may override this routine to provide different behavior. 2656 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2657 bool IsThrownVariableInScope) { 2658 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2659 } 2660 2661 /// Build a new C++ default-argument expression. 2662 /// 2663 /// By default, builds a new default-argument expression, which does not 2664 /// require any semantic analysis. Subclasses may override this routine to 2665 /// provide different behavior. 2666 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2667 ParmVarDecl *Param) { 2668 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2669 } 2670 2671 /// Build a new C++11 default-initialization expression. 2672 /// 2673 /// By default, builds a new default field initialization expression, which 2674 /// does not require any semantic analysis. Subclasses may override this 2675 /// routine to provide different behavior. 2676 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2677 FieldDecl *Field) { 2678 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2679 } 2680 2681 /// Build a new C++ zero-initialization expression. 2682 /// 2683 /// By default, performs semantic analysis to build the new expression. 2684 /// Subclasses may override this routine to provide different behavior. 2685 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2686 SourceLocation LParenLoc, 2687 SourceLocation RParenLoc) { 2688 return getSema().BuildCXXTypeConstructExpr( 2689 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2690 } 2691 2692 /// Build a new C++ "new" expression. 2693 /// 2694 /// By default, performs semantic analysis to build the new expression. 2695 /// Subclasses may override this routine to provide different behavior. 2696 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2697 bool UseGlobal, 2698 SourceLocation PlacementLParen, 2699 MultiExprArg PlacementArgs, 2700 SourceLocation PlacementRParen, 2701 SourceRange TypeIdParens, 2702 QualType AllocatedType, 2703 TypeSourceInfo *AllocatedTypeInfo, 2704 Expr *ArraySize, 2705 SourceRange DirectInitRange, 2706 Expr *Initializer) { 2707 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2708 PlacementLParen, 2709 PlacementArgs, 2710 PlacementRParen, 2711 TypeIdParens, 2712 AllocatedType, 2713 AllocatedTypeInfo, 2714 ArraySize, 2715 DirectInitRange, 2716 Initializer); 2717 } 2718 2719 /// Build a new C++ "delete" expression. 2720 /// 2721 /// By default, performs semantic analysis to build the new expression. 2722 /// Subclasses may override this routine to provide different behavior. 2723 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2724 bool IsGlobalDelete, 2725 bool IsArrayForm, 2726 Expr *Operand) { 2727 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2728 Operand); 2729 } 2730 2731 /// Build a new type trait expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildTypeTrait(TypeTrait Trait, 2736 SourceLocation StartLoc, 2737 ArrayRef<TypeSourceInfo *> Args, 2738 SourceLocation RParenLoc) { 2739 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2740 } 2741 2742 /// Build a new array type trait expression. 2743 /// 2744 /// By default, performs semantic analysis to build the new expression. 2745 /// Subclasses may override this routine to provide different behavior. 2746 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2747 SourceLocation StartLoc, 2748 TypeSourceInfo *TSInfo, 2749 Expr *DimExpr, 2750 SourceLocation RParenLoc) { 2751 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2752 } 2753 2754 /// Build a new expression trait expression. 2755 /// 2756 /// By default, performs semantic analysis to build the new expression. 2757 /// Subclasses may override this routine to provide different behavior. 2758 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2759 SourceLocation StartLoc, 2760 Expr *Queried, 2761 SourceLocation RParenLoc) { 2762 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2763 } 2764 2765 /// Build a new (previously unresolved) declaration reference 2766 /// expression. 2767 /// 2768 /// By default, performs semantic analysis to build the new expression. 2769 /// Subclasses may override this routine to provide different behavior. 2770 ExprResult RebuildDependentScopeDeclRefExpr( 2771 NestedNameSpecifierLoc QualifierLoc, 2772 SourceLocation TemplateKWLoc, 2773 const DeclarationNameInfo &NameInfo, 2774 const TemplateArgumentListInfo *TemplateArgs, 2775 bool IsAddressOfOperand, 2776 TypeSourceInfo **RecoveryTSI) { 2777 CXXScopeSpec SS; 2778 SS.Adopt(QualifierLoc); 2779 2780 if (TemplateArgs || TemplateKWLoc.isValid()) 2781 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2782 TemplateArgs); 2783 2784 return getSema().BuildQualifiedDeclarationNameExpr( 2785 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2786 } 2787 2788 /// Build a new template-id expression. 2789 /// 2790 /// By default, performs semantic analysis to build the new expression. 2791 /// Subclasses may override this routine to provide different behavior. 2792 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2793 SourceLocation TemplateKWLoc, 2794 LookupResult &R, 2795 bool RequiresADL, 2796 const TemplateArgumentListInfo *TemplateArgs) { 2797 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2798 TemplateArgs); 2799 } 2800 2801 /// Build a new object-construction 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 RebuildCXXConstructExpr(QualType T, 2806 SourceLocation Loc, 2807 CXXConstructorDecl *Constructor, 2808 bool IsElidable, 2809 MultiExprArg Args, 2810 bool HadMultipleCandidates, 2811 bool ListInitialization, 2812 bool StdInitListInitialization, 2813 bool RequiresZeroInit, 2814 CXXConstructExpr::ConstructionKind ConstructKind, 2815 SourceRange ParenRange) { 2816 SmallVector<Expr*, 8> ConvertedArgs; 2817 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2818 ConvertedArgs)) 2819 return ExprError(); 2820 2821 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2822 IsElidable, 2823 ConvertedArgs, 2824 HadMultipleCandidates, 2825 ListInitialization, 2826 StdInitListInitialization, 2827 RequiresZeroInit, ConstructKind, 2828 ParenRange); 2829 } 2830 2831 /// Build a new implicit construction via inherited constructor 2832 /// expression. 2833 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2834 CXXConstructorDecl *Constructor, 2835 bool ConstructsVBase, 2836 bool InheritedFromVBase) { 2837 return new (getSema().Context) CXXInheritedCtorInitExpr( 2838 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2839 } 2840 2841 /// Build a new object-construction expression. 2842 /// 2843 /// By default, performs semantic analysis to build the new expression. 2844 /// Subclasses may override this routine to provide different behavior. 2845 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2846 SourceLocation LParenOrBraceLoc, 2847 MultiExprArg Args, 2848 SourceLocation RParenOrBraceLoc, 2849 bool ListInitialization) { 2850 return getSema().BuildCXXTypeConstructExpr( 2851 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 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 RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2859 SourceLocation LParenLoc, 2860 MultiExprArg Args, 2861 SourceLocation RParenLoc, 2862 bool ListInitialization) { 2863 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2864 RParenLoc, ListInitialization); 2865 } 2866 2867 /// Build a new member reference 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 RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2872 QualType BaseType, 2873 bool IsArrow, 2874 SourceLocation OperatorLoc, 2875 NestedNameSpecifierLoc QualifierLoc, 2876 SourceLocation TemplateKWLoc, 2877 NamedDecl *FirstQualifierInScope, 2878 const DeclarationNameInfo &MemberNameInfo, 2879 const TemplateArgumentListInfo *TemplateArgs) { 2880 CXXScopeSpec SS; 2881 SS.Adopt(QualifierLoc); 2882 2883 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2884 OperatorLoc, IsArrow, 2885 SS, TemplateKWLoc, 2886 FirstQualifierInScope, 2887 MemberNameInfo, 2888 TemplateArgs, /*S*/nullptr); 2889 } 2890 2891 /// Build a new member reference expression. 2892 /// 2893 /// By default, performs semantic analysis to build the new expression. 2894 /// Subclasses may override this routine to provide different behavior. 2895 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2896 SourceLocation OperatorLoc, 2897 bool IsArrow, 2898 NestedNameSpecifierLoc QualifierLoc, 2899 SourceLocation TemplateKWLoc, 2900 NamedDecl *FirstQualifierInScope, 2901 LookupResult &R, 2902 const TemplateArgumentListInfo *TemplateArgs) { 2903 CXXScopeSpec SS; 2904 SS.Adopt(QualifierLoc); 2905 2906 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2907 OperatorLoc, IsArrow, 2908 SS, TemplateKWLoc, 2909 FirstQualifierInScope, 2910 R, TemplateArgs, /*S*/nullptr); 2911 } 2912 2913 /// Build a new noexcept expression. 2914 /// 2915 /// By default, performs semantic analysis to build the new expression. 2916 /// Subclasses may override this routine to provide different behavior. 2917 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2918 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2919 } 2920 2921 /// Build a new expression to compute the length of a parameter pack. 2922 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2923 NamedDecl *Pack, 2924 SourceLocation PackLoc, 2925 SourceLocation RParenLoc, 2926 Optional<unsigned> Length, 2927 ArrayRef<TemplateArgument> PartialArgs) { 2928 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2929 RParenLoc, Length, PartialArgs); 2930 } 2931 2932 /// Build a new Objective-C boxed expression. 2933 /// 2934 /// By default, performs semantic analysis to build the new expression. 2935 /// Subclasses may override this routine to provide different behavior. 2936 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2937 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2938 } 2939 2940 /// Build a new Objective-C array literal. 2941 /// 2942 /// By default, performs semantic analysis to build the new expression. 2943 /// Subclasses may override this routine to provide different behavior. 2944 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2945 Expr **Elements, unsigned NumElements) { 2946 return getSema().BuildObjCArrayLiteral(Range, 2947 MultiExprArg(Elements, NumElements)); 2948 } 2949 2950 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2951 Expr *Base, Expr *Key, 2952 ObjCMethodDecl *getterMethod, 2953 ObjCMethodDecl *setterMethod) { 2954 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2955 getterMethod, setterMethod); 2956 } 2957 2958 /// Build a new Objective-C dictionary literal. 2959 /// 2960 /// By default, performs semantic analysis to build the new expression. 2961 /// Subclasses may override this routine to provide different behavior. 2962 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2963 MutableArrayRef<ObjCDictionaryElement> Elements) { 2964 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2965 } 2966 2967 /// Build a new Objective-C \@encode expression. 2968 /// 2969 /// By default, performs semantic analysis to build the new expression. 2970 /// Subclasses may override this routine to provide different behavior. 2971 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2972 TypeSourceInfo *EncodeTypeInfo, 2973 SourceLocation RParenLoc) { 2974 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2975 } 2976 2977 /// Build a new Objective-C class message. 2978 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2979 Selector Sel, 2980 ArrayRef<SourceLocation> SelectorLocs, 2981 ObjCMethodDecl *Method, 2982 SourceLocation LBracLoc, 2983 MultiExprArg Args, 2984 SourceLocation RBracLoc) { 2985 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2986 ReceiverTypeInfo->getType(), 2987 /*SuperLoc=*/SourceLocation(), 2988 Sel, Method, LBracLoc, SelectorLocs, 2989 RBracLoc, Args); 2990 } 2991 2992 /// Build a new Objective-C instance message. 2993 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2994 Selector Sel, 2995 ArrayRef<SourceLocation> SelectorLocs, 2996 ObjCMethodDecl *Method, 2997 SourceLocation LBracLoc, 2998 MultiExprArg Args, 2999 SourceLocation RBracLoc) { 3000 return SemaRef.BuildInstanceMessage(Receiver, 3001 Receiver->getType(), 3002 /*SuperLoc=*/SourceLocation(), 3003 Sel, Method, LBracLoc, SelectorLocs, 3004 RBracLoc, Args); 3005 } 3006 3007 /// Build a new Objective-C instance/class message to 'super'. 3008 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3009 Selector Sel, 3010 ArrayRef<SourceLocation> SelectorLocs, 3011 QualType SuperType, 3012 ObjCMethodDecl *Method, 3013 SourceLocation LBracLoc, 3014 MultiExprArg Args, 3015 SourceLocation RBracLoc) { 3016 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3017 SuperType, 3018 SuperLoc, 3019 Sel, Method, LBracLoc, SelectorLocs, 3020 RBracLoc, Args) 3021 : SemaRef.BuildClassMessage(nullptr, 3022 SuperType, 3023 SuperLoc, 3024 Sel, Method, LBracLoc, SelectorLocs, 3025 RBracLoc, Args); 3026 3027 3028 } 3029 3030 /// Build a new Objective-C ivar reference expression. 3031 /// 3032 /// By default, performs semantic analysis to build the new expression. 3033 /// Subclasses may override this routine to provide different behavior. 3034 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3035 SourceLocation IvarLoc, 3036 bool IsArrow, bool IsFreeIvar) { 3037 CXXScopeSpec SS; 3038 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3039 ExprResult Result = getSema().BuildMemberReferenceExpr( 3040 BaseArg, BaseArg->getType(), 3041 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3042 /*FirstQualifierInScope=*/nullptr, NameInfo, 3043 /*TemplateArgs=*/nullptr, 3044 /*S=*/nullptr); 3045 if (IsFreeIvar && Result.isUsable()) 3046 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3047 return Result; 3048 } 3049 3050 /// Build a new Objective-C property reference expression. 3051 /// 3052 /// By default, performs semantic analysis to build the new expression. 3053 /// Subclasses may override this routine to provide different behavior. 3054 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3055 ObjCPropertyDecl *Property, 3056 SourceLocation PropertyLoc) { 3057 CXXScopeSpec SS; 3058 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3059 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3060 /*FIXME:*/PropertyLoc, 3061 /*IsArrow=*/false, 3062 SS, SourceLocation(), 3063 /*FirstQualifierInScope=*/nullptr, 3064 NameInfo, 3065 /*TemplateArgs=*/nullptr, 3066 /*S=*/nullptr); 3067 } 3068 3069 /// Build a new Objective-C property reference expression. 3070 /// 3071 /// By default, performs semantic analysis to build the new expression. 3072 /// Subclasses may override this routine to provide different behavior. 3073 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3074 ObjCMethodDecl *Getter, 3075 ObjCMethodDecl *Setter, 3076 SourceLocation PropertyLoc) { 3077 // Since these expressions can only be value-dependent, we do not 3078 // need to perform semantic analysis again. 3079 return Owned( 3080 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3081 VK_LValue, OK_ObjCProperty, 3082 PropertyLoc, Base)); 3083 } 3084 3085 /// Build a new Objective-C "isa" expression. 3086 /// 3087 /// By default, performs semantic analysis to build the new expression. 3088 /// Subclasses may override this routine to provide different behavior. 3089 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3090 SourceLocation OpLoc, bool IsArrow) { 3091 CXXScopeSpec SS; 3092 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3093 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3094 OpLoc, IsArrow, 3095 SS, SourceLocation(), 3096 /*FirstQualifierInScope=*/nullptr, 3097 NameInfo, 3098 /*TemplateArgs=*/nullptr, 3099 /*S=*/nullptr); 3100 } 3101 3102 /// Build a new shuffle vector expression. 3103 /// 3104 /// By default, performs semantic analysis to build the new expression. 3105 /// Subclasses may override this routine to provide different behavior. 3106 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3107 MultiExprArg SubExprs, 3108 SourceLocation RParenLoc) { 3109 // Find the declaration for __builtin_shufflevector 3110 const IdentifierInfo &Name 3111 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3112 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3113 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3114 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3115 3116 // Build a reference to the __builtin_shufflevector builtin 3117 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3118 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3119 SemaRef.Context.BuiltinFnTy, 3120 VK_RValue, BuiltinLoc); 3121 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3122 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3123 CK_BuiltinFnToFnPtr).get(); 3124 3125 // Build the CallExpr 3126 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3127 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3128 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3129 3130 // Type-check the __builtin_shufflevector expression. 3131 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3132 } 3133 3134 /// Build a new convert vector expression. 3135 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3136 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3137 SourceLocation RParenLoc) { 3138 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3139 BuiltinLoc, RParenLoc); 3140 } 3141 3142 /// Build a new template argument pack expansion. 3143 /// 3144 /// By default, performs semantic analysis to build a new pack expansion 3145 /// for a template argument. Subclasses may override this routine to provide 3146 /// different behavior. 3147 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3148 SourceLocation EllipsisLoc, 3149 Optional<unsigned> NumExpansions) { 3150 switch (Pattern.getArgument().getKind()) { 3151 case TemplateArgument::Expression: { 3152 ExprResult Result 3153 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3154 EllipsisLoc, NumExpansions); 3155 if (Result.isInvalid()) 3156 return TemplateArgumentLoc(); 3157 3158 return TemplateArgumentLoc(Result.get(), Result.get()); 3159 } 3160 3161 case TemplateArgument::Template: 3162 return TemplateArgumentLoc(TemplateArgument( 3163 Pattern.getArgument().getAsTemplate(), 3164 NumExpansions), 3165 Pattern.getTemplateQualifierLoc(), 3166 Pattern.getTemplateNameLoc(), 3167 EllipsisLoc); 3168 3169 case TemplateArgument::Null: 3170 case TemplateArgument::Integral: 3171 case TemplateArgument::Declaration: 3172 case TemplateArgument::Pack: 3173 case TemplateArgument::TemplateExpansion: 3174 case TemplateArgument::NullPtr: 3175 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3176 3177 case TemplateArgument::Type: 3178 if (TypeSourceInfo *Expansion 3179 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3180 EllipsisLoc, 3181 NumExpansions)) 3182 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3183 Expansion); 3184 break; 3185 } 3186 3187 return TemplateArgumentLoc(); 3188 } 3189 3190 /// Build a new expression pack expansion. 3191 /// 3192 /// By default, performs semantic analysis to build a new pack expansion 3193 /// for an expression. Subclasses may override this routine to provide 3194 /// different behavior. 3195 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3196 Optional<unsigned> NumExpansions) { 3197 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3198 } 3199 3200 /// Build a new C++1z fold-expression. 3201 /// 3202 /// By default, performs semantic analysis in order to build a new fold 3203 /// expression. 3204 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3205 BinaryOperatorKind Operator, 3206 SourceLocation EllipsisLoc, Expr *RHS, 3207 SourceLocation RParenLoc) { 3208 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3209 RHS, RParenLoc); 3210 } 3211 3212 /// Build an empty C++1z fold-expression with the given operator. 3213 /// 3214 /// By default, produces the fallback value for the fold-expression, or 3215 /// produce an error if there is no fallback value. 3216 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3217 BinaryOperatorKind Operator) { 3218 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3219 } 3220 3221 /// Build a new atomic operation expression. 3222 /// 3223 /// By default, performs semantic analysis to build the new expression. 3224 /// Subclasses may override this routine to provide different behavior. 3225 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3226 MultiExprArg SubExprs, 3227 QualType RetTy, 3228 AtomicExpr::AtomicOp Op, 3229 SourceLocation RParenLoc) { 3230 // Just create the expression; there is not any interesting semantic 3231 // analysis here because we can't actually build an AtomicExpr until 3232 // we are sure it is semantically sound. 3233 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3234 RParenLoc); 3235 } 3236 3237 private: 3238 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3239 QualType ObjectType, 3240 NamedDecl *FirstQualifierInScope, 3241 CXXScopeSpec &SS); 3242 3243 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3244 QualType ObjectType, 3245 NamedDecl *FirstQualifierInScope, 3246 CXXScopeSpec &SS); 3247 3248 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3249 NamedDecl *FirstQualifierInScope, 3250 CXXScopeSpec &SS); 3251 3252 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3253 DependentNameTypeLoc TL, 3254 bool DeducibleTSTContext); 3255 }; 3256 3257 template<typename Derived> 3258 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3259 if (!S) 3260 return S; 3261 3262 switch (S->getStmtClass()) { 3263 case Stmt::NoStmtClass: break; 3264 3265 // Transform individual statement nodes 3266 #define STMT(Node, Parent) \ 3267 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3268 #define ABSTRACT_STMT(Node) 3269 #define EXPR(Node, Parent) 3270 #include "clang/AST/StmtNodes.inc" 3271 3272 // Transform expressions by calling TransformExpr. 3273 #define STMT(Node, Parent) 3274 #define ABSTRACT_STMT(Stmt) 3275 #define EXPR(Node, Parent) case Stmt::Node##Class: 3276 #include "clang/AST/StmtNodes.inc" 3277 { 3278 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3279 if (E.isInvalid()) 3280 return StmtError(); 3281 3282 return getSema().ActOnExprStmt(E); 3283 } 3284 } 3285 3286 return S; 3287 } 3288 3289 template<typename Derived> 3290 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3291 if (!S) 3292 return S; 3293 3294 switch (S->getClauseKind()) { 3295 default: break; 3296 // Transform individual clause nodes 3297 #define OPENMP_CLAUSE(Name, Class) \ 3298 case OMPC_ ## Name : \ 3299 return getDerived().Transform ## Class(cast<Class>(S)); 3300 #include "clang/Basic/OpenMPKinds.def" 3301 } 3302 3303 return S; 3304 } 3305 3306 3307 template<typename Derived> 3308 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3309 if (!E) 3310 return E; 3311 3312 switch (E->getStmtClass()) { 3313 case Stmt::NoStmtClass: break; 3314 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3315 #define ABSTRACT_STMT(Stmt) 3316 #define EXPR(Node, Parent) \ 3317 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3318 #include "clang/AST/StmtNodes.inc" 3319 } 3320 3321 return E; 3322 } 3323 3324 template<typename Derived> 3325 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3326 bool NotCopyInit) { 3327 // Initializers are instantiated like expressions, except that various outer 3328 // layers are stripped. 3329 if (!Init) 3330 return Init; 3331 3332 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3333 Init = ExprTemp->getSubExpr(); 3334 3335 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3336 Init = AIL->getCommonExpr(); 3337 3338 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3339 Init = MTE->GetTemporaryExpr(); 3340 3341 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3342 Init = Binder->getSubExpr(); 3343 3344 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3345 Init = ICE->getSubExprAsWritten(); 3346 3347 if (CXXStdInitializerListExpr *ILE = 3348 dyn_cast<CXXStdInitializerListExpr>(Init)) 3349 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3350 3351 // If this is copy-initialization, we only need to reconstruct 3352 // InitListExprs. Other forms of copy-initialization will be a no-op if 3353 // the initializer is already the right type. 3354 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3355 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3356 return getDerived().TransformExpr(Init); 3357 3358 // Revert value-initialization back to empty parens. 3359 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3360 SourceRange Parens = VIE->getSourceRange(); 3361 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3362 Parens.getEnd()); 3363 } 3364 3365 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3366 if (isa<ImplicitValueInitExpr>(Init)) 3367 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3368 SourceLocation()); 3369 3370 // Revert initialization by constructor back to a parenthesized or braced list 3371 // of expressions. Any other form of initializer can just be reused directly. 3372 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3373 return getDerived().TransformExpr(Init); 3374 3375 // If the initialization implicitly converted an initializer list to a 3376 // std::initializer_list object, unwrap the std::initializer_list too. 3377 if (Construct && Construct->isStdInitListInitialization()) 3378 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3379 3380 SmallVector<Expr*, 8> NewArgs; 3381 bool ArgChanged = false; 3382 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3383 /*IsCall*/true, NewArgs, &ArgChanged)) 3384 return ExprError(); 3385 3386 // If this was list initialization, revert to syntactic list form. 3387 if (Construct->isListInitialization()) 3388 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 3389 Construct->getLocEnd()); 3390 3391 // Build a ParenListExpr to represent anything else. 3392 SourceRange Parens = Construct->getParenOrBraceRange(); 3393 if (Parens.isInvalid()) { 3394 // This was a variable declaration's initialization for which no initializer 3395 // was specified. 3396 assert(NewArgs.empty() && 3397 "no parens or braces but have direct init with arguments?"); 3398 return ExprEmpty(); 3399 } 3400 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3401 Parens.getEnd()); 3402 } 3403 3404 template<typename Derived> 3405 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3406 unsigned NumInputs, 3407 bool IsCall, 3408 SmallVectorImpl<Expr *> &Outputs, 3409 bool *ArgChanged) { 3410 for (unsigned I = 0; I != NumInputs; ++I) { 3411 // If requested, drop call arguments that need to be dropped. 3412 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3413 if (ArgChanged) 3414 *ArgChanged = true; 3415 3416 break; 3417 } 3418 3419 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3420 Expr *Pattern = Expansion->getPattern(); 3421 3422 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3423 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3424 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3425 3426 // Determine whether the set of unexpanded parameter packs can and should 3427 // be expanded. 3428 bool Expand = true; 3429 bool RetainExpansion = false; 3430 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3431 Optional<unsigned> NumExpansions = OrigNumExpansions; 3432 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3433 Pattern->getSourceRange(), 3434 Unexpanded, 3435 Expand, RetainExpansion, 3436 NumExpansions)) 3437 return true; 3438 3439 if (!Expand) { 3440 // The transform has determined that we should perform a simple 3441 // transformation on the pack expansion, producing another pack 3442 // expansion. 3443 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3444 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3445 if (OutPattern.isInvalid()) 3446 return true; 3447 3448 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3449 Expansion->getEllipsisLoc(), 3450 NumExpansions); 3451 if (Out.isInvalid()) 3452 return true; 3453 3454 if (ArgChanged) 3455 *ArgChanged = true; 3456 Outputs.push_back(Out.get()); 3457 continue; 3458 } 3459 3460 // Record right away that the argument was changed. This needs 3461 // to happen even if the array expands to nothing. 3462 if (ArgChanged) *ArgChanged = true; 3463 3464 // The transform has determined that we should perform an elementwise 3465 // expansion of the pattern. Do so. 3466 for (unsigned I = 0; I != *NumExpansions; ++I) { 3467 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3468 ExprResult Out = getDerived().TransformExpr(Pattern); 3469 if (Out.isInvalid()) 3470 return true; 3471 3472 if (Out.get()->containsUnexpandedParameterPack()) { 3473 Out = getDerived().RebuildPackExpansion( 3474 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3475 if (Out.isInvalid()) 3476 return true; 3477 } 3478 3479 Outputs.push_back(Out.get()); 3480 } 3481 3482 // If we're supposed to retain a pack expansion, do so by temporarily 3483 // forgetting the partially-substituted parameter pack. 3484 if (RetainExpansion) { 3485 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3486 3487 ExprResult Out = getDerived().TransformExpr(Pattern); 3488 if (Out.isInvalid()) 3489 return true; 3490 3491 Out = getDerived().RebuildPackExpansion( 3492 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3493 if (Out.isInvalid()) 3494 return true; 3495 3496 Outputs.push_back(Out.get()); 3497 } 3498 3499 continue; 3500 } 3501 3502 ExprResult Result = 3503 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3504 : getDerived().TransformExpr(Inputs[I]); 3505 if (Result.isInvalid()) 3506 return true; 3507 3508 if (Result.get() != Inputs[I] && ArgChanged) 3509 *ArgChanged = true; 3510 3511 Outputs.push_back(Result.get()); 3512 } 3513 3514 return false; 3515 } 3516 3517 template <typename Derived> 3518 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3519 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3520 if (Var) { 3521 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3522 getDerived().TransformDefinition(Var->getLocation(), Var)); 3523 3524 if (!ConditionVar) 3525 return Sema::ConditionError(); 3526 3527 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3528 } 3529 3530 if (Expr) { 3531 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3532 3533 if (CondExpr.isInvalid()) 3534 return Sema::ConditionError(); 3535 3536 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3537 } 3538 3539 return Sema::ConditionResult(); 3540 } 3541 3542 template<typename Derived> 3543 NestedNameSpecifierLoc 3544 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3545 NestedNameSpecifierLoc NNS, 3546 QualType ObjectType, 3547 NamedDecl *FirstQualifierInScope) { 3548 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3549 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3550 Qualifier = Qualifier.getPrefix()) 3551 Qualifiers.push_back(Qualifier); 3552 3553 CXXScopeSpec SS; 3554 while (!Qualifiers.empty()) { 3555 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3556 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3557 3558 switch (QNNS->getKind()) { 3559 case NestedNameSpecifier::Identifier: { 3560 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3561 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3562 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3563 SS, FirstQualifierInScope, false)) 3564 return NestedNameSpecifierLoc(); 3565 } 3566 break; 3567 3568 case NestedNameSpecifier::Namespace: { 3569 NamespaceDecl *NS 3570 = cast_or_null<NamespaceDecl>( 3571 getDerived().TransformDecl( 3572 Q.getLocalBeginLoc(), 3573 QNNS->getAsNamespace())); 3574 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3575 break; 3576 } 3577 3578 case NestedNameSpecifier::NamespaceAlias: { 3579 NamespaceAliasDecl *Alias 3580 = cast_or_null<NamespaceAliasDecl>( 3581 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3582 QNNS->getAsNamespaceAlias())); 3583 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3584 Q.getLocalEndLoc()); 3585 break; 3586 } 3587 3588 case NestedNameSpecifier::Global: 3589 // There is no meaningful transformation that one could perform on the 3590 // global scope. 3591 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3592 break; 3593 3594 case NestedNameSpecifier::Super: { 3595 CXXRecordDecl *RD = 3596 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3597 SourceLocation(), QNNS->getAsRecordDecl())); 3598 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3599 break; 3600 } 3601 3602 case NestedNameSpecifier::TypeSpecWithTemplate: 3603 case NestedNameSpecifier::TypeSpec: { 3604 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3605 FirstQualifierInScope, SS); 3606 3607 if (!TL) 3608 return NestedNameSpecifierLoc(); 3609 3610 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3611 (SemaRef.getLangOpts().CPlusPlus11 && 3612 TL.getType()->isEnumeralType())) { 3613 assert(!TL.getType().hasLocalQualifiers() && 3614 "Can't get cv-qualifiers here"); 3615 if (TL.getType()->isEnumeralType()) 3616 SemaRef.Diag(TL.getBeginLoc(), 3617 diag::warn_cxx98_compat_enum_nested_name_spec); 3618 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3619 Q.getLocalEndLoc()); 3620 break; 3621 } 3622 // If the nested-name-specifier is an invalid type def, don't emit an 3623 // error because a previous error should have already been emitted. 3624 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3625 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3626 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3627 << TL.getType() << SS.getRange(); 3628 } 3629 return NestedNameSpecifierLoc(); 3630 } 3631 } 3632 3633 // The qualifier-in-scope and object type only apply to the leftmost entity. 3634 FirstQualifierInScope = nullptr; 3635 ObjectType = QualType(); 3636 } 3637 3638 // Don't rebuild the nested-name-specifier if we don't have to. 3639 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3640 !getDerived().AlwaysRebuild()) 3641 return NNS; 3642 3643 // If we can re-use the source-location data from the original 3644 // nested-name-specifier, do so. 3645 if (SS.location_size() == NNS.getDataLength() && 3646 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3647 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3648 3649 // Allocate new nested-name-specifier location information. 3650 return SS.getWithLocInContext(SemaRef.Context); 3651 } 3652 3653 template<typename Derived> 3654 DeclarationNameInfo 3655 TreeTransform<Derived> 3656 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3657 DeclarationName Name = NameInfo.getName(); 3658 if (!Name) 3659 return DeclarationNameInfo(); 3660 3661 switch (Name.getNameKind()) { 3662 case DeclarationName::Identifier: 3663 case DeclarationName::ObjCZeroArgSelector: 3664 case DeclarationName::ObjCOneArgSelector: 3665 case DeclarationName::ObjCMultiArgSelector: 3666 case DeclarationName::CXXOperatorName: 3667 case DeclarationName::CXXLiteralOperatorName: 3668 case DeclarationName::CXXUsingDirective: 3669 return NameInfo; 3670 3671 case DeclarationName::CXXDeductionGuideName: { 3672 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3673 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3674 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3675 if (!NewTemplate) 3676 return DeclarationNameInfo(); 3677 3678 DeclarationNameInfo NewNameInfo(NameInfo); 3679 NewNameInfo.setName( 3680 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3681 return NewNameInfo; 3682 } 3683 3684 case DeclarationName::CXXConstructorName: 3685 case DeclarationName::CXXDestructorName: 3686 case DeclarationName::CXXConversionFunctionName: { 3687 TypeSourceInfo *NewTInfo; 3688 CanQualType NewCanTy; 3689 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3690 NewTInfo = getDerived().TransformType(OldTInfo); 3691 if (!NewTInfo) 3692 return DeclarationNameInfo(); 3693 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3694 } 3695 else { 3696 NewTInfo = nullptr; 3697 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3698 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3699 if (NewT.isNull()) 3700 return DeclarationNameInfo(); 3701 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3702 } 3703 3704 DeclarationName NewName 3705 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3706 NewCanTy); 3707 DeclarationNameInfo NewNameInfo(NameInfo); 3708 NewNameInfo.setName(NewName); 3709 NewNameInfo.setNamedTypeInfo(NewTInfo); 3710 return NewNameInfo; 3711 } 3712 } 3713 3714 llvm_unreachable("Unknown name kind."); 3715 } 3716 3717 template<typename Derived> 3718 TemplateName 3719 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3720 TemplateName Name, 3721 SourceLocation NameLoc, 3722 QualType ObjectType, 3723 NamedDecl *FirstQualifierInScope, 3724 bool AllowInjectedClassName) { 3725 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3726 TemplateDecl *Template = QTN->getTemplateDecl(); 3727 assert(Template && "qualified template name must refer to a template"); 3728 3729 TemplateDecl *TransTemplate 3730 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3731 Template)); 3732 if (!TransTemplate) 3733 return TemplateName(); 3734 3735 if (!getDerived().AlwaysRebuild() && 3736 SS.getScopeRep() == QTN->getQualifier() && 3737 TransTemplate == Template) 3738 return Name; 3739 3740 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3741 TransTemplate); 3742 } 3743 3744 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3745 if (SS.getScopeRep()) { 3746 // These apply to the scope specifier, not the template. 3747 ObjectType = QualType(); 3748 FirstQualifierInScope = nullptr; 3749 } 3750 3751 if (!getDerived().AlwaysRebuild() && 3752 SS.getScopeRep() == DTN->getQualifier() && 3753 ObjectType.isNull()) 3754 return Name; 3755 3756 // FIXME: Preserve the location of the "template" keyword. 3757 SourceLocation TemplateKWLoc = NameLoc; 3758 3759 if (DTN->isIdentifier()) { 3760 return getDerived().RebuildTemplateName(SS, 3761 TemplateKWLoc, 3762 *DTN->getIdentifier(), 3763 NameLoc, 3764 ObjectType, 3765 FirstQualifierInScope, 3766 AllowInjectedClassName); 3767 } 3768 3769 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3770 DTN->getOperator(), NameLoc, 3771 ObjectType, AllowInjectedClassName); 3772 } 3773 3774 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3775 TemplateDecl *TransTemplate 3776 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3777 Template)); 3778 if (!TransTemplate) 3779 return TemplateName(); 3780 3781 if (!getDerived().AlwaysRebuild() && 3782 TransTemplate == Template) 3783 return Name; 3784 3785 return TemplateName(TransTemplate); 3786 } 3787 3788 if (SubstTemplateTemplateParmPackStorage *SubstPack 3789 = Name.getAsSubstTemplateTemplateParmPack()) { 3790 TemplateTemplateParmDecl *TransParam 3791 = cast_or_null<TemplateTemplateParmDecl>( 3792 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3793 if (!TransParam) 3794 return TemplateName(); 3795 3796 if (!getDerived().AlwaysRebuild() && 3797 TransParam == SubstPack->getParameterPack()) 3798 return Name; 3799 3800 return getDerived().RebuildTemplateName(TransParam, 3801 SubstPack->getArgumentPack()); 3802 } 3803 3804 // These should be getting filtered out before they reach the AST. 3805 llvm_unreachable("overloaded function decl survived to here"); 3806 } 3807 3808 template<typename Derived> 3809 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3810 const TemplateArgument &Arg, 3811 TemplateArgumentLoc &Output) { 3812 SourceLocation Loc = getDerived().getBaseLocation(); 3813 switch (Arg.getKind()) { 3814 case TemplateArgument::Null: 3815 llvm_unreachable("null template argument in TreeTransform"); 3816 break; 3817 3818 case TemplateArgument::Type: 3819 Output = TemplateArgumentLoc(Arg, 3820 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3821 3822 break; 3823 3824 case TemplateArgument::Template: 3825 case TemplateArgument::TemplateExpansion: { 3826 NestedNameSpecifierLocBuilder Builder; 3827 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3828 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3829 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3830 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3831 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3832 3833 if (Arg.getKind() == TemplateArgument::Template) 3834 Output = TemplateArgumentLoc(Arg, 3835 Builder.getWithLocInContext(SemaRef.Context), 3836 Loc); 3837 else 3838 Output = TemplateArgumentLoc(Arg, 3839 Builder.getWithLocInContext(SemaRef.Context), 3840 Loc, Loc); 3841 3842 break; 3843 } 3844 3845 case TemplateArgument::Expression: 3846 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3847 break; 3848 3849 case TemplateArgument::Declaration: 3850 case TemplateArgument::Integral: 3851 case TemplateArgument::Pack: 3852 case TemplateArgument::NullPtr: 3853 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3854 break; 3855 } 3856 } 3857 3858 template<typename Derived> 3859 bool TreeTransform<Derived>::TransformTemplateArgument( 3860 const TemplateArgumentLoc &Input, 3861 TemplateArgumentLoc &Output, bool Uneval) { 3862 const TemplateArgument &Arg = Input.getArgument(); 3863 switch (Arg.getKind()) { 3864 case TemplateArgument::Null: 3865 case TemplateArgument::Integral: 3866 case TemplateArgument::Pack: 3867 case TemplateArgument::Declaration: 3868 case TemplateArgument::NullPtr: 3869 llvm_unreachable("Unexpected TemplateArgument"); 3870 3871 case TemplateArgument::Type: { 3872 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3873 if (!DI) 3874 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3875 3876 DI = getDerived().TransformType(DI); 3877 if (!DI) return true; 3878 3879 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3880 return false; 3881 } 3882 3883 case TemplateArgument::Template: { 3884 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3885 if (QualifierLoc) { 3886 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3887 if (!QualifierLoc) 3888 return true; 3889 } 3890 3891 CXXScopeSpec SS; 3892 SS.Adopt(QualifierLoc); 3893 TemplateName Template 3894 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3895 Input.getTemplateNameLoc()); 3896 if (Template.isNull()) 3897 return true; 3898 3899 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3900 Input.getTemplateNameLoc()); 3901 return false; 3902 } 3903 3904 case TemplateArgument::TemplateExpansion: 3905 llvm_unreachable("Caller should expand pack expansions"); 3906 3907 case TemplateArgument::Expression: { 3908 // Template argument expressions are constant expressions. 3909 EnterExpressionEvaluationContext Unevaluated( 3910 getSema(), Uneval 3911 ? Sema::ExpressionEvaluationContext::Unevaluated 3912 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3913 3914 Expr *InputExpr = Input.getSourceExpression(); 3915 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3916 3917 ExprResult E = getDerived().TransformExpr(InputExpr); 3918 E = SemaRef.ActOnConstantExpression(E); 3919 if (E.isInvalid()) return true; 3920 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3921 return false; 3922 } 3923 } 3924 3925 // Work around bogus GCC warning 3926 return true; 3927 } 3928 3929 /// Iterator adaptor that invents template argument location information 3930 /// for each of the template arguments in its underlying iterator. 3931 template<typename Derived, typename InputIterator> 3932 class TemplateArgumentLocInventIterator { 3933 TreeTransform<Derived> &Self; 3934 InputIterator Iter; 3935 3936 public: 3937 typedef TemplateArgumentLoc value_type; 3938 typedef TemplateArgumentLoc reference; 3939 typedef typename std::iterator_traits<InputIterator>::difference_type 3940 difference_type; 3941 typedef std::input_iterator_tag iterator_category; 3942 3943 class pointer { 3944 TemplateArgumentLoc Arg; 3945 3946 public: 3947 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3948 3949 const TemplateArgumentLoc *operator->() const { return &Arg; } 3950 }; 3951 3952 TemplateArgumentLocInventIterator() { } 3953 3954 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3955 InputIterator Iter) 3956 : Self(Self), Iter(Iter) { } 3957 3958 TemplateArgumentLocInventIterator &operator++() { 3959 ++Iter; 3960 return *this; 3961 } 3962 3963 TemplateArgumentLocInventIterator operator++(int) { 3964 TemplateArgumentLocInventIterator Old(*this); 3965 ++(*this); 3966 return Old; 3967 } 3968 3969 reference operator*() const { 3970 TemplateArgumentLoc Result; 3971 Self.InventTemplateArgumentLoc(*Iter, Result); 3972 return Result; 3973 } 3974 3975 pointer operator->() const { return pointer(**this); } 3976 3977 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3978 const TemplateArgumentLocInventIterator &Y) { 3979 return X.Iter == Y.Iter; 3980 } 3981 3982 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3983 const TemplateArgumentLocInventIterator &Y) { 3984 return X.Iter != Y.Iter; 3985 } 3986 }; 3987 3988 template<typename Derived> 3989 template<typename InputIterator> 3990 bool TreeTransform<Derived>::TransformTemplateArguments( 3991 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 3992 bool Uneval) { 3993 for (; First != Last; ++First) { 3994 TemplateArgumentLoc Out; 3995 TemplateArgumentLoc In = *First; 3996 3997 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3998 // Unpack argument packs, which we translate them into separate 3999 // arguments. 4000 // FIXME: We could do much better if we could guarantee that the 4001 // TemplateArgumentLocInfo for the pack expansion would be usable for 4002 // all of the template arguments in the argument pack. 4003 typedef TemplateArgumentLocInventIterator<Derived, 4004 TemplateArgument::pack_iterator> 4005 PackLocIterator; 4006 if (TransformTemplateArguments(PackLocIterator(*this, 4007 In.getArgument().pack_begin()), 4008 PackLocIterator(*this, 4009 In.getArgument().pack_end()), 4010 Outputs, Uneval)) 4011 return true; 4012 4013 continue; 4014 } 4015 4016 if (In.getArgument().isPackExpansion()) { 4017 // We have a pack expansion, for which we will be substituting into 4018 // the pattern. 4019 SourceLocation Ellipsis; 4020 Optional<unsigned> OrigNumExpansions; 4021 TemplateArgumentLoc Pattern 4022 = getSema().getTemplateArgumentPackExpansionPattern( 4023 In, Ellipsis, OrigNumExpansions); 4024 4025 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4026 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4027 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4028 4029 // Determine whether the set of unexpanded parameter packs can and should 4030 // be expanded. 4031 bool Expand = true; 4032 bool RetainExpansion = false; 4033 Optional<unsigned> NumExpansions = OrigNumExpansions; 4034 if (getDerived().TryExpandParameterPacks(Ellipsis, 4035 Pattern.getSourceRange(), 4036 Unexpanded, 4037 Expand, 4038 RetainExpansion, 4039 NumExpansions)) 4040 return true; 4041 4042 if (!Expand) { 4043 // The transform has determined that we should perform a simple 4044 // transformation on the pack expansion, producing another pack 4045 // expansion. 4046 TemplateArgumentLoc OutPattern; 4047 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4048 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4049 return true; 4050 4051 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4052 NumExpansions); 4053 if (Out.getArgument().isNull()) 4054 return true; 4055 4056 Outputs.addArgument(Out); 4057 continue; 4058 } 4059 4060 // The transform has determined that we should perform an elementwise 4061 // expansion of the pattern. Do so. 4062 for (unsigned I = 0; I != *NumExpansions; ++I) { 4063 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4064 4065 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4066 return true; 4067 4068 if (Out.getArgument().containsUnexpandedParameterPack()) { 4069 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4070 OrigNumExpansions); 4071 if (Out.getArgument().isNull()) 4072 return true; 4073 } 4074 4075 Outputs.addArgument(Out); 4076 } 4077 4078 // If we're supposed to retain a pack expansion, do so by temporarily 4079 // forgetting the partially-substituted parameter pack. 4080 if (RetainExpansion) { 4081 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4082 4083 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4084 return true; 4085 4086 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4087 OrigNumExpansions); 4088 if (Out.getArgument().isNull()) 4089 return true; 4090 4091 Outputs.addArgument(Out); 4092 } 4093 4094 continue; 4095 } 4096 4097 // The simple case: 4098 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4099 return true; 4100 4101 Outputs.addArgument(Out); 4102 } 4103 4104 return false; 4105 4106 } 4107 4108 //===----------------------------------------------------------------------===// 4109 // Type transformation 4110 //===----------------------------------------------------------------------===// 4111 4112 template<typename Derived> 4113 QualType TreeTransform<Derived>::TransformType(QualType T) { 4114 if (getDerived().AlreadyTransformed(T)) 4115 return T; 4116 4117 // Temporary workaround. All of these transformations should 4118 // eventually turn into transformations on TypeLocs. 4119 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4120 getDerived().getBaseLocation()); 4121 4122 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4123 4124 if (!NewDI) 4125 return QualType(); 4126 4127 return NewDI->getType(); 4128 } 4129 4130 template<typename Derived> 4131 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4132 // Refine the base location to the type's location. 4133 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4134 getDerived().getBaseEntity()); 4135 if (getDerived().AlreadyTransformed(DI->getType())) 4136 return DI; 4137 4138 TypeLocBuilder TLB; 4139 4140 TypeLoc TL = DI->getTypeLoc(); 4141 TLB.reserve(TL.getFullDataSize()); 4142 4143 QualType Result = getDerived().TransformType(TLB, TL); 4144 if (Result.isNull()) 4145 return nullptr; 4146 4147 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4148 } 4149 4150 template<typename Derived> 4151 QualType 4152 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4153 switch (T.getTypeLocClass()) { 4154 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4155 #define TYPELOC(CLASS, PARENT) \ 4156 case TypeLoc::CLASS: \ 4157 return getDerived().Transform##CLASS##Type(TLB, \ 4158 T.castAs<CLASS##TypeLoc>()); 4159 #include "clang/AST/TypeLocNodes.def" 4160 } 4161 4162 llvm_unreachable("unhandled type loc!"); 4163 } 4164 4165 template<typename Derived> 4166 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4167 if (!isa<DependentNameType>(T)) 4168 return TransformType(T); 4169 4170 if (getDerived().AlreadyTransformed(T)) 4171 return T; 4172 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4173 getDerived().getBaseLocation()); 4174 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4175 return NewDI ? NewDI->getType() : QualType(); 4176 } 4177 4178 template<typename Derived> 4179 TypeSourceInfo * 4180 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4181 if (!isa<DependentNameType>(DI->getType())) 4182 return TransformType(DI); 4183 4184 // Refine the base location to the type's location. 4185 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4186 getDerived().getBaseEntity()); 4187 if (getDerived().AlreadyTransformed(DI->getType())) 4188 return DI; 4189 4190 TypeLocBuilder TLB; 4191 4192 TypeLoc TL = DI->getTypeLoc(); 4193 TLB.reserve(TL.getFullDataSize()); 4194 4195 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4196 if (QTL) 4197 TL = QTL.getUnqualifiedLoc(); 4198 4199 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4200 4201 QualType Result = getDerived().TransformDependentNameType( 4202 TLB, DNTL, /*DeducedTSTContext*/true); 4203 if (Result.isNull()) 4204 return nullptr; 4205 4206 if (QTL) { 4207 Result = getDerived().RebuildQualifiedType( 4208 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4209 TLB.TypeWasModifiedSafely(Result); 4210 } 4211 4212 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4213 } 4214 4215 template<typename Derived> 4216 QualType 4217 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4218 QualifiedTypeLoc T) { 4219 Qualifiers Quals = T.getType().getLocalQualifiers(); 4220 4221 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4222 if (Result.isNull()) 4223 return QualType(); 4224 4225 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4226 4227 // RebuildQualifiedType might have updated the type, but not in a way 4228 // that invalidates the TypeLoc. (There's no location information for 4229 // qualifiers.) 4230 TLB.TypeWasModifiedSafely(Result); 4231 4232 return Result; 4233 } 4234 4235 template<typename Derived> 4236 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4237 SourceLocation Loc, 4238 Qualifiers Quals) { 4239 // C++ [dcl.fct]p7: 4240 // [When] adding cv-qualifications on top of the function type [...] the 4241 // cv-qualifiers are ignored. 4242 // C++ [dcl.ref]p1: 4243 // when the cv-qualifiers are introduced through the use of a typedef-name 4244 // or decltype-specifier [...] the cv-qualifiers are ignored. 4245 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4246 // applied to a reference type. 4247 // FIXME: This removes all qualifiers, not just cv-qualifiers! 4248 if (T->isFunctionType() || T->isReferenceType()) 4249 return T; 4250 4251 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4252 // resulting type. 4253 if (Quals.hasObjCLifetime()) { 4254 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4255 Quals.removeObjCLifetime(); 4256 else if (T.getObjCLifetime()) { 4257 // Objective-C ARC: 4258 // A lifetime qualifier applied to a substituted template parameter 4259 // overrides the lifetime qualifier from the template argument. 4260 const AutoType *AutoTy; 4261 if (const SubstTemplateTypeParmType *SubstTypeParam 4262 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4263 QualType Replacement = SubstTypeParam->getReplacementType(); 4264 Qualifiers Qs = Replacement.getQualifiers(); 4265 Qs.removeObjCLifetime(); 4266 Replacement = SemaRef.Context.getQualifiedType( 4267 Replacement.getUnqualifiedType(), Qs); 4268 T = SemaRef.Context.getSubstTemplateTypeParmType( 4269 SubstTypeParam->getReplacedParameter(), Replacement); 4270 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4271 // 'auto' types behave the same way as template parameters. 4272 QualType Deduced = AutoTy->getDeducedType(); 4273 Qualifiers Qs = Deduced.getQualifiers(); 4274 Qs.removeObjCLifetime(); 4275 Deduced = 4276 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4277 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4278 AutoTy->isDependentType()); 4279 } else { 4280 // Otherwise, complain about the addition of a qualifier to an 4281 // already-qualified type. 4282 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4283 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4284 Quals.removeObjCLifetime(); 4285 } 4286 } 4287 } 4288 4289 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4290 } 4291 4292 template<typename Derived> 4293 TypeLoc 4294 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4295 QualType ObjectType, 4296 NamedDecl *UnqualLookup, 4297 CXXScopeSpec &SS) { 4298 if (getDerived().AlreadyTransformed(TL.getType())) 4299 return TL; 4300 4301 TypeSourceInfo *TSI = 4302 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4303 if (TSI) 4304 return TSI->getTypeLoc(); 4305 return TypeLoc(); 4306 } 4307 4308 template<typename Derived> 4309 TypeSourceInfo * 4310 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4311 QualType ObjectType, 4312 NamedDecl *UnqualLookup, 4313 CXXScopeSpec &SS) { 4314 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4315 return TSInfo; 4316 4317 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4318 UnqualLookup, SS); 4319 } 4320 4321 template <typename Derived> 4322 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4323 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4324 CXXScopeSpec &SS) { 4325 QualType T = TL.getType(); 4326 assert(!getDerived().AlreadyTransformed(T)); 4327 4328 TypeLocBuilder TLB; 4329 QualType Result; 4330 4331 if (isa<TemplateSpecializationType>(T)) { 4332 TemplateSpecializationTypeLoc SpecTL = 4333 TL.castAs<TemplateSpecializationTypeLoc>(); 4334 4335 TemplateName Template = getDerived().TransformTemplateName( 4336 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4337 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4338 if (Template.isNull()) 4339 return nullptr; 4340 4341 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4342 Template); 4343 } else if (isa<DependentTemplateSpecializationType>(T)) { 4344 DependentTemplateSpecializationTypeLoc SpecTL = 4345 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4346 4347 TemplateName Template 4348 = getDerived().RebuildTemplateName(SS, 4349 SpecTL.getTemplateKeywordLoc(), 4350 *SpecTL.getTypePtr()->getIdentifier(), 4351 SpecTL.getTemplateNameLoc(), 4352 ObjectType, UnqualLookup, 4353 /*AllowInjectedClassName*/true); 4354 if (Template.isNull()) 4355 return nullptr; 4356 4357 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4358 SpecTL, 4359 Template, 4360 SS); 4361 } else { 4362 // Nothing special needs to be done for these. 4363 Result = getDerived().TransformType(TLB, TL); 4364 } 4365 4366 if (Result.isNull()) 4367 return nullptr; 4368 4369 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4370 } 4371 4372 template <class TyLoc> static inline 4373 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4374 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4375 NewT.setNameLoc(T.getNameLoc()); 4376 return T.getType(); 4377 } 4378 4379 template<typename Derived> 4380 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4381 BuiltinTypeLoc T) { 4382 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4383 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4384 if (T.needsExtraLocalData()) 4385 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4386 return T.getType(); 4387 } 4388 4389 template<typename Derived> 4390 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4391 ComplexTypeLoc T) { 4392 // FIXME: recurse? 4393 return TransformTypeSpecType(TLB, T); 4394 } 4395 4396 template <typename Derived> 4397 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4398 AdjustedTypeLoc TL) { 4399 // Adjustments applied during transformation are handled elsewhere. 4400 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4401 } 4402 4403 template<typename Derived> 4404 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4405 DecayedTypeLoc TL) { 4406 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4407 if (OriginalType.isNull()) 4408 return QualType(); 4409 4410 QualType Result = TL.getType(); 4411 if (getDerived().AlwaysRebuild() || 4412 OriginalType != TL.getOriginalLoc().getType()) 4413 Result = SemaRef.Context.getDecayedType(OriginalType); 4414 TLB.push<DecayedTypeLoc>(Result); 4415 // Nothing to set for DecayedTypeLoc. 4416 return Result; 4417 } 4418 4419 template<typename Derived> 4420 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4421 PointerTypeLoc TL) { 4422 QualType PointeeType 4423 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4424 if (PointeeType.isNull()) 4425 return QualType(); 4426 4427 QualType Result = TL.getType(); 4428 if (PointeeType->getAs<ObjCObjectType>()) { 4429 // A dependent pointer type 'T *' has is being transformed such 4430 // that an Objective-C class type is being replaced for 'T'. The 4431 // resulting pointer type is an ObjCObjectPointerType, not a 4432 // PointerType. 4433 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4434 4435 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4436 NewT.setStarLoc(TL.getStarLoc()); 4437 return Result; 4438 } 4439 4440 if (getDerived().AlwaysRebuild() || 4441 PointeeType != TL.getPointeeLoc().getType()) { 4442 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4443 if (Result.isNull()) 4444 return QualType(); 4445 } 4446 4447 // Objective-C ARC can add lifetime qualifiers to the type that we're 4448 // pointing to. 4449 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4450 4451 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4452 NewT.setSigilLoc(TL.getSigilLoc()); 4453 return Result; 4454 } 4455 4456 template<typename Derived> 4457 QualType 4458 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4459 BlockPointerTypeLoc TL) { 4460 QualType PointeeType 4461 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4462 if (PointeeType.isNull()) 4463 return QualType(); 4464 4465 QualType Result = TL.getType(); 4466 if (getDerived().AlwaysRebuild() || 4467 PointeeType != TL.getPointeeLoc().getType()) { 4468 Result = getDerived().RebuildBlockPointerType(PointeeType, 4469 TL.getSigilLoc()); 4470 if (Result.isNull()) 4471 return QualType(); 4472 } 4473 4474 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4475 NewT.setSigilLoc(TL.getSigilLoc()); 4476 return Result; 4477 } 4478 4479 /// Transforms a reference type. Note that somewhat paradoxically we 4480 /// don't care whether the type itself is an l-value type or an r-value 4481 /// type; we only care if the type was *written* as an l-value type 4482 /// or an r-value type. 4483 template<typename Derived> 4484 QualType 4485 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4486 ReferenceTypeLoc TL) { 4487 const ReferenceType *T = TL.getTypePtr(); 4488 4489 // Note that this works with the pointee-as-written. 4490 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4491 if (PointeeType.isNull()) 4492 return QualType(); 4493 4494 QualType Result = TL.getType(); 4495 if (getDerived().AlwaysRebuild() || 4496 PointeeType != T->getPointeeTypeAsWritten()) { 4497 Result = getDerived().RebuildReferenceType(PointeeType, 4498 T->isSpelledAsLValue(), 4499 TL.getSigilLoc()); 4500 if (Result.isNull()) 4501 return QualType(); 4502 } 4503 4504 // Objective-C ARC can add lifetime qualifiers to the type that we're 4505 // referring to. 4506 TLB.TypeWasModifiedSafely( 4507 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4508 4509 // r-value references can be rebuilt as l-value references. 4510 ReferenceTypeLoc NewTL; 4511 if (isa<LValueReferenceType>(Result)) 4512 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4513 else 4514 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4515 NewTL.setSigilLoc(TL.getSigilLoc()); 4516 4517 return Result; 4518 } 4519 4520 template<typename Derived> 4521 QualType 4522 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4523 LValueReferenceTypeLoc TL) { 4524 return TransformReferenceType(TLB, TL); 4525 } 4526 4527 template<typename Derived> 4528 QualType 4529 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4530 RValueReferenceTypeLoc TL) { 4531 return TransformReferenceType(TLB, TL); 4532 } 4533 4534 template<typename Derived> 4535 QualType 4536 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4537 MemberPointerTypeLoc TL) { 4538 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4539 if (PointeeType.isNull()) 4540 return QualType(); 4541 4542 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4543 TypeSourceInfo *NewClsTInfo = nullptr; 4544 if (OldClsTInfo) { 4545 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4546 if (!NewClsTInfo) 4547 return QualType(); 4548 } 4549 4550 const MemberPointerType *T = TL.getTypePtr(); 4551 QualType OldClsType = QualType(T->getClass(), 0); 4552 QualType NewClsType; 4553 if (NewClsTInfo) 4554 NewClsType = NewClsTInfo->getType(); 4555 else { 4556 NewClsType = getDerived().TransformType(OldClsType); 4557 if (NewClsType.isNull()) 4558 return QualType(); 4559 } 4560 4561 QualType Result = TL.getType(); 4562 if (getDerived().AlwaysRebuild() || 4563 PointeeType != T->getPointeeType() || 4564 NewClsType != OldClsType) { 4565 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4566 TL.getStarLoc()); 4567 if (Result.isNull()) 4568 return QualType(); 4569 } 4570 4571 // If we had to adjust the pointee type when building a member pointer, make 4572 // sure to push TypeLoc info for it. 4573 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4574 if (MPT && PointeeType != MPT->getPointeeType()) { 4575 assert(isa<AdjustedType>(MPT->getPointeeType())); 4576 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4577 } 4578 4579 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4580 NewTL.setSigilLoc(TL.getSigilLoc()); 4581 NewTL.setClassTInfo(NewClsTInfo); 4582 4583 return Result; 4584 } 4585 4586 template<typename Derived> 4587 QualType 4588 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4589 ConstantArrayTypeLoc TL) { 4590 const ConstantArrayType *T = TL.getTypePtr(); 4591 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4592 if (ElementType.isNull()) 4593 return QualType(); 4594 4595 QualType Result = TL.getType(); 4596 if (getDerived().AlwaysRebuild() || 4597 ElementType != T->getElementType()) { 4598 Result = getDerived().RebuildConstantArrayType(ElementType, 4599 T->getSizeModifier(), 4600 T->getSize(), 4601 T->getIndexTypeCVRQualifiers(), 4602 TL.getBracketsRange()); 4603 if (Result.isNull()) 4604 return QualType(); 4605 } 4606 4607 // We might have either a ConstantArrayType or a VariableArrayType now: 4608 // a ConstantArrayType is allowed to have an element type which is a 4609 // VariableArrayType if the type is dependent. Fortunately, all array 4610 // types have the same location layout. 4611 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4612 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4613 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4614 4615 Expr *Size = TL.getSizeExpr(); 4616 if (Size) { 4617 EnterExpressionEvaluationContext Unevaluated( 4618 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4619 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4620 Size = SemaRef.ActOnConstantExpression(Size).get(); 4621 } 4622 NewTL.setSizeExpr(Size); 4623 4624 return Result; 4625 } 4626 4627 template<typename Derived> 4628 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4629 TypeLocBuilder &TLB, 4630 IncompleteArrayTypeLoc TL) { 4631 const IncompleteArrayType *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().RebuildIncompleteArrayType(ElementType, 4640 T->getSizeModifier(), 4641 T->getIndexTypeCVRQualifiers(), 4642 TL.getBracketsRange()); 4643 if (Result.isNull()) 4644 return QualType(); 4645 } 4646 4647 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4648 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4649 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4650 NewTL.setSizeExpr(nullptr); 4651 4652 return Result; 4653 } 4654 4655 template<typename Derived> 4656 QualType 4657 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4658 VariableArrayTypeLoc TL) { 4659 const VariableArrayType *T = TL.getTypePtr(); 4660 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4661 if (ElementType.isNull()) 4662 return QualType(); 4663 4664 ExprResult SizeResult; 4665 { 4666 EnterExpressionEvaluationContext Context( 4667 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4668 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4669 } 4670 if (SizeResult.isInvalid()) 4671 return QualType(); 4672 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4673 if (SizeResult.isInvalid()) 4674 return QualType(); 4675 4676 Expr *Size = SizeResult.get(); 4677 4678 QualType Result = TL.getType(); 4679 if (getDerived().AlwaysRebuild() || 4680 ElementType != T->getElementType() || 4681 Size != T->getSizeExpr()) { 4682 Result = getDerived().RebuildVariableArrayType(ElementType, 4683 T->getSizeModifier(), 4684 Size, 4685 T->getIndexTypeCVRQualifiers(), 4686 TL.getBracketsRange()); 4687 if (Result.isNull()) 4688 return QualType(); 4689 } 4690 4691 // We might have constant size array now, but fortunately it has the same 4692 // location layout. 4693 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4694 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4695 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4696 NewTL.setSizeExpr(Size); 4697 4698 return Result; 4699 } 4700 4701 template<typename Derived> 4702 QualType 4703 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4704 DependentSizedArrayTypeLoc TL) { 4705 const DependentSizedArrayType *T = TL.getTypePtr(); 4706 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4707 if (ElementType.isNull()) 4708 return QualType(); 4709 4710 // Array bounds are constant expressions. 4711 EnterExpressionEvaluationContext Unevaluated( 4712 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4713 4714 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4715 Expr *origSize = TL.getSizeExpr(); 4716 if (!origSize) origSize = T->getSizeExpr(); 4717 4718 ExprResult sizeResult 4719 = getDerived().TransformExpr(origSize); 4720 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4721 if (sizeResult.isInvalid()) 4722 return QualType(); 4723 4724 Expr *size = sizeResult.get(); 4725 4726 QualType Result = TL.getType(); 4727 if (getDerived().AlwaysRebuild() || 4728 ElementType != T->getElementType() || 4729 size != origSize) { 4730 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4731 T->getSizeModifier(), 4732 size, 4733 T->getIndexTypeCVRQualifiers(), 4734 TL.getBracketsRange()); 4735 if (Result.isNull()) 4736 return QualType(); 4737 } 4738 4739 // We might have any sort of array type now, but fortunately they 4740 // all have the same location layout. 4741 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4742 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4743 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4744 NewTL.setSizeExpr(size); 4745 4746 return Result; 4747 } 4748 4749 template<typename Derived> 4750 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4751 TypeLocBuilder &TLB, 4752 DependentSizedExtVectorTypeLoc TL) { 4753 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4754 4755 // FIXME: ext vector locs should be nested 4756 QualType ElementType = getDerived().TransformType(T->getElementType()); 4757 if (ElementType.isNull()) 4758 return QualType(); 4759 4760 // Vector sizes are constant expressions. 4761 EnterExpressionEvaluationContext Unevaluated( 4762 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4763 4764 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4765 Size = SemaRef.ActOnConstantExpression(Size); 4766 if (Size.isInvalid()) 4767 return QualType(); 4768 4769 QualType Result = TL.getType(); 4770 if (getDerived().AlwaysRebuild() || 4771 ElementType != T->getElementType() || 4772 Size.get() != T->getSizeExpr()) { 4773 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4774 Size.get(), 4775 T->getAttributeLoc()); 4776 if (Result.isNull()) 4777 return QualType(); 4778 } 4779 4780 // Result might be dependent or not. 4781 if (isa<DependentSizedExtVectorType>(Result)) { 4782 DependentSizedExtVectorTypeLoc NewTL 4783 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4784 NewTL.setNameLoc(TL.getNameLoc()); 4785 } else { 4786 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4787 NewTL.setNameLoc(TL.getNameLoc()); 4788 } 4789 4790 return Result; 4791 } 4792 4793 template <typename Derived> 4794 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4795 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4796 const DependentAddressSpaceType *T = TL.getTypePtr(); 4797 4798 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4799 4800 if (pointeeType.isNull()) 4801 return QualType(); 4802 4803 // Address spaces are constant expressions. 4804 EnterExpressionEvaluationContext Unevaluated( 4805 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4806 4807 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4808 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4809 if (AddrSpace.isInvalid()) 4810 return QualType(); 4811 4812 QualType Result = TL.getType(); 4813 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4814 AddrSpace.get() != T->getAddrSpaceExpr()) { 4815 Result = getDerived().RebuildDependentAddressSpaceType( 4816 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4817 if (Result.isNull()) 4818 return QualType(); 4819 } 4820 4821 // Result might be dependent or not. 4822 if (isa<DependentAddressSpaceType>(Result)) { 4823 DependentAddressSpaceTypeLoc NewTL = 4824 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4825 4826 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4827 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4828 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4829 4830 } else { 4831 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4832 Result, getDerived().getBaseLocation()); 4833 TransformType(TLB, DI->getTypeLoc()); 4834 } 4835 4836 return Result; 4837 } 4838 4839 template <typename Derived> 4840 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4841 VectorTypeLoc TL) { 4842 const VectorType *T = TL.getTypePtr(); 4843 QualType ElementType = getDerived().TransformType(T->getElementType()); 4844 if (ElementType.isNull()) 4845 return QualType(); 4846 4847 QualType Result = TL.getType(); 4848 if (getDerived().AlwaysRebuild() || 4849 ElementType != T->getElementType()) { 4850 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4851 T->getVectorKind()); 4852 if (Result.isNull()) 4853 return QualType(); 4854 } 4855 4856 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4857 NewTL.setNameLoc(TL.getNameLoc()); 4858 4859 return Result; 4860 } 4861 4862 template<typename Derived> 4863 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4864 ExtVectorTypeLoc TL) { 4865 const VectorType *T = TL.getTypePtr(); 4866 QualType ElementType = getDerived().TransformType(T->getElementType()); 4867 if (ElementType.isNull()) 4868 return QualType(); 4869 4870 QualType Result = TL.getType(); 4871 if (getDerived().AlwaysRebuild() || 4872 ElementType != T->getElementType()) { 4873 Result = getDerived().RebuildExtVectorType(ElementType, 4874 T->getNumElements(), 4875 /*FIXME*/ SourceLocation()); 4876 if (Result.isNull()) 4877 return QualType(); 4878 } 4879 4880 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4881 NewTL.setNameLoc(TL.getNameLoc()); 4882 4883 return Result; 4884 } 4885 4886 template <typename Derived> 4887 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4888 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4889 bool ExpectParameterPack) { 4890 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4891 TypeSourceInfo *NewDI = nullptr; 4892 4893 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4894 // If we're substituting into a pack expansion type and we know the 4895 // length we want to expand to, just substitute for the pattern. 4896 TypeLoc OldTL = OldDI->getTypeLoc(); 4897 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4898 4899 TypeLocBuilder TLB; 4900 TypeLoc NewTL = OldDI->getTypeLoc(); 4901 TLB.reserve(NewTL.getFullDataSize()); 4902 4903 QualType Result = getDerived().TransformType(TLB, 4904 OldExpansionTL.getPatternLoc()); 4905 if (Result.isNull()) 4906 return nullptr; 4907 4908 Result = RebuildPackExpansionType(Result, 4909 OldExpansionTL.getPatternLoc().getSourceRange(), 4910 OldExpansionTL.getEllipsisLoc(), 4911 NumExpansions); 4912 if (Result.isNull()) 4913 return nullptr; 4914 4915 PackExpansionTypeLoc NewExpansionTL 4916 = TLB.push<PackExpansionTypeLoc>(Result); 4917 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4918 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4919 } else 4920 NewDI = getDerived().TransformType(OldDI); 4921 if (!NewDI) 4922 return nullptr; 4923 4924 if (NewDI == OldDI && indexAdjustment == 0) 4925 return OldParm; 4926 4927 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4928 OldParm->getDeclContext(), 4929 OldParm->getInnerLocStart(), 4930 OldParm->getLocation(), 4931 OldParm->getIdentifier(), 4932 NewDI->getType(), 4933 NewDI, 4934 OldParm->getStorageClass(), 4935 /* DefArg */ nullptr); 4936 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4937 OldParm->getFunctionScopeIndex() + indexAdjustment); 4938 return newParm; 4939 } 4940 4941 template <typename Derived> 4942 bool TreeTransform<Derived>::TransformFunctionTypeParams( 4943 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 4944 const QualType *ParamTypes, 4945 const FunctionProtoType::ExtParameterInfo *ParamInfos, 4946 SmallVectorImpl<QualType> &OutParamTypes, 4947 SmallVectorImpl<ParmVarDecl *> *PVars, 4948 Sema::ExtParameterInfoBuilder &PInfos) { 4949 int indexAdjustment = 0; 4950 4951 unsigned NumParams = Params.size(); 4952 for (unsigned i = 0; i != NumParams; ++i) { 4953 if (ParmVarDecl *OldParm = Params[i]) { 4954 assert(OldParm->getFunctionScopeIndex() == i); 4955 4956 Optional<unsigned> NumExpansions; 4957 ParmVarDecl *NewParm = nullptr; 4958 if (OldParm->isParameterPack()) { 4959 // We have a function parameter pack that may need to be expanded. 4960 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4961 4962 // Find the parameter packs that could be expanded. 4963 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4964 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4965 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4966 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4967 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4968 4969 // Determine whether we should expand the parameter packs. 4970 bool ShouldExpand = false; 4971 bool RetainExpansion = false; 4972 Optional<unsigned> OrigNumExpansions = 4973 ExpansionTL.getTypePtr()->getNumExpansions(); 4974 NumExpansions = OrigNumExpansions; 4975 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4976 Pattern.getSourceRange(), 4977 Unexpanded, 4978 ShouldExpand, 4979 RetainExpansion, 4980 NumExpansions)) { 4981 return true; 4982 } 4983 4984 if (ShouldExpand) { 4985 // Expand the function parameter pack into multiple, separate 4986 // parameters. 4987 getDerived().ExpandingFunctionParameterPack(OldParm); 4988 for (unsigned I = 0; I != *NumExpansions; ++I) { 4989 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4990 ParmVarDecl *NewParm 4991 = getDerived().TransformFunctionTypeParam(OldParm, 4992 indexAdjustment++, 4993 OrigNumExpansions, 4994 /*ExpectParameterPack=*/false); 4995 if (!NewParm) 4996 return true; 4997 4998 if (ParamInfos) 4999 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5000 OutParamTypes.push_back(NewParm->getType()); 5001 if (PVars) 5002 PVars->push_back(NewParm); 5003 } 5004 5005 // If we're supposed to retain a pack expansion, do so by temporarily 5006 // forgetting the partially-substituted parameter pack. 5007 if (RetainExpansion) { 5008 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5009 ParmVarDecl *NewParm 5010 = getDerived().TransformFunctionTypeParam(OldParm, 5011 indexAdjustment++, 5012 OrigNumExpansions, 5013 /*ExpectParameterPack=*/false); 5014 if (!NewParm) 5015 return true; 5016 5017 if (ParamInfos) 5018 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5019 OutParamTypes.push_back(NewParm->getType()); 5020 if (PVars) 5021 PVars->push_back(NewParm); 5022 } 5023 5024 // The next parameter should have the same adjustment as the 5025 // last thing we pushed, but we post-incremented indexAdjustment 5026 // on every push. Also, if we push nothing, the adjustment should 5027 // go down by one. 5028 indexAdjustment--; 5029 5030 // We're done with the pack expansion. 5031 continue; 5032 } 5033 5034 // We'll substitute the parameter now without expanding the pack 5035 // expansion. 5036 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5037 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5038 indexAdjustment, 5039 NumExpansions, 5040 /*ExpectParameterPack=*/true); 5041 } else { 5042 NewParm = getDerived().TransformFunctionTypeParam( 5043 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5044 } 5045 5046 if (!NewParm) 5047 return true; 5048 5049 if (ParamInfos) 5050 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5051 OutParamTypes.push_back(NewParm->getType()); 5052 if (PVars) 5053 PVars->push_back(NewParm); 5054 continue; 5055 } 5056 5057 // Deal with the possibility that we don't have a parameter 5058 // declaration for this parameter. 5059 QualType OldType = ParamTypes[i]; 5060 bool IsPackExpansion = false; 5061 Optional<unsigned> NumExpansions; 5062 QualType NewType; 5063 if (const PackExpansionType *Expansion 5064 = dyn_cast<PackExpansionType>(OldType)) { 5065 // We have a function parameter pack that may need to be expanded. 5066 QualType Pattern = Expansion->getPattern(); 5067 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5068 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5069 5070 // Determine whether we should expand the parameter packs. 5071 bool ShouldExpand = false; 5072 bool RetainExpansion = false; 5073 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5074 Unexpanded, 5075 ShouldExpand, 5076 RetainExpansion, 5077 NumExpansions)) { 5078 return true; 5079 } 5080 5081 if (ShouldExpand) { 5082 // Expand the function parameter pack into multiple, separate 5083 // parameters. 5084 for (unsigned I = 0; I != *NumExpansions; ++I) { 5085 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5086 QualType NewType = getDerived().TransformType(Pattern); 5087 if (NewType.isNull()) 5088 return true; 5089 5090 if (NewType->containsUnexpandedParameterPack()) { 5091 NewType = 5092 getSema().getASTContext().getPackExpansionType(NewType, None); 5093 5094 if (NewType.isNull()) 5095 return true; 5096 } 5097 5098 if (ParamInfos) 5099 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5100 OutParamTypes.push_back(NewType); 5101 if (PVars) 5102 PVars->push_back(nullptr); 5103 } 5104 5105 // We're done with the pack expansion. 5106 continue; 5107 } 5108 5109 // If we're supposed to retain a pack expansion, do so by temporarily 5110 // forgetting the partially-substituted parameter pack. 5111 if (RetainExpansion) { 5112 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5113 QualType NewType = getDerived().TransformType(Pattern); 5114 if (NewType.isNull()) 5115 return true; 5116 5117 if (ParamInfos) 5118 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5119 OutParamTypes.push_back(NewType); 5120 if (PVars) 5121 PVars->push_back(nullptr); 5122 } 5123 5124 // We'll substitute the parameter now without expanding the pack 5125 // expansion. 5126 OldType = Expansion->getPattern(); 5127 IsPackExpansion = true; 5128 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5129 NewType = getDerived().TransformType(OldType); 5130 } else { 5131 NewType = getDerived().TransformType(OldType); 5132 } 5133 5134 if (NewType.isNull()) 5135 return true; 5136 5137 if (IsPackExpansion) 5138 NewType = getSema().Context.getPackExpansionType(NewType, 5139 NumExpansions); 5140 5141 if (ParamInfos) 5142 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5143 OutParamTypes.push_back(NewType); 5144 if (PVars) 5145 PVars->push_back(nullptr); 5146 } 5147 5148 #ifndef NDEBUG 5149 if (PVars) { 5150 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5151 if (ParmVarDecl *parm = (*PVars)[i]) 5152 assert(parm->getFunctionScopeIndex() == i); 5153 } 5154 #endif 5155 5156 return false; 5157 } 5158 5159 template<typename Derived> 5160 QualType 5161 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5162 FunctionProtoTypeLoc TL) { 5163 SmallVector<QualType, 4> ExceptionStorage; 5164 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5165 return getDerived().TransformFunctionProtoType( 5166 TLB, TL, nullptr, 0, 5167 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5168 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5169 ExceptionStorage, Changed); 5170 }); 5171 } 5172 5173 template<typename Derived> template<typename Fn> 5174 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5175 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5176 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5177 5178 // Transform the parameters and return type. 5179 // 5180 // We are required to instantiate the params and return type in source order. 5181 // When the function has a trailing return type, we instantiate the 5182 // parameters before the return type, since the return type can then refer 5183 // to the parameters themselves (via decltype, sizeof, etc.). 5184 // 5185 SmallVector<QualType, 4> ParamTypes; 5186 SmallVector<ParmVarDecl*, 4> ParamDecls; 5187 Sema::ExtParameterInfoBuilder ExtParamInfos; 5188 const FunctionProtoType *T = TL.getTypePtr(); 5189 5190 QualType ResultType; 5191 5192 if (T->hasTrailingReturn()) { 5193 if (getDerived().TransformFunctionTypeParams( 5194 TL.getBeginLoc(), TL.getParams(), 5195 TL.getTypePtr()->param_type_begin(), 5196 T->getExtParameterInfosOrNull(), 5197 ParamTypes, &ParamDecls, ExtParamInfos)) 5198 return QualType(); 5199 5200 { 5201 // C++11 [expr.prim.general]p3: 5202 // If a declaration declares a member function or member function 5203 // template of a class X, the expression this is a prvalue of type 5204 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5205 // and the end of the function-definition, member-declarator, or 5206 // declarator. 5207 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5208 5209 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5210 if (ResultType.isNull()) 5211 return QualType(); 5212 } 5213 } 5214 else { 5215 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5216 if (ResultType.isNull()) 5217 return QualType(); 5218 5219 if (getDerived().TransformFunctionTypeParams( 5220 TL.getBeginLoc(), TL.getParams(), 5221 TL.getTypePtr()->param_type_begin(), 5222 T->getExtParameterInfosOrNull(), 5223 ParamTypes, &ParamDecls, ExtParamInfos)) 5224 return QualType(); 5225 } 5226 5227 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5228 5229 bool EPIChanged = false; 5230 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5231 return QualType(); 5232 5233 // Handle extended parameter information. 5234 if (auto NewExtParamInfos = 5235 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5236 if (!EPI.ExtParameterInfos || 5237 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5238 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5239 EPIChanged = true; 5240 } 5241 EPI.ExtParameterInfos = NewExtParamInfos; 5242 } else if (EPI.ExtParameterInfos) { 5243 EPIChanged = true; 5244 EPI.ExtParameterInfos = nullptr; 5245 } 5246 5247 QualType Result = TL.getType(); 5248 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5249 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5250 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5251 if (Result.isNull()) 5252 return QualType(); 5253 } 5254 5255 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5256 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5257 NewTL.setLParenLoc(TL.getLParenLoc()); 5258 NewTL.setRParenLoc(TL.getRParenLoc()); 5259 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5260 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5261 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5262 NewTL.setParam(i, ParamDecls[i]); 5263 5264 return Result; 5265 } 5266 5267 template<typename Derived> 5268 bool TreeTransform<Derived>::TransformExceptionSpec( 5269 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5270 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5271 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5272 5273 // Instantiate a dynamic noexcept expression, if any. 5274 if (isComputedNoexcept(ESI.Type)) { 5275 EnterExpressionEvaluationContext Unevaluated( 5276 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5277 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5278 if (NoexceptExpr.isInvalid()) 5279 return true; 5280 5281 ExceptionSpecificationType EST = ESI.Type; 5282 NoexceptExpr = 5283 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5284 if (NoexceptExpr.isInvalid()) 5285 return true; 5286 5287 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5288 Changed = true; 5289 ESI.NoexceptExpr = NoexceptExpr.get(); 5290 ESI.Type = EST; 5291 } 5292 5293 if (ESI.Type != EST_Dynamic) 5294 return false; 5295 5296 // Instantiate a dynamic exception specification's type. 5297 for (QualType T : ESI.Exceptions) { 5298 if (const PackExpansionType *PackExpansion = 5299 T->getAs<PackExpansionType>()) { 5300 Changed = true; 5301 5302 // We have a pack expansion. Instantiate it. 5303 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5304 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5305 Unexpanded); 5306 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5307 5308 // Determine whether the set of unexpanded parameter packs can and 5309 // should 5310 // be expanded. 5311 bool Expand = false; 5312 bool RetainExpansion = false; 5313 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5314 // FIXME: Track the location of the ellipsis (and track source location 5315 // information for the types in the exception specification in general). 5316 if (getDerived().TryExpandParameterPacks( 5317 Loc, SourceRange(), Unexpanded, Expand, 5318 RetainExpansion, NumExpansions)) 5319 return true; 5320 5321 if (!Expand) { 5322 // We can't expand this pack expansion into separate arguments yet; 5323 // just substitute into the pattern and create a new pack expansion 5324 // type. 5325 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5326 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5327 if (U.isNull()) 5328 return true; 5329 5330 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5331 Exceptions.push_back(U); 5332 continue; 5333 } 5334 5335 // Substitute into the pack expansion pattern for each slice of the 5336 // pack. 5337 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5338 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5339 5340 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5341 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5342 return true; 5343 5344 Exceptions.push_back(U); 5345 } 5346 } else { 5347 QualType U = getDerived().TransformType(T); 5348 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5349 return true; 5350 if (T != U) 5351 Changed = true; 5352 5353 Exceptions.push_back(U); 5354 } 5355 } 5356 5357 ESI.Exceptions = Exceptions; 5358 if (ESI.Exceptions.empty()) 5359 ESI.Type = EST_DynamicNone; 5360 return false; 5361 } 5362 5363 template<typename Derived> 5364 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5365 TypeLocBuilder &TLB, 5366 FunctionNoProtoTypeLoc TL) { 5367 const FunctionNoProtoType *T = TL.getTypePtr(); 5368 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5369 if (ResultType.isNull()) 5370 return QualType(); 5371 5372 QualType Result = TL.getType(); 5373 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5374 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5375 5376 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5377 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5378 NewTL.setLParenLoc(TL.getLParenLoc()); 5379 NewTL.setRParenLoc(TL.getRParenLoc()); 5380 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5381 5382 return Result; 5383 } 5384 5385 template<typename Derived> QualType 5386 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5387 UnresolvedUsingTypeLoc TL) { 5388 const UnresolvedUsingType *T = TL.getTypePtr(); 5389 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5390 if (!D) 5391 return QualType(); 5392 5393 QualType Result = TL.getType(); 5394 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5395 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5396 if (Result.isNull()) 5397 return QualType(); 5398 } 5399 5400 // We might get an arbitrary type spec type back. We should at 5401 // least always get a type spec type, though. 5402 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5403 NewTL.setNameLoc(TL.getNameLoc()); 5404 5405 return Result; 5406 } 5407 5408 template<typename Derived> 5409 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5410 TypedefTypeLoc TL) { 5411 const TypedefType *T = TL.getTypePtr(); 5412 TypedefNameDecl *Typedef 5413 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5414 T->getDecl())); 5415 if (!Typedef) 5416 return QualType(); 5417 5418 QualType Result = TL.getType(); 5419 if (getDerived().AlwaysRebuild() || 5420 Typedef != T->getDecl()) { 5421 Result = getDerived().RebuildTypedefType(Typedef); 5422 if (Result.isNull()) 5423 return QualType(); 5424 } 5425 5426 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5427 NewTL.setNameLoc(TL.getNameLoc()); 5428 5429 return Result; 5430 } 5431 5432 template<typename Derived> 5433 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5434 TypeOfExprTypeLoc TL) { 5435 // typeof expressions are not potentially evaluated contexts 5436 EnterExpressionEvaluationContext Unevaluated( 5437 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5438 Sema::ReuseLambdaContextDecl); 5439 5440 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5441 if (E.isInvalid()) 5442 return QualType(); 5443 5444 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5445 if (E.isInvalid()) 5446 return QualType(); 5447 5448 QualType Result = TL.getType(); 5449 if (getDerived().AlwaysRebuild() || 5450 E.get() != TL.getUnderlyingExpr()) { 5451 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5452 if (Result.isNull()) 5453 return QualType(); 5454 } 5455 else E.get(); 5456 5457 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5458 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5459 NewTL.setLParenLoc(TL.getLParenLoc()); 5460 NewTL.setRParenLoc(TL.getRParenLoc()); 5461 5462 return Result; 5463 } 5464 5465 template<typename Derived> 5466 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5467 TypeOfTypeLoc TL) { 5468 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5469 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5470 if (!New_Under_TI) 5471 return QualType(); 5472 5473 QualType Result = TL.getType(); 5474 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5475 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5476 if (Result.isNull()) 5477 return QualType(); 5478 } 5479 5480 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5481 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5482 NewTL.setLParenLoc(TL.getLParenLoc()); 5483 NewTL.setRParenLoc(TL.getRParenLoc()); 5484 NewTL.setUnderlyingTInfo(New_Under_TI); 5485 5486 return Result; 5487 } 5488 5489 template<typename Derived> 5490 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5491 DecltypeTypeLoc TL) { 5492 const DecltypeType *T = TL.getTypePtr(); 5493 5494 // decltype expressions are not potentially evaluated contexts 5495 EnterExpressionEvaluationContext Unevaluated( 5496 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5497 /*IsDecltype=*/true); 5498 5499 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5500 if (E.isInvalid()) 5501 return QualType(); 5502 5503 E = getSema().ActOnDecltypeExpression(E.get()); 5504 if (E.isInvalid()) 5505 return QualType(); 5506 5507 QualType Result = TL.getType(); 5508 if (getDerived().AlwaysRebuild() || 5509 E.get() != T->getUnderlyingExpr()) { 5510 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5511 if (Result.isNull()) 5512 return QualType(); 5513 } 5514 else E.get(); 5515 5516 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5517 NewTL.setNameLoc(TL.getNameLoc()); 5518 5519 return Result; 5520 } 5521 5522 template<typename Derived> 5523 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5524 TypeLocBuilder &TLB, 5525 UnaryTransformTypeLoc TL) { 5526 QualType Result = TL.getType(); 5527 if (Result->isDependentType()) { 5528 const UnaryTransformType *T = TL.getTypePtr(); 5529 QualType NewBase = 5530 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5531 Result = getDerived().RebuildUnaryTransformType(NewBase, 5532 T->getUTTKind(), 5533 TL.getKWLoc()); 5534 if (Result.isNull()) 5535 return QualType(); 5536 } 5537 5538 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5539 NewTL.setKWLoc(TL.getKWLoc()); 5540 NewTL.setParensRange(TL.getParensRange()); 5541 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5542 return Result; 5543 } 5544 5545 template<typename Derived> 5546 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5547 AutoTypeLoc TL) { 5548 const AutoType *T = TL.getTypePtr(); 5549 QualType OldDeduced = T->getDeducedType(); 5550 QualType NewDeduced; 5551 if (!OldDeduced.isNull()) { 5552 NewDeduced = getDerived().TransformType(OldDeduced); 5553 if (NewDeduced.isNull()) 5554 return QualType(); 5555 } 5556 5557 QualType Result = TL.getType(); 5558 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5559 T->isDependentType()) { 5560 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5561 if (Result.isNull()) 5562 return QualType(); 5563 } 5564 5565 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5566 NewTL.setNameLoc(TL.getNameLoc()); 5567 5568 return Result; 5569 } 5570 5571 template<typename Derived> 5572 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5573 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5574 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5575 5576 CXXScopeSpec SS; 5577 TemplateName TemplateName = getDerived().TransformTemplateName( 5578 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5579 if (TemplateName.isNull()) 5580 return QualType(); 5581 5582 QualType OldDeduced = T->getDeducedType(); 5583 QualType NewDeduced; 5584 if (!OldDeduced.isNull()) { 5585 NewDeduced = getDerived().TransformType(OldDeduced); 5586 if (NewDeduced.isNull()) 5587 return QualType(); 5588 } 5589 5590 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5591 TemplateName, NewDeduced); 5592 if (Result.isNull()) 5593 return QualType(); 5594 5595 DeducedTemplateSpecializationTypeLoc NewTL = 5596 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5597 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5598 5599 return Result; 5600 } 5601 5602 template<typename Derived> 5603 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5604 RecordTypeLoc TL) { 5605 const RecordType *T = TL.getTypePtr(); 5606 RecordDecl *Record 5607 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5608 T->getDecl())); 5609 if (!Record) 5610 return QualType(); 5611 5612 QualType Result = TL.getType(); 5613 if (getDerived().AlwaysRebuild() || 5614 Record != T->getDecl()) { 5615 Result = getDerived().RebuildRecordType(Record); 5616 if (Result.isNull()) 5617 return QualType(); 5618 } 5619 5620 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5621 NewTL.setNameLoc(TL.getNameLoc()); 5622 5623 return Result; 5624 } 5625 5626 template<typename Derived> 5627 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5628 EnumTypeLoc TL) { 5629 const EnumType *T = TL.getTypePtr(); 5630 EnumDecl *Enum 5631 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5632 T->getDecl())); 5633 if (!Enum) 5634 return QualType(); 5635 5636 QualType Result = TL.getType(); 5637 if (getDerived().AlwaysRebuild() || 5638 Enum != T->getDecl()) { 5639 Result = getDerived().RebuildEnumType(Enum); 5640 if (Result.isNull()) 5641 return QualType(); 5642 } 5643 5644 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5645 NewTL.setNameLoc(TL.getNameLoc()); 5646 5647 return Result; 5648 } 5649 5650 template<typename Derived> 5651 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5652 TypeLocBuilder &TLB, 5653 InjectedClassNameTypeLoc TL) { 5654 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5655 TL.getTypePtr()->getDecl()); 5656 if (!D) return QualType(); 5657 5658 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5659 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5660 return T; 5661 } 5662 5663 template<typename Derived> 5664 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5665 TypeLocBuilder &TLB, 5666 TemplateTypeParmTypeLoc TL) { 5667 return TransformTypeSpecType(TLB, TL); 5668 } 5669 5670 template<typename Derived> 5671 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5672 TypeLocBuilder &TLB, 5673 SubstTemplateTypeParmTypeLoc TL) { 5674 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5675 5676 // Substitute into the replacement type, which itself might involve something 5677 // that needs to be transformed. This only tends to occur with default 5678 // template arguments of template template parameters. 5679 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5680 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5681 if (Replacement.isNull()) 5682 return QualType(); 5683 5684 // Always canonicalize the replacement type. 5685 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5686 QualType Result 5687 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5688 Replacement); 5689 5690 // Propagate type-source information. 5691 SubstTemplateTypeParmTypeLoc NewTL 5692 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5693 NewTL.setNameLoc(TL.getNameLoc()); 5694 return Result; 5695 5696 } 5697 5698 template<typename Derived> 5699 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5700 TypeLocBuilder &TLB, 5701 SubstTemplateTypeParmPackTypeLoc TL) { 5702 return TransformTypeSpecType(TLB, TL); 5703 } 5704 5705 template<typename Derived> 5706 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5707 TypeLocBuilder &TLB, 5708 TemplateSpecializationTypeLoc TL) { 5709 const TemplateSpecializationType *T = TL.getTypePtr(); 5710 5711 // The nested-name-specifier never matters in a TemplateSpecializationType, 5712 // because we can't have a dependent nested-name-specifier anyway. 5713 CXXScopeSpec SS; 5714 TemplateName Template 5715 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5716 TL.getTemplateNameLoc()); 5717 if (Template.isNull()) 5718 return QualType(); 5719 5720 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5721 } 5722 5723 template<typename Derived> 5724 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5725 AtomicTypeLoc TL) { 5726 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5727 if (ValueType.isNull()) 5728 return QualType(); 5729 5730 QualType Result = TL.getType(); 5731 if (getDerived().AlwaysRebuild() || 5732 ValueType != TL.getValueLoc().getType()) { 5733 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5734 if (Result.isNull()) 5735 return QualType(); 5736 } 5737 5738 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5739 NewTL.setKWLoc(TL.getKWLoc()); 5740 NewTL.setLParenLoc(TL.getLParenLoc()); 5741 NewTL.setRParenLoc(TL.getRParenLoc()); 5742 5743 return Result; 5744 } 5745 5746 template <typename Derived> 5747 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5748 PipeTypeLoc TL) { 5749 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5750 if (ValueType.isNull()) 5751 return QualType(); 5752 5753 QualType Result = TL.getType(); 5754 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5755 const PipeType *PT = Result->getAs<PipeType>(); 5756 bool isReadPipe = PT->isReadOnly(); 5757 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5758 if (Result.isNull()) 5759 return QualType(); 5760 } 5761 5762 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5763 NewTL.setKWLoc(TL.getKWLoc()); 5764 5765 return Result; 5766 } 5767 5768 /// Simple iterator that traverses the template arguments in a 5769 /// container that provides a \c getArgLoc() member function. 5770 /// 5771 /// This iterator is intended to be used with the iterator form of 5772 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5773 template<typename ArgLocContainer> 5774 class TemplateArgumentLocContainerIterator { 5775 ArgLocContainer *Container; 5776 unsigned Index; 5777 5778 public: 5779 typedef TemplateArgumentLoc value_type; 5780 typedef TemplateArgumentLoc reference; 5781 typedef int difference_type; 5782 typedef std::input_iterator_tag iterator_category; 5783 5784 class pointer { 5785 TemplateArgumentLoc Arg; 5786 5787 public: 5788 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5789 5790 const TemplateArgumentLoc *operator->() const { 5791 return &Arg; 5792 } 5793 }; 5794 5795 5796 TemplateArgumentLocContainerIterator() {} 5797 5798 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5799 unsigned Index) 5800 : Container(&Container), Index(Index) { } 5801 5802 TemplateArgumentLocContainerIterator &operator++() { 5803 ++Index; 5804 return *this; 5805 } 5806 5807 TemplateArgumentLocContainerIterator operator++(int) { 5808 TemplateArgumentLocContainerIterator Old(*this); 5809 ++(*this); 5810 return Old; 5811 } 5812 5813 TemplateArgumentLoc operator*() const { 5814 return Container->getArgLoc(Index); 5815 } 5816 5817 pointer operator->() const { 5818 return pointer(Container->getArgLoc(Index)); 5819 } 5820 5821 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5822 const TemplateArgumentLocContainerIterator &Y) { 5823 return X.Container == Y.Container && X.Index == Y.Index; 5824 } 5825 5826 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5827 const TemplateArgumentLocContainerIterator &Y) { 5828 return !(X == Y); 5829 } 5830 }; 5831 5832 5833 template <typename Derived> 5834 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5835 TypeLocBuilder &TLB, 5836 TemplateSpecializationTypeLoc TL, 5837 TemplateName Template) { 5838 TemplateArgumentListInfo NewTemplateArgs; 5839 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5840 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5841 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5842 ArgIterator; 5843 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5844 ArgIterator(TL, TL.getNumArgs()), 5845 NewTemplateArgs)) 5846 return QualType(); 5847 5848 // FIXME: maybe don't rebuild if all the template arguments are the same. 5849 5850 QualType Result = 5851 getDerived().RebuildTemplateSpecializationType(Template, 5852 TL.getTemplateNameLoc(), 5853 NewTemplateArgs); 5854 5855 if (!Result.isNull()) { 5856 // Specializations of template template parameters are represented as 5857 // TemplateSpecializationTypes, and substitution of type alias templates 5858 // within a dependent context can transform them into 5859 // DependentTemplateSpecializationTypes. 5860 if (isa<DependentTemplateSpecializationType>(Result)) { 5861 DependentTemplateSpecializationTypeLoc NewTL 5862 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5863 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5864 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5865 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5866 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5867 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5868 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5869 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5870 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5871 return Result; 5872 } 5873 5874 TemplateSpecializationTypeLoc NewTL 5875 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5876 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5877 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5878 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5879 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5880 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5881 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5882 } 5883 5884 return Result; 5885 } 5886 5887 template <typename Derived> 5888 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5889 TypeLocBuilder &TLB, 5890 DependentTemplateSpecializationTypeLoc TL, 5891 TemplateName Template, 5892 CXXScopeSpec &SS) { 5893 TemplateArgumentListInfo NewTemplateArgs; 5894 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5895 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5896 typedef TemplateArgumentLocContainerIterator< 5897 DependentTemplateSpecializationTypeLoc> ArgIterator; 5898 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5899 ArgIterator(TL, TL.getNumArgs()), 5900 NewTemplateArgs)) 5901 return QualType(); 5902 5903 // FIXME: maybe don't rebuild if all the template arguments are the same. 5904 5905 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5906 QualType Result 5907 = getSema().Context.getDependentTemplateSpecializationType( 5908 TL.getTypePtr()->getKeyword(), 5909 DTN->getQualifier(), 5910 DTN->getIdentifier(), 5911 NewTemplateArgs); 5912 5913 DependentTemplateSpecializationTypeLoc NewTL 5914 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5915 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5916 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5917 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5918 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5919 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5920 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5921 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5922 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5923 return Result; 5924 } 5925 5926 QualType Result 5927 = getDerived().RebuildTemplateSpecializationType(Template, 5928 TL.getTemplateNameLoc(), 5929 NewTemplateArgs); 5930 5931 if (!Result.isNull()) { 5932 /// FIXME: Wrap this in an elaborated-type-specifier? 5933 TemplateSpecializationTypeLoc NewTL 5934 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5935 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5936 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5937 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5938 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5939 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5940 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5941 } 5942 5943 return Result; 5944 } 5945 5946 template<typename Derived> 5947 QualType 5948 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 5949 ElaboratedTypeLoc TL) { 5950 const ElaboratedType *T = TL.getTypePtr(); 5951 5952 NestedNameSpecifierLoc QualifierLoc; 5953 // NOTE: the qualifier in an ElaboratedType is optional. 5954 if (TL.getQualifierLoc()) { 5955 QualifierLoc 5956 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5957 if (!QualifierLoc) 5958 return QualType(); 5959 } 5960 5961 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 5962 if (NamedT.isNull()) 5963 return QualType(); 5964 5965 // C++0x [dcl.type.elab]p2: 5966 // If the identifier resolves to a typedef-name or the simple-template-id 5967 // resolves to an alias template specialization, the 5968 // elaborated-type-specifier is ill-formed. 5969 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 5970 if (const TemplateSpecializationType *TST = 5971 NamedT->getAs<TemplateSpecializationType>()) { 5972 TemplateName Template = TST->getTemplateName(); 5973 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 5974 Template.getAsTemplateDecl())) { 5975 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 5976 diag::err_tag_reference_non_tag) 5977 << TAT << Sema::NTK_TypeAliasTemplate 5978 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 5979 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 5980 } 5981 } 5982 } 5983 5984 QualType Result = TL.getType(); 5985 if (getDerived().AlwaysRebuild() || 5986 QualifierLoc != TL.getQualifierLoc() || 5987 NamedT != T->getNamedType()) { 5988 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 5989 T->getKeyword(), 5990 QualifierLoc, NamedT); 5991 if (Result.isNull()) 5992 return QualType(); 5993 } 5994 5995 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5996 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5997 NewTL.setQualifierLoc(QualifierLoc); 5998 return Result; 5999 } 6000 6001 template<typename Derived> 6002 QualType TreeTransform<Derived>::TransformAttributedType( 6003 TypeLocBuilder &TLB, 6004 AttributedTypeLoc TL) { 6005 const AttributedType *oldType = TL.getTypePtr(); 6006 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6007 if (modifiedType.isNull()) 6008 return QualType(); 6009 6010 QualType result = TL.getType(); 6011 6012 // FIXME: dependent operand expressions? 6013 if (getDerived().AlwaysRebuild() || 6014 modifiedType != oldType->getModifiedType()) { 6015 // TODO: this is really lame; we should really be rebuilding the 6016 // equivalent type from first principles. 6017 QualType equivalentType 6018 = getDerived().TransformType(oldType->getEquivalentType()); 6019 if (equivalentType.isNull()) 6020 return QualType(); 6021 6022 // Check whether we can add nullability; it is only represented as 6023 // type sugar, and therefore cannot be diagnosed in any other way. 6024 if (auto nullability = oldType->getImmediateNullability()) { 6025 if (!modifiedType->canHaveNullability()) { 6026 SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer) 6027 << DiagNullabilityKind(*nullability, false) << modifiedType; 6028 return QualType(); 6029 } 6030 } 6031 6032 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 6033 modifiedType, 6034 equivalentType); 6035 } 6036 6037 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6038 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 6039 if (TL.hasAttrOperand()) 6040 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 6041 if (TL.hasAttrExprOperand()) 6042 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 6043 else if (TL.hasAttrEnumOperand()) 6044 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 6045 6046 return result; 6047 } 6048 6049 template<typename Derived> 6050 QualType 6051 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6052 ParenTypeLoc TL) { 6053 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6054 if (Inner.isNull()) 6055 return QualType(); 6056 6057 QualType Result = TL.getType(); 6058 if (getDerived().AlwaysRebuild() || 6059 Inner != TL.getInnerLoc().getType()) { 6060 Result = getDerived().RebuildParenType(Inner); 6061 if (Result.isNull()) 6062 return QualType(); 6063 } 6064 6065 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6066 NewTL.setLParenLoc(TL.getLParenLoc()); 6067 NewTL.setRParenLoc(TL.getRParenLoc()); 6068 return Result; 6069 } 6070 6071 template<typename Derived> 6072 QualType TreeTransform<Derived>::TransformDependentNameType( 6073 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6074 return TransformDependentNameType(TLB, TL, false); 6075 } 6076 6077 template<typename Derived> 6078 QualType TreeTransform<Derived>::TransformDependentNameType( 6079 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6080 const DependentNameType *T = TL.getTypePtr(); 6081 6082 NestedNameSpecifierLoc QualifierLoc 6083 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6084 if (!QualifierLoc) 6085 return QualType(); 6086 6087 QualType Result 6088 = getDerived().RebuildDependentNameType(T->getKeyword(), 6089 TL.getElaboratedKeywordLoc(), 6090 QualifierLoc, 6091 T->getIdentifier(), 6092 TL.getNameLoc(), 6093 DeducedTSTContext); 6094 if (Result.isNull()) 6095 return QualType(); 6096 6097 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6098 QualType NamedT = ElabT->getNamedType(); 6099 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6100 6101 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6102 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6103 NewTL.setQualifierLoc(QualifierLoc); 6104 } else { 6105 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6106 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6107 NewTL.setQualifierLoc(QualifierLoc); 6108 NewTL.setNameLoc(TL.getNameLoc()); 6109 } 6110 return Result; 6111 } 6112 6113 template<typename Derived> 6114 QualType TreeTransform<Derived>:: 6115 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6116 DependentTemplateSpecializationTypeLoc TL) { 6117 NestedNameSpecifierLoc QualifierLoc; 6118 if (TL.getQualifierLoc()) { 6119 QualifierLoc 6120 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6121 if (!QualifierLoc) 6122 return QualType(); 6123 } 6124 6125 return getDerived() 6126 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6127 } 6128 6129 template<typename Derived> 6130 QualType TreeTransform<Derived>:: 6131 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6132 DependentTemplateSpecializationTypeLoc TL, 6133 NestedNameSpecifierLoc QualifierLoc) { 6134 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6135 6136 TemplateArgumentListInfo NewTemplateArgs; 6137 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6138 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6139 6140 typedef TemplateArgumentLocContainerIterator< 6141 DependentTemplateSpecializationTypeLoc> ArgIterator; 6142 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6143 ArgIterator(TL, TL.getNumArgs()), 6144 NewTemplateArgs)) 6145 return QualType(); 6146 6147 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6148 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6149 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6150 /*AllowInjectedClassName*/ false); 6151 if (Result.isNull()) 6152 return QualType(); 6153 6154 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6155 QualType NamedT = ElabT->getNamedType(); 6156 6157 // Copy information relevant to the template specialization. 6158 TemplateSpecializationTypeLoc NamedTL 6159 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6160 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6161 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6162 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6163 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6164 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6165 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6166 6167 // Copy information relevant to the elaborated type. 6168 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6169 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6170 NewTL.setQualifierLoc(QualifierLoc); 6171 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6172 DependentTemplateSpecializationTypeLoc SpecTL 6173 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6174 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6175 SpecTL.setQualifierLoc(QualifierLoc); 6176 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6177 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6178 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6179 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6180 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6181 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6182 } else { 6183 TemplateSpecializationTypeLoc SpecTL 6184 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6185 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6186 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6187 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6188 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6189 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6190 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6191 } 6192 return Result; 6193 } 6194 6195 template<typename Derived> 6196 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6197 PackExpansionTypeLoc TL) { 6198 QualType Pattern 6199 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6200 if (Pattern.isNull()) 6201 return QualType(); 6202 6203 QualType Result = TL.getType(); 6204 if (getDerived().AlwaysRebuild() || 6205 Pattern != TL.getPatternLoc().getType()) { 6206 Result = getDerived().RebuildPackExpansionType(Pattern, 6207 TL.getPatternLoc().getSourceRange(), 6208 TL.getEllipsisLoc(), 6209 TL.getTypePtr()->getNumExpansions()); 6210 if (Result.isNull()) 6211 return QualType(); 6212 } 6213 6214 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6215 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6216 return Result; 6217 } 6218 6219 template<typename Derived> 6220 QualType 6221 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6222 ObjCInterfaceTypeLoc TL) { 6223 // ObjCInterfaceType is never dependent. 6224 TLB.pushFullCopy(TL); 6225 return TL.getType(); 6226 } 6227 6228 template<typename Derived> 6229 QualType 6230 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6231 ObjCTypeParamTypeLoc TL) { 6232 const ObjCTypeParamType *T = TL.getTypePtr(); 6233 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6234 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6235 if (!OTP) 6236 return QualType(); 6237 6238 QualType Result = TL.getType(); 6239 if (getDerived().AlwaysRebuild() || 6240 OTP != T->getDecl()) { 6241 Result = getDerived().RebuildObjCTypeParamType(OTP, 6242 TL.getProtocolLAngleLoc(), 6243 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6244 TL.getNumProtocols()), 6245 TL.getProtocolLocs(), 6246 TL.getProtocolRAngleLoc()); 6247 if (Result.isNull()) 6248 return QualType(); 6249 } 6250 6251 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6252 if (TL.getNumProtocols()) { 6253 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6254 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6255 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6256 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6257 } 6258 return Result; 6259 } 6260 6261 template<typename Derived> 6262 QualType 6263 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6264 ObjCObjectTypeLoc TL) { 6265 // Transform base type. 6266 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6267 if (BaseType.isNull()) 6268 return QualType(); 6269 6270 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6271 6272 // Transform type arguments. 6273 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6274 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6275 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6276 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6277 QualType TypeArg = TypeArgInfo->getType(); 6278 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6279 AnyChanged = true; 6280 6281 // We have a pack expansion. Instantiate it. 6282 const auto *PackExpansion = PackExpansionLoc.getType() 6283 ->castAs<PackExpansionType>(); 6284 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6285 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6286 Unexpanded); 6287 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6288 6289 // Determine whether the set of unexpanded parameter packs can 6290 // and should be expanded. 6291 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6292 bool Expand = false; 6293 bool RetainExpansion = false; 6294 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6295 if (getDerived().TryExpandParameterPacks( 6296 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6297 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6298 return QualType(); 6299 6300 if (!Expand) { 6301 // We can't expand this pack expansion into separate arguments yet; 6302 // just substitute into the pattern and create a new pack expansion 6303 // type. 6304 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6305 6306 TypeLocBuilder TypeArgBuilder; 6307 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6308 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6309 PatternLoc); 6310 if (NewPatternType.isNull()) 6311 return QualType(); 6312 6313 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6314 NewPatternType, NumExpansions); 6315 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6316 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6317 NewTypeArgInfos.push_back( 6318 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6319 continue; 6320 } 6321 6322 // Substitute into the pack expansion pattern for each slice of the 6323 // pack. 6324 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6325 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6326 6327 TypeLocBuilder TypeArgBuilder; 6328 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6329 6330 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6331 PatternLoc); 6332 if (NewTypeArg.isNull()) 6333 return QualType(); 6334 6335 NewTypeArgInfos.push_back( 6336 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6337 } 6338 6339 continue; 6340 } 6341 6342 TypeLocBuilder TypeArgBuilder; 6343 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6344 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6345 if (NewTypeArg.isNull()) 6346 return QualType(); 6347 6348 // If nothing changed, just keep the old TypeSourceInfo. 6349 if (NewTypeArg == TypeArg) { 6350 NewTypeArgInfos.push_back(TypeArgInfo); 6351 continue; 6352 } 6353 6354 NewTypeArgInfos.push_back( 6355 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6356 AnyChanged = true; 6357 } 6358 6359 QualType Result = TL.getType(); 6360 if (getDerived().AlwaysRebuild() || AnyChanged) { 6361 // Rebuild the type. 6362 Result = getDerived().RebuildObjCObjectType( 6363 BaseType, 6364 TL.getLocStart(), 6365 TL.getTypeArgsLAngleLoc(), 6366 NewTypeArgInfos, 6367 TL.getTypeArgsRAngleLoc(), 6368 TL.getProtocolLAngleLoc(), 6369 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6370 TL.getNumProtocols()), 6371 TL.getProtocolLocs(), 6372 TL.getProtocolRAngleLoc()); 6373 6374 if (Result.isNull()) 6375 return QualType(); 6376 } 6377 6378 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6379 NewT.setHasBaseTypeAsWritten(true); 6380 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6381 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6382 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6383 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6384 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6385 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6386 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6387 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6388 return Result; 6389 } 6390 6391 template<typename Derived> 6392 QualType 6393 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6394 ObjCObjectPointerTypeLoc TL) { 6395 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6396 if (PointeeType.isNull()) 6397 return QualType(); 6398 6399 QualType Result = TL.getType(); 6400 if (getDerived().AlwaysRebuild() || 6401 PointeeType != TL.getPointeeLoc().getType()) { 6402 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6403 TL.getStarLoc()); 6404 if (Result.isNull()) 6405 return QualType(); 6406 } 6407 6408 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6409 NewT.setStarLoc(TL.getStarLoc()); 6410 return Result; 6411 } 6412 6413 //===----------------------------------------------------------------------===// 6414 // Statement transformation 6415 //===----------------------------------------------------------------------===// 6416 template<typename Derived> 6417 StmtResult 6418 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6419 return S; 6420 } 6421 6422 template<typename Derived> 6423 StmtResult 6424 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6425 return getDerived().TransformCompoundStmt(S, false); 6426 } 6427 6428 template<typename Derived> 6429 StmtResult 6430 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6431 bool IsStmtExpr) { 6432 Sema::CompoundScopeRAII CompoundScope(getSema()); 6433 6434 bool SubStmtInvalid = false; 6435 bool SubStmtChanged = false; 6436 SmallVector<Stmt*, 8> Statements; 6437 for (auto *B : S->body()) { 6438 StmtResult Result = getDerived().TransformStmt(B); 6439 if (Result.isInvalid()) { 6440 // Immediately fail if this was a DeclStmt, since it's very 6441 // likely that this will cause problems for future statements. 6442 if (isa<DeclStmt>(B)) 6443 return StmtError(); 6444 6445 // Otherwise, just keep processing substatements and fail later. 6446 SubStmtInvalid = true; 6447 continue; 6448 } 6449 6450 SubStmtChanged = SubStmtChanged || Result.get() != B; 6451 Statements.push_back(Result.getAs<Stmt>()); 6452 } 6453 6454 if (SubStmtInvalid) 6455 return StmtError(); 6456 6457 if (!getDerived().AlwaysRebuild() && 6458 !SubStmtChanged) 6459 return S; 6460 6461 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6462 Statements, 6463 S->getRBracLoc(), 6464 IsStmtExpr); 6465 } 6466 6467 template<typename Derived> 6468 StmtResult 6469 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6470 ExprResult LHS, RHS; 6471 { 6472 EnterExpressionEvaluationContext Unevaluated( 6473 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6474 6475 // Transform the left-hand case value. 6476 LHS = getDerived().TransformExpr(S->getLHS()); 6477 LHS = SemaRef.ActOnConstantExpression(LHS); 6478 if (LHS.isInvalid()) 6479 return StmtError(); 6480 6481 // Transform the right-hand case value (for the GNU case-range extension). 6482 RHS = getDerived().TransformExpr(S->getRHS()); 6483 RHS = SemaRef.ActOnConstantExpression(RHS); 6484 if (RHS.isInvalid()) 6485 return StmtError(); 6486 } 6487 6488 // Build the case statement. 6489 // Case statements are always rebuilt so that they will attached to their 6490 // transformed switch statement. 6491 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6492 LHS.get(), 6493 S->getEllipsisLoc(), 6494 RHS.get(), 6495 S->getColonLoc()); 6496 if (Case.isInvalid()) 6497 return StmtError(); 6498 6499 // Transform the statement following the case 6500 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6501 if (SubStmt.isInvalid()) 6502 return StmtError(); 6503 6504 // Attach the body to the case statement 6505 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6506 } 6507 6508 template<typename Derived> 6509 StmtResult 6510 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6511 // Transform the statement following the default case 6512 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6513 if (SubStmt.isInvalid()) 6514 return StmtError(); 6515 6516 // Default statements are always rebuilt 6517 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6518 SubStmt.get()); 6519 } 6520 6521 template<typename Derived> 6522 StmtResult 6523 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6524 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6525 if (SubStmt.isInvalid()) 6526 return StmtError(); 6527 6528 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6529 S->getDecl()); 6530 if (!LD) 6531 return StmtError(); 6532 6533 6534 // FIXME: Pass the real colon location in. 6535 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6536 cast<LabelDecl>(LD), SourceLocation(), 6537 SubStmt.get()); 6538 } 6539 6540 template <typename Derived> 6541 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6542 if (!R) 6543 return R; 6544 6545 switch (R->getKind()) { 6546 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6547 #define ATTR(X) 6548 #define PRAGMA_SPELLING_ATTR(X) \ 6549 case attr::X: \ 6550 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6551 #include "clang/Basic/AttrList.inc" 6552 default: 6553 return R; 6554 } 6555 } 6556 6557 template <typename Derived> 6558 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6559 bool AttrsChanged = false; 6560 SmallVector<const Attr *, 1> Attrs; 6561 6562 // Visit attributes and keep track if any are transformed. 6563 for (const auto *I : S->getAttrs()) { 6564 const Attr *R = getDerived().TransformAttr(I); 6565 AttrsChanged |= (I != R); 6566 Attrs.push_back(R); 6567 } 6568 6569 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6570 if (SubStmt.isInvalid()) 6571 return StmtError(); 6572 6573 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6574 return S; 6575 6576 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6577 SubStmt.get()); 6578 } 6579 6580 template<typename Derived> 6581 StmtResult 6582 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6583 // Transform the initialization statement 6584 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6585 if (Init.isInvalid()) 6586 return StmtError(); 6587 6588 // Transform the condition 6589 Sema::ConditionResult Cond = getDerived().TransformCondition( 6590 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6591 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6592 : Sema::ConditionKind::Boolean); 6593 if (Cond.isInvalid()) 6594 return StmtError(); 6595 6596 // If this is a constexpr if, determine which arm we should instantiate. 6597 llvm::Optional<bool> ConstexprConditionValue; 6598 if (S->isConstexpr()) 6599 ConstexprConditionValue = Cond.getKnownValue(); 6600 6601 // Transform the "then" branch. 6602 StmtResult Then; 6603 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6604 Then = getDerived().TransformStmt(S->getThen()); 6605 if (Then.isInvalid()) 6606 return StmtError(); 6607 } else { 6608 Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart()); 6609 } 6610 6611 // Transform the "else" branch. 6612 StmtResult Else; 6613 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6614 Else = getDerived().TransformStmt(S->getElse()); 6615 if (Else.isInvalid()) 6616 return StmtError(); 6617 } 6618 6619 if (!getDerived().AlwaysRebuild() && 6620 Init.get() == S->getInit() && 6621 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6622 Then.get() == S->getThen() && 6623 Else.get() == S->getElse()) 6624 return S; 6625 6626 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6627 Init.get(), Then.get(), S->getElseLoc(), 6628 Else.get()); 6629 } 6630 6631 template<typename Derived> 6632 StmtResult 6633 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6634 // Transform the initialization statement 6635 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6636 if (Init.isInvalid()) 6637 return StmtError(); 6638 6639 // Transform the condition. 6640 Sema::ConditionResult Cond = getDerived().TransformCondition( 6641 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6642 Sema::ConditionKind::Switch); 6643 if (Cond.isInvalid()) 6644 return StmtError(); 6645 6646 // Rebuild the switch statement. 6647 StmtResult Switch 6648 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 6649 if (Switch.isInvalid()) 6650 return StmtError(); 6651 6652 // Transform the body of the switch statement. 6653 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6654 if (Body.isInvalid()) 6655 return StmtError(); 6656 6657 // Complete the switch statement. 6658 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6659 Body.get()); 6660 } 6661 6662 template<typename Derived> 6663 StmtResult 6664 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6665 // Transform the condition 6666 Sema::ConditionResult Cond = getDerived().TransformCondition( 6667 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6668 Sema::ConditionKind::Boolean); 6669 if (Cond.isInvalid()) 6670 return StmtError(); 6671 6672 // Transform the body 6673 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6674 if (Body.isInvalid()) 6675 return StmtError(); 6676 6677 if (!getDerived().AlwaysRebuild() && 6678 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6679 Body.get() == S->getBody()) 6680 return Owned(S); 6681 6682 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6683 } 6684 6685 template<typename Derived> 6686 StmtResult 6687 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6688 // Transform the body 6689 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6690 if (Body.isInvalid()) 6691 return StmtError(); 6692 6693 // Transform the condition 6694 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6695 if (Cond.isInvalid()) 6696 return StmtError(); 6697 6698 if (!getDerived().AlwaysRebuild() && 6699 Cond.get() == S->getCond() && 6700 Body.get() == S->getBody()) 6701 return S; 6702 6703 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6704 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6705 S->getRParenLoc()); 6706 } 6707 6708 template<typename Derived> 6709 StmtResult 6710 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6711 // Transform the initialization statement 6712 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6713 if (Init.isInvalid()) 6714 return StmtError(); 6715 6716 // In OpenMP loop region loop control variable must be captured and be 6717 // private. Perform analysis of first part (if any). 6718 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6719 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6720 6721 // Transform the condition 6722 Sema::ConditionResult Cond = getDerived().TransformCondition( 6723 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6724 Sema::ConditionKind::Boolean); 6725 if (Cond.isInvalid()) 6726 return StmtError(); 6727 6728 // Transform the increment 6729 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6730 if (Inc.isInvalid()) 6731 return StmtError(); 6732 6733 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6734 if (S->getInc() && !FullInc.get()) 6735 return StmtError(); 6736 6737 // Transform the body 6738 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6739 if (Body.isInvalid()) 6740 return StmtError(); 6741 6742 if (!getDerived().AlwaysRebuild() && 6743 Init.get() == S->getInit() && 6744 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6745 Inc.get() == S->getInc() && 6746 Body.get() == S->getBody()) 6747 return S; 6748 6749 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6750 Init.get(), Cond, FullInc, 6751 S->getRParenLoc(), Body.get()); 6752 } 6753 6754 template<typename Derived> 6755 StmtResult 6756 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6757 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6758 S->getLabel()); 6759 if (!LD) 6760 return StmtError(); 6761 6762 // Goto statements must always be rebuilt, to resolve the label. 6763 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6764 cast<LabelDecl>(LD)); 6765 } 6766 6767 template<typename Derived> 6768 StmtResult 6769 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6770 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6771 if (Target.isInvalid()) 6772 return StmtError(); 6773 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6774 6775 if (!getDerived().AlwaysRebuild() && 6776 Target.get() == S->getTarget()) 6777 return S; 6778 6779 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6780 Target.get()); 6781 } 6782 6783 template<typename Derived> 6784 StmtResult 6785 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6786 return S; 6787 } 6788 6789 template<typename Derived> 6790 StmtResult 6791 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6792 return S; 6793 } 6794 6795 template<typename Derived> 6796 StmtResult 6797 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6798 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6799 /*NotCopyInit*/false); 6800 if (Result.isInvalid()) 6801 return StmtError(); 6802 6803 // FIXME: We always rebuild the return statement because there is no way 6804 // to tell whether the return type of the function has changed. 6805 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6806 } 6807 6808 template<typename Derived> 6809 StmtResult 6810 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6811 bool DeclChanged = false; 6812 SmallVector<Decl *, 4> Decls; 6813 for (auto *D : S->decls()) { 6814 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6815 if (!Transformed) 6816 return StmtError(); 6817 6818 if (Transformed != D) 6819 DeclChanged = true; 6820 6821 Decls.push_back(Transformed); 6822 } 6823 6824 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6825 return S; 6826 6827 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc()); 6828 } 6829 6830 template<typename Derived> 6831 StmtResult 6832 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6833 6834 SmallVector<Expr*, 8> Constraints; 6835 SmallVector<Expr*, 8> Exprs; 6836 SmallVector<IdentifierInfo *, 4> Names; 6837 6838 ExprResult AsmString; 6839 SmallVector<Expr*, 8> Clobbers; 6840 6841 bool ExprsChanged = false; 6842 6843 // Go through the outputs. 6844 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6845 Names.push_back(S->getOutputIdentifier(I)); 6846 6847 // No need to transform the constraint literal. 6848 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6849 6850 // Transform the output expr. 6851 Expr *OutputExpr = S->getOutputExpr(I); 6852 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6853 if (Result.isInvalid()) 6854 return StmtError(); 6855 6856 ExprsChanged |= Result.get() != OutputExpr; 6857 6858 Exprs.push_back(Result.get()); 6859 } 6860 6861 // Go through the inputs. 6862 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6863 Names.push_back(S->getInputIdentifier(I)); 6864 6865 // No need to transform the constraint literal. 6866 Constraints.push_back(S->getInputConstraintLiteral(I)); 6867 6868 // Transform the input expr. 6869 Expr *InputExpr = S->getInputExpr(I); 6870 ExprResult Result = getDerived().TransformExpr(InputExpr); 6871 if (Result.isInvalid()) 6872 return StmtError(); 6873 6874 ExprsChanged |= Result.get() != InputExpr; 6875 6876 Exprs.push_back(Result.get()); 6877 } 6878 6879 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6880 return S; 6881 6882 // Go through the clobbers. 6883 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6884 Clobbers.push_back(S->getClobberStringLiteral(I)); 6885 6886 // No need to transform the asm string literal. 6887 AsmString = S->getAsmString(); 6888 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6889 S->isVolatile(), S->getNumOutputs(), 6890 S->getNumInputs(), Names.data(), 6891 Constraints, Exprs, AsmString.get(), 6892 Clobbers, S->getRParenLoc()); 6893 } 6894 6895 template<typename Derived> 6896 StmtResult 6897 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6898 ArrayRef<Token> AsmToks = 6899 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6900 6901 bool HadError = false, HadChange = false; 6902 6903 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6904 SmallVector<Expr*, 8> TransformedExprs; 6905 TransformedExprs.reserve(SrcExprs.size()); 6906 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6907 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6908 if (!Result.isUsable()) { 6909 HadError = true; 6910 } else { 6911 HadChange |= (Result.get() != SrcExprs[i]); 6912 TransformedExprs.push_back(Result.get()); 6913 } 6914 } 6915 6916 if (HadError) return StmtError(); 6917 if (!HadChange && !getDerived().AlwaysRebuild()) 6918 return Owned(S); 6919 6920 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6921 AsmToks, S->getAsmString(), 6922 S->getNumOutputs(), S->getNumInputs(), 6923 S->getAllConstraints(), S->getClobbers(), 6924 TransformedExprs, S->getEndLoc()); 6925 } 6926 6927 // C++ Coroutines TS 6928 6929 template<typename Derived> 6930 StmtResult 6931 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6932 auto *ScopeInfo = SemaRef.getCurFunction(); 6933 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 6934 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 6935 ScopeInfo->NeedsCoroutineSuspends && 6936 ScopeInfo->CoroutineSuspends.first == nullptr && 6937 ScopeInfo->CoroutineSuspends.second == nullptr && 6938 "expected clean scope info"); 6939 6940 // Set that we have (possibly-invalid) suspend points before we do anything 6941 // that may fail. 6942 ScopeInfo->setNeedsCoroutineSuspends(false); 6943 6944 // The new CoroutinePromise object needs to be built and put into the current 6945 // FunctionScopeInfo before any transformations or rebuilding occurs. 6946 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 6947 return StmtError(); 6948 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 6949 if (!Promise) 6950 return StmtError(); 6951 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 6952 ScopeInfo->CoroutinePromise = Promise; 6953 6954 // Transform the implicit coroutine statements we built during the initial 6955 // parse. 6956 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 6957 if (InitSuspend.isInvalid()) 6958 return StmtError(); 6959 StmtResult FinalSuspend = 6960 getDerived().TransformStmt(S->getFinalSuspendStmt()); 6961 if (FinalSuspend.isInvalid()) 6962 return StmtError(); 6963 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 6964 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 6965 6966 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 6967 if (BodyRes.isInvalid()) 6968 return StmtError(); 6969 6970 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 6971 if (Builder.isInvalid()) 6972 return StmtError(); 6973 6974 Expr *ReturnObject = S->getReturnValueInit(); 6975 assert(ReturnObject && "the return object is expected to be valid"); 6976 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 6977 /*NoCopyInit*/ false); 6978 if (Res.isInvalid()) 6979 return StmtError(); 6980 Builder.ReturnValue = Res.get(); 6981 6982 if (S->hasDependentPromiseType()) { 6983 assert(!Promise->getType()->isDependentType() && 6984 "the promise type must no longer be dependent"); 6985 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 6986 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 6987 "these nodes should not have been built yet"); 6988 if (!Builder.buildDependentStatements()) 6989 return StmtError(); 6990 } else { 6991 if (auto *OnFallthrough = S->getFallthroughHandler()) { 6992 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 6993 if (Res.isInvalid()) 6994 return StmtError(); 6995 Builder.OnFallthrough = Res.get(); 6996 } 6997 6998 if (auto *OnException = S->getExceptionHandler()) { 6999 StmtResult Res = getDerived().TransformStmt(OnException); 7000 if (Res.isInvalid()) 7001 return StmtError(); 7002 Builder.OnException = Res.get(); 7003 } 7004 7005 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7006 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7007 if (Res.isInvalid()) 7008 return StmtError(); 7009 Builder.ReturnStmtOnAllocFailure = Res.get(); 7010 } 7011 7012 // Transform any additional statements we may have already built 7013 assert(S->getAllocate() && S->getDeallocate() && 7014 "allocation and deallocation calls must already be built"); 7015 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7016 if (AllocRes.isInvalid()) 7017 return StmtError(); 7018 Builder.Allocate = AllocRes.get(); 7019 7020 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7021 if (DeallocRes.isInvalid()) 7022 return StmtError(); 7023 Builder.Deallocate = DeallocRes.get(); 7024 7025 assert(S->getResultDecl() && "ResultDecl must already be built"); 7026 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7027 if (ResultDecl.isInvalid()) 7028 return StmtError(); 7029 Builder.ResultDecl = ResultDecl.get(); 7030 7031 if (auto *ReturnStmt = S->getReturnStmt()) { 7032 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7033 if (Res.isInvalid()) 7034 return StmtError(); 7035 Builder.ReturnStmt = Res.get(); 7036 } 7037 } 7038 7039 return getDerived().RebuildCoroutineBodyStmt(Builder); 7040 } 7041 7042 template<typename Derived> 7043 StmtResult 7044 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7045 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7046 /*NotCopyInit*/false); 7047 if (Result.isInvalid()) 7048 return StmtError(); 7049 7050 // Always rebuild; we don't know if this needs to be injected into a new 7051 // context or if the promise type has changed. 7052 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7053 S->isImplicit()); 7054 } 7055 7056 template<typename Derived> 7057 ExprResult 7058 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7059 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7060 /*NotCopyInit*/false); 7061 if (Result.isInvalid()) 7062 return ExprError(); 7063 7064 // Always rebuild; we don't know if this needs to be injected into a new 7065 // context or if the promise type has changed. 7066 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7067 E->isImplicit()); 7068 } 7069 7070 template <typename Derived> 7071 ExprResult 7072 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7073 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7074 /*NotCopyInit*/ false); 7075 if (OperandResult.isInvalid()) 7076 return ExprError(); 7077 7078 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7079 E->getOperatorCoawaitLookup()); 7080 7081 if (LookupResult.isInvalid()) 7082 return ExprError(); 7083 7084 // Always rebuild; we don't know if this needs to be injected into a new 7085 // context or if the promise type has changed. 7086 return getDerived().RebuildDependentCoawaitExpr( 7087 E->getKeywordLoc(), OperandResult.get(), 7088 cast<UnresolvedLookupExpr>(LookupResult.get())); 7089 } 7090 7091 template<typename Derived> 7092 ExprResult 7093 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7094 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7095 /*NotCopyInit*/false); 7096 if (Result.isInvalid()) 7097 return ExprError(); 7098 7099 // Always rebuild; we don't know if this needs to be injected into a new 7100 // context or if the promise type has changed. 7101 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7102 } 7103 7104 // Objective-C Statements. 7105 7106 template<typename Derived> 7107 StmtResult 7108 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7109 // Transform the body of the @try. 7110 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7111 if (TryBody.isInvalid()) 7112 return StmtError(); 7113 7114 // Transform the @catch statements (if present). 7115 bool AnyCatchChanged = false; 7116 SmallVector<Stmt*, 8> CatchStmts; 7117 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7118 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7119 if (Catch.isInvalid()) 7120 return StmtError(); 7121 if (Catch.get() != S->getCatchStmt(I)) 7122 AnyCatchChanged = true; 7123 CatchStmts.push_back(Catch.get()); 7124 } 7125 7126 // Transform the @finally statement (if present). 7127 StmtResult Finally; 7128 if (S->getFinallyStmt()) { 7129 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7130 if (Finally.isInvalid()) 7131 return StmtError(); 7132 } 7133 7134 // If nothing changed, just retain this statement. 7135 if (!getDerived().AlwaysRebuild() && 7136 TryBody.get() == S->getTryBody() && 7137 !AnyCatchChanged && 7138 Finally.get() == S->getFinallyStmt()) 7139 return S; 7140 7141 // Build a new statement. 7142 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7143 CatchStmts, Finally.get()); 7144 } 7145 7146 template<typename Derived> 7147 StmtResult 7148 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7149 // Transform the @catch parameter, if there is one. 7150 VarDecl *Var = nullptr; 7151 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7152 TypeSourceInfo *TSInfo = nullptr; 7153 if (FromVar->getTypeSourceInfo()) { 7154 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7155 if (!TSInfo) 7156 return StmtError(); 7157 } 7158 7159 QualType T; 7160 if (TSInfo) 7161 T = TSInfo->getType(); 7162 else { 7163 T = getDerived().TransformType(FromVar->getType()); 7164 if (T.isNull()) 7165 return StmtError(); 7166 } 7167 7168 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7169 if (!Var) 7170 return StmtError(); 7171 } 7172 7173 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7174 if (Body.isInvalid()) 7175 return StmtError(); 7176 7177 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7178 S->getRParenLoc(), 7179 Var, Body.get()); 7180 } 7181 7182 template<typename Derived> 7183 StmtResult 7184 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7185 // Transform the body. 7186 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7187 if (Body.isInvalid()) 7188 return StmtError(); 7189 7190 // If nothing changed, just retain this statement. 7191 if (!getDerived().AlwaysRebuild() && 7192 Body.get() == S->getFinallyBody()) 7193 return S; 7194 7195 // Build a new statement. 7196 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7197 Body.get()); 7198 } 7199 7200 template<typename Derived> 7201 StmtResult 7202 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7203 ExprResult Operand; 7204 if (S->getThrowExpr()) { 7205 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7206 if (Operand.isInvalid()) 7207 return StmtError(); 7208 } 7209 7210 if (!getDerived().AlwaysRebuild() && 7211 Operand.get() == S->getThrowExpr()) 7212 return S; 7213 7214 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7215 } 7216 7217 template<typename Derived> 7218 StmtResult 7219 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7220 ObjCAtSynchronizedStmt *S) { 7221 // Transform the object we are locking. 7222 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7223 if (Object.isInvalid()) 7224 return StmtError(); 7225 Object = 7226 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7227 Object.get()); 7228 if (Object.isInvalid()) 7229 return StmtError(); 7230 7231 // Transform the body. 7232 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7233 if (Body.isInvalid()) 7234 return StmtError(); 7235 7236 // If nothing change, just retain the current statement. 7237 if (!getDerived().AlwaysRebuild() && 7238 Object.get() == S->getSynchExpr() && 7239 Body.get() == S->getSynchBody()) 7240 return S; 7241 7242 // Build a new statement. 7243 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7244 Object.get(), Body.get()); 7245 } 7246 7247 template<typename Derived> 7248 StmtResult 7249 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7250 ObjCAutoreleasePoolStmt *S) { 7251 // Transform the body. 7252 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7253 if (Body.isInvalid()) 7254 return StmtError(); 7255 7256 // If nothing changed, just retain this statement. 7257 if (!getDerived().AlwaysRebuild() && 7258 Body.get() == S->getSubStmt()) 7259 return S; 7260 7261 // Build a new statement. 7262 return getDerived().RebuildObjCAutoreleasePoolStmt( 7263 S->getAtLoc(), Body.get()); 7264 } 7265 7266 template<typename Derived> 7267 StmtResult 7268 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7269 ObjCForCollectionStmt *S) { 7270 // Transform the element statement. 7271 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7272 if (Element.isInvalid()) 7273 return StmtError(); 7274 7275 // Transform the collection expression. 7276 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7277 if (Collection.isInvalid()) 7278 return StmtError(); 7279 7280 // Transform the body. 7281 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7282 if (Body.isInvalid()) 7283 return StmtError(); 7284 7285 // If nothing changed, just retain this statement. 7286 if (!getDerived().AlwaysRebuild() && 7287 Element.get() == S->getElement() && 7288 Collection.get() == S->getCollection() && 7289 Body.get() == S->getBody()) 7290 return S; 7291 7292 // Build a new statement. 7293 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7294 Element.get(), 7295 Collection.get(), 7296 S->getRParenLoc(), 7297 Body.get()); 7298 } 7299 7300 template <typename Derived> 7301 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7302 // Transform the exception declaration, if any. 7303 VarDecl *Var = nullptr; 7304 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7305 TypeSourceInfo *T = 7306 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7307 if (!T) 7308 return StmtError(); 7309 7310 Var = getDerived().RebuildExceptionDecl( 7311 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7312 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7313 if (!Var || Var->isInvalidDecl()) 7314 return StmtError(); 7315 } 7316 7317 // Transform the actual exception handler. 7318 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7319 if (Handler.isInvalid()) 7320 return StmtError(); 7321 7322 if (!getDerived().AlwaysRebuild() && !Var && 7323 Handler.get() == S->getHandlerBlock()) 7324 return S; 7325 7326 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7327 } 7328 7329 template <typename Derived> 7330 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7331 // Transform the try block itself. 7332 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7333 if (TryBlock.isInvalid()) 7334 return StmtError(); 7335 7336 // Transform the handlers. 7337 bool HandlerChanged = false; 7338 SmallVector<Stmt *, 8> Handlers; 7339 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7340 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7341 if (Handler.isInvalid()) 7342 return StmtError(); 7343 7344 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7345 Handlers.push_back(Handler.getAs<Stmt>()); 7346 } 7347 7348 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7349 !HandlerChanged) 7350 return S; 7351 7352 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7353 Handlers); 7354 } 7355 7356 template<typename Derived> 7357 StmtResult 7358 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7359 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7360 if (Range.isInvalid()) 7361 return StmtError(); 7362 7363 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7364 if (Begin.isInvalid()) 7365 return StmtError(); 7366 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7367 if (End.isInvalid()) 7368 return StmtError(); 7369 7370 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7371 if (Cond.isInvalid()) 7372 return StmtError(); 7373 if (Cond.get()) 7374 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7375 if (Cond.isInvalid()) 7376 return StmtError(); 7377 if (Cond.get()) 7378 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7379 7380 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7381 if (Inc.isInvalid()) 7382 return StmtError(); 7383 if (Inc.get()) 7384 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7385 7386 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7387 if (LoopVar.isInvalid()) 7388 return StmtError(); 7389 7390 StmtResult NewStmt = S; 7391 if (getDerived().AlwaysRebuild() || 7392 Range.get() != S->getRangeStmt() || 7393 Begin.get() != S->getBeginStmt() || 7394 End.get() != S->getEndStmt() || 7395 Cond.get() != S->getCond() || 7396 Inc.get() != S->getInc() || 7397 LoopVar.get() != S->getLoopVarStmt()) { 7398 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7399 S->getCoawaitLoc(), 7400 S->getColonLoc(), Range.get(), 7401 Begin.get(), End.get(), 7402 Cond.get(), 7403 Inc.get(), LoopVar.get(), 7404 S->getRParenLoc()); 7405 if (NewStmt.isInvalid()) 7406 return StmtError(); 7407 } 7408 7409 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7410 if (Body.isInvalid()) 7411 return StmtError(); 7412 7413 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7414 // it now so we have a new statement to attach the body to. 7415 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7416 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7417 S->getCoawaitLoc(), 7418 S->getColonLoc(), Range.get(), 7419 Begin.get(), End.get(), 7420 Cond.get(), 7421 Inc.get(), LoopVar.get(), 7422 S->getRParenLoc()); 7423 if (NewStmt.isInvalid()) 7424 return StmtError(); 7425 } 7426 7427 if (NewStmt.get() == S) 7428 return S; 7429 7430 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7431 } 7432 7433 template<typename Derived> 7434 StmtResult 7435 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7436 MSDependentExistsStmt *S) { 7437 // Transform the nested-name-specifier, if any. 7438 NestedNameSpecifierLoc QualifierLoc; 7439 if (S->getQualifierLoc()) { 7440 QualifierLoc 7441 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7442 if (!QualifierLoc) 7443 return StmtError(); 7444 } 7445 7446 // Transform the declaration name. 7447 DeclarationNameInfo NameInfo = S->getNameInfo(); 7448 if (NameInfo.getName()) { 7449 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7450 if (!NameInfo.getName()) 7451 return StmtError(); 7452 } 7453 7454 // Check whether anything changed. 7455 if (!getDerived().AlwaysRebuild() && 7456 QualifierLoc == S->getQualifierLoc() && 7457 NameInfo.getName() == S->getNameInfo().getName()) 7458 return S; 7459 7460 // Determine whether this name exists, if we can. 7461 CXXScopeSpec SS; 7462 SS.Adopt(QualifierLoc); 7463 bool Dependent = false; 7464 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7465 case Sema::IER_Exists: 7466 if (S->isIfExists()) 7467 break; 7468 7469 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7470 7471 case Sema::IER_DoesNotExist: 7472 if (S->isIfNotExists()) 7473 break; 7474 7475 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7476 7477 case Sema::IER_Dependent: 7478 Dependent = true; 7479 break; 7480 7481 case Sema::IER_Error: 7482 return StmtError(); 7483 } 7484 7485 // We need to continue with the instantiation, so do so now. 7486 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7487 if (SubStmt.isInvalid()) 7488 return StmtError(); 7489 7490 // If we have resolved the name, just transform to the substatement. 7491 if (!Dependent) 7492 return SubStmt; 7493 7494 // The name is still dependent, so build a dependent expression again. 7495 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7496 S->isIfExists(), 7497 QualifierLoc, 7498 NameInfo, 7499 SubStmt.get()); 7500 } 7501 7502 template<typename Derived> 7503 ExprResult 7504 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7505 NestedNameSpecifierLoc QualifierLoc; 7506 if (E->getQualifierLoc()) { 7507 QualifierLoc 7508 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7509 if (!QualifierLoc) 7510 return ExprError(); 7511 } 7512 7513 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7514 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7515 if (!PD) 7516 return ExprError(); 7517 7518 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7519 if (Base.isInvalid()) 7520 return ExprError(); 7521 7522 return new (SemaRef.getASTContext()) 7523 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7524 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7525 QualifierLoc, E->getMemberLoc()); 7526 } 7527 7528 template <typename Derived> 7529 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7530 MSPropertySubscriptExpr *E) { 7531 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7532 if (BaseRes.isInvalid()) 7533 return ExprError(); 7534 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7535 if (IdxRes.isInvalid()) 7536 return ExprError(); 7537 7538 if (!getDerived().AlwaysRebuild() && 7539 BaseRes.get() == E->getBase() && 7540 IdxRes.get() == E->getIdx()) 7541 return E; 7542 7543 return getDerived().RebuildArraySubscriptExpr( 7544 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7545 } 7546 7547 template <typename Derived> 7548 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7549 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7550 if (TryBlock.isInvalid()) 7551 return StmtError(); 7552 7553 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7554 if (Handler.isInvalid()) 7555 return StmtError(); 7556 7557 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7558 Handler.get() == S->getHandler()) 7559 return S; 7560 7561 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7562 TryBlock.get(), Handler.get()); 7563 } 7564 7565 template <typename Derived> 7566 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7567 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7568 if (Block.isInvalid()) 7569 return StmtError(); 7570 7571 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7572 } 7573 7574 template <typename Derived> 7575 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7576 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7577 if (FilterExpr.isInvalid()) 7578 return StmtError(); 7579 7580 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7581 if (Block.isInvalid()) 7582 return StmtError(); 7583 7584 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7585 Block.get()); 7586 } 7587 7588 template <typename Derived> 7589 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7590 if (isa<SEHFinallyStmt>(Handler)) 7591 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7592 else 7593 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7594 } 7595 7596 template<typename Derived> 7597 StmtResult 7598 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7599 return S; 7600 } 7601 7602 //===----------------------------------------------------------------------===// 7603 // OpenMP directive transformation 7604 //===----------------------------------------------------------------------===// 7605 template <typename Derived> 7606 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7607 OMPExecutableDirective *D) { 7608 7609 // Transform the clauses 7610 llvm::SmallVector<OMPClause *, 16> TClauses; 7611 ArrayRef<OMPClause *> Clauses = D->clauses(); 7612 TClauses.reserve(Clauses.size()); 7613 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7614 I != E; ++I) { 7615 if (*I) { 7616 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7617 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7618 getDerived().getSema().EndOpenMPClause(); 7619 if (Clause) 7620 TClauses.push_back(Clause); 7621 } else { 7622 TClauses.push_back(nullptr); 7623 } 7624 } 7625 StmtResult AssociatedStmt; 7626 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7627 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7628 /*CurScope=*/nullptr); 7629 StmtResult Body; 7630 { 7631 Sema::CompoundScopeRAII CompoundScope(getSema()); 7632 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 7633 Body = getDerived().TransformStmt(CS); 7634 } 7635 AssociatedStmt = 7636 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7637 if (AssociatedStmt.isInvalid()) { 7638 return StmtError(); 7639 } 7640 } 7641 if (TClauses.size() != Clauses.size()) { 7642 return StmtError(); 7643 } 7644 7645 // Transform directive name for 'omp critical' directive. 7646 DeclarationNameInfo DirName; 7647 if (D->getDirectiveKind() == OMPD_critical) { 7648 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7649 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7650 } 7651 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7652 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7653 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7654 } else if (D->getDirectiveKind() == OMPD_cancel) { 7655 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7656 } 7657 7658 return getDerived().RebuildOMPExecutableDirective( 7659 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7660 AssociatedStmt.get(), D->getLocStart(), D->getLocEnd()); 7661 } 7662 7663 template <typename Derived> 7664 StmtResult 7665 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7666 DeclarationNameInfo DirName; 7667 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7668 D->getLocStart()); 7669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7671 return Res; 7672 } 7673 7674 template <typename Derived> 7675 StmtResult 7676 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7677 DeclarationNameInfo DirName; 7678 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7679 D->getLocStart()); 7680 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7681 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7682 return Res; 7683 } 7684 7685 template <typename Derived> 7686 StmtResult 7687 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7688 DeclarationNameInfo DirName; 7689 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7690 D->getLocStart()); 7691 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7692 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7693 return Res; 7694 } 7695 7696 template <typename Derived> 7697 StmtResult 7698 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7699 DeclarationNameInfo DirName; 7700 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7701 D->getLocStart()); 7702 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7703 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7704 return Res; 7705 } 7706 7707 template <typename Derived> 7708 StmtResult 7709 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7710 DeclarationNameInfo DirName; 7711 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7712 D->getLocStart()); 7713 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7714 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7715 return Res; 7716 } 7717 7718 template <typename Derived> 7719 StmtResult 7720 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7721 DeclarationNameInfo DirName; 7722 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7723 D->getLocStart()); 7724 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7725 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7726 return Res; 7727 } 7728 7729 template <typename Derived> 7730 StmtResult 7731 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7732 DeclarationNameInfo DirName; 7733 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7734 D->getLocStart()); 7735 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7736 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7737 return Res; 7738 } 7739 7740 template <typename Derived> 7741 StmtResult 7742 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7743 DeclarationNameInfo DirName; 7744 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7745 D->getLocStart()); 7746 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7747 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7748 return Res; 7749 } 7750 7751 template <typename Derived> 7752 StmtResult 7753 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7754 getDerived().getSema().StartOpenMPDSABlock( 7755 OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart()); 7756 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7757 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7758 return Res; 7759 } 7760 7761 template <typename Derived> 7762 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7763 OMPParallelForDirective *D) { 7764 DeclarationNameInfo DirName; 7765 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7766 nullptr, D->getLocStart()); 7767 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7768 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7769 return Res; 7770 } 7771 7772 template <typename Derived> 7773 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7774 OMPParallelForSimdDirective *D) { 7775 DeclarationNameInfo DirName; 7776 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7777 nullptr, D->getLocStart()); 7778 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7779 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7780 return Res; 7781 } 7782 7783 template <typename Derived> 7784 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7785 OMPParallelSectionsDirective *D) { 7786 DeclarationNameInfo DirName; 7787 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7788 nullptr, D->getLocStart()); 7789 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7790 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7791 return Res; 7792 } 7793 7794 template <typename Derived> 7795 StmtResult 7796 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7797 DeclarationNameInfo DirName; 7798 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7799 D->getLocStart()); 7800 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7801 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7802 return Res; 7803 } 7804 7805 template <typename Derived> 7806 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7807 OMPTaskyieldDirective *D) { 7808 DeclarationNameInfo DirName; 7809 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7810 D->getLocStart()); 7811 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7812 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7813 return Res; 7814 } 7815 7816 template <typename Derived> 7817 StmtResult 7818 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7819 DeclarationNameInfo DirName; 7820 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7821 D->getLocStart()); 7822 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7823 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7824 return Res; 7825 } 7826 7827 template <typename Derived> 7828 StmtResult 7829 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7830 DeclarationNameInfo DirName; 7831 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7832 D->getLocStart()); 7833 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7834 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7835 return Res; 7836 } 7837 7838 template <typename Derived> 7839 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7840 OMPTaskgroupDirective *D) { 7841 DeclarationNameInfo DirName; 7842 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7843 D->getLocStart()); 7844 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7845 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7846 return Res; 7847 } 7848 7849 template <typename Derived> 7850 StmtResult 7851 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7852 DeclarationNameInfo DirName; 7853 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7854 D->getLocStart()); 7855 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7856 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7857 return Res; 7858 } 7859 7860 template <typename Derived> 7861 StmtResult 7862 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7863 DeclarationNameInfo DirName; 7864 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7865 D->getLocStart()); 7866 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7867 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7868 return Res; 7869 } 7870 7871 template <typename Derived> 7872 StmtResult 7873 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7874 DeclarationNameInfo DirName; 7875 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7876 D->getLocStart()); 7877 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7878 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7879 return Res; 7880 } 7881 7882 template <typename Derived> 7883 StmtResult 7884 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7885 DeclarationNameInfo DirName; 7886 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7887 D->getLocStart()); 7888 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7889 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7890 return Res; 7891 } 7892 7893 template <typename Derived> 7894 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7895 OMPTargetDataDirective *D) { 7896 DeclarationNameInfo DirName; 7897 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7898 D->getLocStart()); 7899 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7900 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7901 return Res; 7902 } 7903 7904 template <typename Derived> 7905 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7906 OMPTargetEnterDataDirective *D) { 7907 DeclarationNameInfo DirName; 7908 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7909 nullptr, D->getLocStart()); 7910 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7911 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7912 return Res; 7913 } 7914 7915 template <typename Derived> 7916 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7917 OMPTargetExitDataDirective *D) { 7918 DeclarationNameInfo DirName; 7919 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7920 nullptr, D->getLocStart()); 7921 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7922 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7923 return Res; 7924 } 7925 7926 template <typename Derived> 7927 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7928 OMPTargetParallelDirective *D) { 7929 DeclarationNameInfo DirName; 7930 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7931 nullptr, D->getLocStart()); 7932 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7933 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7934 return Res; 7935 } 7936 7937 template <typename Derived> 7938 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 7939 OMPTargetParallelForDirective *D) { 7940 DeclarationNameInfo DirName; 7941 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 7942 nullptr, D->getLocStart()); 7943 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7944 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7945 return Res; 7946 } 7947 7948 template <typename Derived> 7949 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 7950 OMPTargetUpdateDirective *D) { 7951 DeclarationNameInfo DirName; 7952 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 7953 nullptr, D->getLocStart()); 7954 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7955 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7956 return Res; 7957 } 7958 7959 template <typename Derived> 7960 StmtResult 7961 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 7962 DeclarationNameInfo DirName; 7963 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 7964 D->getLocStart()); 7965 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7966 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7967 return Res; 7968 } 7969 7970 template <typename Derived> 7971 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 7972 OMPCancellationPointDirective *D) { 7973 DeclarationNameInfo DirName; 7974 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 7975 nullptr, D->getLocStart()); 7976 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7977 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7978 return Res; 7979 } 7980 7981 template <typename Derived> 7982 StmtResult 7983 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 7984 DeclarationNameInfo DirName; 7985 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 7986 D->getLocStart()); 7987 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7988 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7989 return Res; 7990 } 7991 7992 template <typename Derived> 7993 StmtResult 7994 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 7995 DeclarationNameInfo DirName; 7996 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 7997 D->getLocStart()); 7998 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7999 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8000 return Res; 8001 } 8002 8003 template <typename Derived> 8004 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8005 OMPTaskLoopSimdDirective *D) { 8006 DeclarationNameInfo DirName; 8007 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8008 nullptr, D->getLocStart()); 8009 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8010 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8011 return Res; 8012 } 8013 8014 template <typename Derived> 8015 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8016 OMPDistributeDirective *D) { 8017 DeclarationNameInfo DirName; 8018 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8019 D->getLocStart()); 8020 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8021 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8022 return Res; 8023 } 8024 8025 template <typename Derived> 8026 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8027 OMPDistributeParallelForDirective *D) { 8028 DeclarationNameInfo DirName; 8029 getDerived().getSema().StartOpenMPDSABlock( 8030 OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart()); 8031 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8032 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8033 return Res; 8034 } 8035 8036 template <typename Derived> 8037 StmtResult 8038 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8039 OMPDistributeParallelForSimdDirective *D) { 8040 DeclarationNameInfo DirName; 8041 getDerived().getSema().StartOpenMPDSABlock( 8042 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 8043 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8045 return Res; 8046 } 8047 8048 template <typename Derived> 8049 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8050 OMPDistributeSimdDirective *D) { 8051 DeclarationNameInfo DirName; 8052 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8053 nullptr, D->getLocStart()); 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>::TransformOMPTargetParallelForSimdDirective( 8061 OMPTargetParallelForSimdDirective *D) { 8062 DeclarationNameInfo DirName; 8063 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd, 8064 DirName, nullptr, 8065 D->getLocStart()); 8066 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8068 return Res; 8069 } 8070 8071 template <typename Derived> 8072 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8073 OMPTargetSimdDirective *D) { 8074 DeclarationNameInfo DirName; 8075 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8076 D->getLocStart()); 8077 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8078 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8079 return Res; 8080 } 8081 8082 template <typename Derived> 8083 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8084 OMPTeamsDistributeDirective *D) { 8085 DeclarationNameInfo DirName; 8086 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8087 nullptr, D->getLocStart()); 8088 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8089 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8090 return Res; 8091 } 8092 8093 template <typename Derived> 8094 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8095 OMPTeamsDistributeSimdDirective *D) { 8096 DeclarationNameInfo DirName; 8097 getDerived().getSema().StartOpenMPDSABlock( 8098 OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8099 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8101 return Res; 8102 } 8103 8104 template <typename Derived> 8105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8106 OMPTeamsDistributeParallelForSimdDirective *D) { 8107 DeclarationNameInfo DirName; 8108 getDerived().getSema().StartOpenMPDSABlock( 8109 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 8110 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8111 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8112 return Res; 8113 } 8114 8115 template <typename Derived> 8116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8117 OMPTeamsDistributeParallelForDirective *D) { 8118 DeclarationNameInfo DirName; 8119 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for, 8120 DirName, nullptr, D->getLocStart()); 8121 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8122 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8123 return Res; 8124 } 8125 8126 template <typename Derived> 8127 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8128 OMPTargetTeamsDirective *D) { 8129 DeclarationNameInfo DirName; 8130 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8131 nullptr, D->getLocStart()); 8132 auto Res = getDerived().TransformOMPExecutableDirective(D); 8133 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8134 return Res; 8135 } 8136 8137 template <typename Derived> 8138 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8139 OMPTargetTeamsDistributeDirective *D) { 8140 DeclarationNameInfo DirName; 8141 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute, 8142 DirName, nullptr, D->getLocStart()); 8143 auto Res = getDerived().TransformOMPExecutableDirective(D); 8144 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8145 return Res; 8146 } 8147 8148 template <typename Derived> 8149 StmtResult 8150 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8151 OMPTargetTeamsDistributeParallelForDirective *D) { 8152 DeclarationNameInfo DirName; 8153 getDerived().getSema().StartOpenMPDSABlock( 8154 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8155 D->getLocStart()); 8156 auto Res = getDerived().TransformOMPExecutableDirective(D); 8157 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8158 return Res; 8159 } 8160 8161 template <typename Derived> 8162 StmtResult TreeTransform<Derived>:: 8163 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8164 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8165 DeclarationNameInfo DirName; 8166 getDerived().getSema().StartOpenMPDSABlock( 8167 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8168 D->getLocStart()); 8169 auto Res = getDerived().TransformOMPExecutableDirective(D); 8170 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8171 return Res; 8172 } 8173 8174 template <typename Derived> 8175 StmtResult 8176 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8177 OMPTargetTeamsDistributeSimdDirective *D) { 8178 DeclarationNameInfo DirName; 8179 getDerived().getSema().StartOpenMPDSABlock( 8180 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8181 auto Res = getDerived().TransformOMPExecutableDirective(D); 8182 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8183 return Res; 8184 } 8185 8186 8187 //===----------------------------------------------------------------------===// 8188 // OpenMP clause transformation 8189 //===----------------------------------------------------------------------===// 8190 template <typename Derived> 8191 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8192 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8193 if (Cond.isInvalid()) 8194 return nullptr; 8195 return getDerived().RebuildOMPIfClause( 8196 C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(), 8197 C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8198 } 8199 8200 template <typename Derived> 8201 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8202 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8203 if (Cond.isInvalid()) 8204 return nullptr; 8205 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(), 8206 C->getLParenLoc(), C->getLocEnd()); 8207 } 8208 8209 template <typename Derived> 8210 OMPClause * 8211 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8212 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8213 if (NumThreads.isInvalid()) 8214 return nullptr; 8215 return getDerived().RebuildOMPNumThreadsClause( 8216 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8217 } 8218 8219 template <typename Derived> 8220 OMPClause * 8221 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8222 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8223 if (E.isInvalid()) 8224 return nullptr; 8225 return getDerived().RebuildOMPSafelenClause( 8226 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8227 } 8228 8229 template <typename Derived> 8230 OMPClause * 8231 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8232 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8233 if (E.isInvalid()) 8234 return nullptr; 8235 return getDerived().RebuildOMPSimdlenClause( 8236 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8237 } 8238 8239 template <typename Derived> 8240 OMPClause * 8241 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8242 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8243 if (E.isInvalid()) 8244 return nullptr; 8245 return getDerived().RebuildOMPCollapseClause( 8246 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8247 } 8248 8249 template <typename Derived> 8250 OMPClause * 8251 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8252 return getDerived().RebuildOMPDefaultClause( 8253 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(), 8254 C->getLParenLoc(), C->getLocEnd()); 8255 } 8256 8257 template <typename Derived> 8258 OMPClause * 8259 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8260 return getDerived().RebuildOMPProcBindClause( 8261 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(), 8262 C->getLParenLoc(), C->getLocEnd()); 8263 } 8264 8265 template <typename Derived> 8266 OMPClause * 8267 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8268 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8269 if (E.isInvalid()) 8270 return nullptr; 8271 return getDerived().RebuildOMPScheduleClause( 8272 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8273 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8274 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8275 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8276 } 8277 8278 template <typename Derived> 8279 OMPClause * 8280 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8281 ExprResult E; 8282 if (auto *Num = C->getNumForLoops()) { 8283 E = getDerived().TransformExpr(Num); 8284 if (E.isInvalid()) 8285 return nullptr; 8286 } 8287 return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(), 8288 C->getLParenLoc(), E.get()); 8289 } 8290 8291 template <typename Derived> 8292 OMPClause * 8293 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8294 // No need to rebuild this clause, no template-dependent parameters. 8295 return C; 8296 } 8297 8298 template <typename Derived> 8299 OMPClause * 8300 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8301 // No need to rebuild this clause, no template-dependent parameters. 8302 return C; 8303 } 8304 8305 template <typename Derived> 8306 OMPClause * 8307 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8308 // No need to rebuild this clause, no template-dependent parameters. 8309 return C; 8310 } 8311 8312 template <typename Derived> 8313 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8314 // No need to rebuild this clause, no template-dependent parameters. 8315 return C; 8316 } 8317 8318 template <typename Derived> 8319 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8320 // No need to rebuild this clause, no template-dependent parameters. 8321 return C; 8322 } 8323 8324 template <typename Derived> 8325 OMPClause * 8326 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8327 // No need to rebuild this clause, no template-dependent parameters. 8328 return C; 8329 } 8330 8331 template <typename Derived> 8332 OMPClause * 8333 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8334 // No need to rebuild this clause, no template-dependent parameters. 8335 return C; 8336 } 8337 8338 template <typename Derived> 8339 OMPClause * 8340 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8341 // No need to rebuild this clause, no template-dependent parameters. 8342 return C; 8343 } 8344 8345 template <typename Derived> 8346 OMPClause * 8347 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8348 // No need to rebuild this clause, no template-dependent parameters. 8349 return C; 8350 } 8351 8352 template <typename Derived> 8353 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8354 // No need to rebuild this clause, no template-dependent parameters. 8355 return C; 8356 } 8357 8358 template <typename Derived> 8359 OMPClause * 8360 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8361 // No need to rebuild this clause, no template-dependent parameters. 8362 return C; 8363 } 8364 8365 template <typename Derived> 8366 OMPClause * 8367 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8368 llvm::SmallVector<Expr *, 16> Vars; 8369 Vars.reserve(C->varlist_size()); 8370 for (auto *VE : C->varlists()) { 8371 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8372 if (EVar.isInvalid()) 8373 return nullptr; 8374 Vars.push_back(EVar.get()); 8375 } 8376 return getDerived().RebuildOMPPrivateClause( 8377 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8378 } 8379 8380 template <typename Derived> 8381 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8382 OMPFirstprivateClause *C) { 8383 llvm::SmallVector<Expr *, 16> Vars; 8384 Vars.reserve(C->varlist_size()); 8385 for (auto *VE : C->varlists()) { 8386 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8387 if (EVar.isInvalid()) 8388 return nullptr; 8389 Vars.push_back(EVar.get()); 8390 } 8391 return getDerived().RebuildOMPFirstprivateClause( 8392 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8393 } 8394 8395 template <typename Derived> 8396 OMPClause * 8397 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8398 llvm::SmallVector<Expr *, 16> Vars; 8399 Vars.reserve(C->varlist_size()); 8400 for (auto *VE : C->varlists()) { 8401 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8402 if (EVar.isInvalid()) 8403 return nullptr; 8404 Vars.push_back(EVar.get()); 8405 } 8406 return getDerived().RebuildOMPLastprivateClause( 8407 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8408 } 8409 8410 template <typename Derived> 8411 OMPClause * 8412 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8413 llvm::SmallVector<Expr *, 16> Vars; 8414 Vars.reserve(C->varlist_size()); 8415 for (auto *VE : C->varlists()) { 8416 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8417 if (EVar.isInvalid()) 8418 return nullptr; 8419 Vars.push_back(EVar.get()); 8420 } 8421 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(), 8422 C->getLParenLoc(), C->getLocEnd()); 8423 } 8424 8425 template <typename Derived> 8426 OMPClause * 8427 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8428 llvm::SmallVector<Expr *, 16> Vars; 8429 Vars.reserve(C->varlist_size()); 8430 for (auto *VE : C->varlists()) { 8431 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8432 if (EVar.isInvalid()) 8433 return nullptr; 8434 Vars.push_back(EVar.get()); 8435 } 8436 CXXScopeSpec ReductionIdScopeSpec; 8437 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8438 8439 DeclarationNameInfo NameInfo = C->getNameInfo(); 8440 if (NameInfo.getName()) { 8441 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8442 if (!NameInfo.getName()) 8443 return nullptr; 8444 } 8445 // Build a list of all UDR decls with the same names ranged by the Scopes. 8446 // The Scope boundary is a duplication of the previous decl. 8447 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8448 for (auto *E : C->reduction_ops()) { 8449 // Transform all the decls. 8450 if (E) { 8451 auto *ULE = cast<UnresolvedLookupExpr>(E); 8452 UnresolvedSet<8> Decls; 8453 for (auto *D : ULE->decls()) { 8454 NamedDecl *InstD = 8455 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8456 Decls.addDecl(InstD, InstD->getAccess()); 8457 } 8458 UnresolvedReductions.push_back( 8459 UnresolvedLookupExpr::Create( 8460 SemaRef.Context, /*NamingClass=*/nullptr, 8461 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8462 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8463 Decls.begin(), Decls.end())); 8464 } else 8465 UnresolvedReductions.push_back(nullptr); 8466 } 8467 return getDerived().RebuildOMPReductionClause( 8468 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 8469 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8470 } 8471 8472 template <typename Derived> 8473 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8474 OMPTaskReductionClause *C) { 8475 llvm::SmallVector<Expr *, 16> Vars; 8476 Vars.reserve(C->varlist_size()); 8477 for (auto *VE : C->varlists()) { 8478 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8479 if (EVar.isInvalid()) 8480 return nullptr; 8481 Vars.push_back(EVar.get()); 8482 } 8483 CXXScopeSpec ReductionIdScopeSpec; 8484 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8485 8486 DeclarationNameInfo NameInfo = C->getNameInfo(); 8487 if (NameInfo.getName()) { 8488 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8489 if (!NameInfo.getName()) 8490 return nullptr; 8491 } 8492 // Build a list of all UDR decls with the same names ranged by the Scopes. 8493 // The Scope boundary is a duplication of the previous decl. 8494 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8495 for (auto *E : C->reduction_ops()) { 8496 // Transform all the decls. 8497 if (E) { 8498 auto *ULE = cast<UnresolvedLookupExpr>(E); 8499 UnresolvedSet<8> Decls; 8500 for (auto *D : ULE->decls()) { 8501 NamedDecl *InstD = 8502 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8503 Decls.addDecl(InstD, InstD->getAccess()); 8504 } 8505 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8506 SemaRef.Context, /*NamingClass=*/nullptr, 8507 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8508 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8509 } else 8510 UnresolvedReductions.push_back(nullptr); 8511 } 8512 return getDerived().RebuildOMPTaskReductionClause( 8513 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 8514 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8515 } 8516 8517 template <typename Derived> 8518 OMPClause * 8519 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 8520 llvm::SmallVector<Expr *, 16> Vars; 8521 Vars.reserve(C->varlist_size()); 8522 for (auto *VE : C->varlists()) { 8523 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8524 if (EVar.isInvalid()) 8525 return nullptr; 8526 Vars.push_back(EVar.get()); 8527 } 8528 CXXScopeSpec ReductionIdScopeSpec; 8529 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8530 8531 DeclarationNameInfo NameInfo = C->getNameInfo(); 8532 if (NameInfo.getName()) { 8533 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8534 if (!NameInfo.getName()) 8535 return nullptr; 8536 } 8537 // Build a list of all UDR decls with the same names ranged by the Scopes. 8538 // The Scope boundary is a duplication of the previous decl. 8539 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8540 for (auto *E : C->reduction_ops()) { 8541 // Transform all the decls. 8542 if (E) { 8543 auto *ULE = cast<UnresolvedLookupExpr>(E); 8544 UnresolvedSet<8> Decls; 8545 for (auto *D : ULE->decls()) { 8546 NamedDecl *InstD = 8547 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8548 Decls.addDecl(InstD, InstD->getAccess()); 8549 } 8550 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8551 SemaRef.Context, /*NamingClass=*/nullptr, 8552 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8553 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8554 } else 8555 UnresolvedReductions.push_back(nullptr); 8556 } 8557 return getDerived().RebuildOMPInReductionClause( 8558 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 8559 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8560 } 8561 8562 template <typename Derived> 8563 OMPClause * 8564 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8565 llvm::SmallVector<Expr *, 16> Vars; 8566 Vars.reserve(C->varlist_size()); 8567 for (auto *VE : C->varlists()) { 8568 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8569 if (EVar.isInvalid()) 8570 return nullptr; 8571 Vars.push_back(EVar.get()); 8572 } 8573 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8574 if (Step.isInvalid()) 8575 return nullptr; 8576 return getDerived().RebuildOMPLinearClause( 8577 Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(), 8578 C->getModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8579 } 8580 8581 template <typename Derived> 8582 OMPClause * 8583 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8584 llvm::SmallVector<Expr *, 16> Vars; 8585 Vars.reserve(C->varlist_size()); 8586 for (auto *VE : C->varlists()) { 8587 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8588 if (EVar.isInvalid()) 8589 return nullptr; 8590 Vars.push_back(EVar.get()); 8591 } 8592 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8593 if (Alignment.isInvalid()) 8594 return nullptr; 8595 return getDerived().RebuildOMPAlignedClause( 8596 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(), 8597 C->getColonLoc(), C->getLocEnd()); 8598 } 8599 8600 template <typename Derived> 8601 OMPClause * 8602 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8603 llvm::SmallVector<Expr *, 16> Vars; 8604 Vars.reserve(C->varlist_size()); 8605 for (auto *VE : C->varlists()) { 8606 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8607 if (EVar.isInvalid()) 8608 return nullptr; 8609 Vars.push_back(EVar.get()); 8610 } 8611 return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(), 8612 C->getLParenLoc(), C->getLocEnd()); 8613 } 8614 8615 template <typename Derived> 8616 OMPClause * 8617 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8618 llvm::SmallVector<Expr *, 16> Vars; 8619 Vars.reserve(C->varlist_size()); 8620 for (auto *VE : C->varlists()) { 8621 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8622 if (EVar.isInvalid()) 8623 return nullptr; 8624 Vars.push_back(EVar.get()); 8625 } 8626 return getDerived().RebuildOMPCopyprivateClause( 8627 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8628 } 8629 8630 template <typename Derived> 8631 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8632 llvm::SmallVector<Expr *, 16> Vars; 8633 Vars.reserve(C->varlist_size()); 8634 for (auto *VE : C->varlists()) { 8635 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8636 if (EVar.isInvalid()) 8637 return nullptr; 8638 Vars.push_back(EVar.get()); 8639 } 8640 return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(), 8641 C->getLParenLoc(), C->getLocEnd()); 8642 } 8643 8644 template <typename Derived> 8645 OMPClause * 8646 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8647 llvm::SmallVector<Expr *, 16> Vars; 8648 Vars.reserve(C->varlist_size()); 8649 for (auto *VE : C->varlists()) { 8650 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8651 if (EVar.isInvalid()) 8652 return nullptr; 8653 Vars.push_back(EVar.get()); 8654 } 8655 return getDerived().RebuildOMPDependClause( 8656 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8657 C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8658 } 8659 8660 template <typename Derived> 8661 OMPClause * 8662 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8663 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8664 if (E.isInvalid()) 8665 return nullptr; 8666 return getDerived().RebuildOMPDeviceClause( 8667 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8668 } 8669 8670 template <typename Derived> 8671 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8672 llvm::SmallVector<Expr *, 16> Vars; 8673 Vars.reserve(C->varlist_size()); 8674 for (auto *VE : C->varlists()) { 8675 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8676 if (EVar.isInvalid()) 8677 return nullptr; 8678 Vars.push_back(EVar.get()); 8679 } 8680 return getDerived().RebuildOMPMapClause( 8681 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8682 C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(), 8683 C->getLParenLoc(), C->getLocEnd()); 8684 } 8685 8686 template <typename Derived> 8687 OMPClause * 8688 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8689 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8690 if (E.isInvalid()) 8691 return nullptr; 8692 return getDerived().RebuildOMPNumTeamsClause( 8693 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8694 } 8695 8696 template <typename Derived> 8697 OMPClause * 8698 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8699 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8700 if (E.isInvalid()) 8701 return nullptr; 8702 return getDerived().RebuildOMPThreadLimitClause( 8703 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8704 } 8705 8706 template <typename Derived> 8707 OMPClause * 8708 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8709 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8710 if (E.isInvalid()) 8711 return nullptr; 8712 return getDerived().RebuildOMPPriorityClause( 8713 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8714 } 8715 8716 template <typename Derived> 8717 OMPClause * 8718 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8719 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8720 if (E.isInvalid()) 8721 return nullptr; 8722 return getDerived().RebuildOMPGrainsizeClause( 8723 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8724 } 8725 8726 template <typename Derived> 8727 OMPClause * 8728 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8729 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8730 if (E.isInvalid()) 8731 return nullptr; 8732 return getDerived().RebuildOMPNumTasksClause( 8733 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8734 } 8735 8736 template <typename Derived> 8737 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8738 ExprResult E = getDerived().TransformExpr(C->getHint()); 8739 if (E.isInvalid()) 8740 return nullptr; 8741 return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(), 8742 C->getLParenLoc(), C->getLocEnd()); 8743 } 8744 8745 template <typename Derived> 8746 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8747 OMPDistScheduleClause *C) { 8748 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8749 if (E.isInvalid()) 8750 return nullptr; 8751 return getDerived().RebuildOMPDistScheduleClause( 8752 C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8753 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8754 } 8755 8756 template <typename Derived> 8757 OMPClause * 8758 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8759 return C; 8760 } 8761 8762 template <typename Derived> 8763 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8764 llvm::SmallVector<Expr *, 16> Vars; 8765 Vars.reserve(C->varlist_size()); 8766 for (auto *VE : C->varlists()) { 8767 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8768 if (EVar.isInvalid()) 8769 return 0; 8770 Vars.push_back(EVar.get()); 8771 } 8772 return getDerived().RebuildOMPToClause(Vars, C->getLocStart(), 8773 C->getLParenLoc(), C->getLocEnd()); 8774 } 8775 8776 template <typename Derived> 8777 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8778 llvm::SmallVector<Expr *, 16> Vars; 8779 Vars.reserve(C->varlist_size()); 8780 for (auto *VE : C->varlists()) { 8781 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8782 if (EVar.isInvalid()) 8783 return 0; 8784 Vars.push_back(EVar.get()); 8785 } 8786 return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(), 8787 C->getLParenLoc(), C->getLocEnd()); 8788 } 8789 8790 template <typename Derived> 8791 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8792 OMPUseDevicePtrClause *C) { 8793 llvm::SmallVector<Expr *, 16> Vars; 8794 Vars.reserve(C->varlist_size()); 8795 for (auto *VE : C->varlists()) { 8796 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8797 if (EVar.isInvalid()) 8798 return nullptr; 8799 Vars.push_back(EVar.get()); 8800 } 8801 return getDerived().RebuildOMPUseDevicePtrClause( 8802 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8803 } 8804 8805 template <typename Derived> 8806 OMPClause * 8807 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8808 llvm::SmallVector<Expr *, 16> Vars; 8809 Vars.reserve(C->varlist_size()); 8810 for (auto *VE : C->varlists()) { 8811 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8812 if (EVar.isInvalid()) 8813 return nullptr; 8814 Vars.push_back(EVar.get()); 8815 } 8816 return getDerived().RebuildOMPIsDevicePtrClause( 8817 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8818 } 8819 8820 //===----------------------------------------------------------------------===// 8821 // Expression transformation 8822 //===----------------------------------------------------------------------===// 8823 template<typename Derived> 8824 ExprResult 8825 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8826 if (!E->isTypeDependent()) 8827 return E; 8828 8829 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8830 E->getIdentType()); 8831 } 8832 8833 template<typename Derived> 8834 ExprResult 8835 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8836 NestedNameSpecifierLoc QualifierLoc; 8837 if (E->getQualifierLoc()) { 8838 QualifierLoc 8839 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8840 if (!QualifierLoc) 8841 return ExprError(); 8842 } 8843 8844 ValueDecl *ND 8845 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8846 E->getDecl())); 8847 if (!ND) 8848 return ExprError(); 8849 8850 DeclarationNameInfo NameInfo = E->getNameInfo(); 8851 if (NameInfo.getName()) { 8852 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8853 if (!NameInfo.getName()) 8854 return ExprError(); 8855 } 8856 8857 if (!getDerived().AlwaysRebuild() && 8858 QualifierLoc == E->getQualifierLoc() && 8859 ND == E->getDecl() && 8860 NameInfo.getName() == E->getDecl()->getDeclName() && 8861 !E->hasExplicitTemplateArgs()) { 8862 8863 // Mark it referenced in the new context regardless. 8864 // FIXME: this is a bit instantiation-specific. 8865 SemaRef.MarkDeclRefReferenced(E); 8866 8867 return E; 8868 } 8869 8870 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8871 if (E->hasExplicitTemplateArgs()) { 8872 TemplateArgs = &TransArgs; 8873 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8874 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8875 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8876 E->getNumTemplateArgs(), 8877 TransArgs)) 8878 return ExprError(); 8879 } 8880 8881 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8882 TemplateArgs); 8883 } 8884 8885 template<typename Derived> 8886 ExprResult 8887 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8888 return E; 8889 } 8890 8891 template <typename Derived> 8892 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 8893 FixedPointLiteral *E) { 8894 return E; 8895 } 8896 8897 template<typename Derived> 8898 ExprResult 8899 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8900 return E; 8901 } 8902 8903 template<typename Derived> 8904 ExprResult 8905 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8906 return E; 8907 } 8908 8909 template<typename Derived> 8910 ExprResult 8911 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8912 return E; 8913 } 8914 8915 template<typename Derived> 8916 ExprResult 8917 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8918 return E; 8919 } 8920 8921 template<typename Derived> 8922 ExprResult 8923 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8924 if (FunctionDecl *FD = E->getDirectCallee()) 8925 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 8926 return SemaRef.MaybeBindToTemporary(E); 8927 } 8928 8929 template<typename Derived> 8930 ExprResult 8931 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8932 ExprResult ControllingExpr = 8933 getDerived().TransformExpr(E->getControllingExpr()); 8934 if (ControllingExpr.isInvalid()) 8935 return ExprError(); 8936 8937 SmallVector<Expr *, 4> AssocExprs; 8938 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8939 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8940 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8941 if (TS) { 8942 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8943 if (!AssocType) 8944 return ExprError(); 8945 AssocTypes.push_back(AssocType); 8946 } else { 8947 AssocTypes.push_back(nullptr); 8948 } 8949 8950 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8951 if (AssocExpr.isInvalid()) 8952 return ExprError(); 8953 AssocExprs.push_back(AssocExpr.get()); 8954 } 8955 8956 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 8957 E->getDefaultLoc(), 8958 E->getRParenLoc(), 8959 ControllingExpr.get(), 8960 AssocTypes, 8961 AssocExprs); 8962 } 8963 8964 template<typename Derived> 8965 ExprResult 8966 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 8967 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8968 if (SubExpr.isInvalid()) 8969 return ExprError(); 8970 8971 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8972 return E; 8973 8974 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 8975 E->getRParen()); 8976 } 8977 8978 /// The operand of a unary address-of operator has special rules: it's 8979 /// allowed to refer to a non-static member of a class even if there's no 'this' 8980 /// object available. 8981 template<typename Derived> 8982 ExprResult 8983 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 8984 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 8985 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 8986 else 8987 return getDerived().TransformExpr(E); 8988 } 8989 8990 template<typename Derived> 8991 ExprResult 8992 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 8993 ExprResult SubExpr; 8994 if (E->getOpcode() == UO_AddrOf) 8995 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 8996 else 8997 SubExpr = TransformExpr(E->getSubExpr()); 8998 if (SubExpr.isInvalid()) 8999 return ExprError(); 9000 9001 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9002 return E; 9003 9004 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9005 E->getOpcode(), 9006 SubExpr.get()); 9007 } 9008 9009 template<typename Derived> 9010 ExprResult 9011 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9012 // Transform the type. 9013 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9014 if (!Type) 9015 return ExprError(); 9016 9017 // Transform all of the components into components similar to what the 9018 // parser uses. 9019 // FIXME: It would be slightly more efficient in the non-dependent case to 9020 // just map FieldDecls, rather than requiring the rebuilder to look for 9021 // the fields again. However, __builtin_offsetof is rare enough in 9022 // template code that we don't care. 9023 bool ExprChanged = false; 9024 typedef Sema::OffsetOfComponent Component; 9025 SmallVector<Component, 4> Components; 9026 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9027 const OffsetOfNode &ON = E->getComponent(I); 9028 Component Comp; 9029 Comp.isBrackets = true; 9030 Comp.LocStart = ON.getSourceRange().getBegin(); 9031 Comp.LocEnd = ON.getSourceRange().getEnd(); 9032 switch (ON.getKind()) { 9033 case OffsetOfNode::Array: { 9034 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9035 ExprResult Index = getDerived().TransformExpr(FromIndex); 9036 if (Index.isInvalid()) 9037 return ExprError(); 9038 9039 ExprChanged = ExprChanged || Index.get() != FromIndex; 9040 Comp.isBrackets = true; 9041 Comp.U.E = Index.get(); 9042 break; 9043 } 9044 9045 case OffsetOfNode::Field: 9046 case OffsetOfNode::Identifier: 9047 Comp.isBrackets = false; 9048 Comp.U.IdentInfo = ON.getFieldName(); 9049 if (!Comp.U.IdentInfo) 9050 continue; 9051 9052 break; 9053 9054 case OffsetOfNode::Base: 9055 // Will be recomputed during the rebuild. 9056 continue; 9057 } 9058 9059 Components.push_back(Comp); 9060 } 9061 9062 // If nothing changed, retain the existing expression. 9063 if (!getDerived().AlwaysRebuild() && 9064 Type == E->getTypeSourceInfo() && 9065 !ExprChanged) 9066 return E; 9067 9068 // Build a new offsetof expression. 9069 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9070 Components, E->getRParenLoc()); 9071 } 9072 9073 template<typename Derived> 9074 ExprResult 9075 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9076 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9077 "opaque value expression requires transformation"); 9078 return E; 9079 } 9080 9081 template<typename Derived> 9082 ExprResult 9083 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9084 return E; 9085 } 9086 9087 template<typename Derived> 9088 ExprResult 9089 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9090 // Rebuild the syntactic form. The original syntactic form has 9091 // opaque-value expressions in it, so strip those away and rebuild 9092 // the result. This is a really awful way of doing this, but the 9093 // better solution (rebuilding the semantic expressions and 9094 // rebinding OVEs as necessary) doesn't work; we'd need 9095 // TreeTransform to not strip away implicit conversions. 9096 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9097 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9098 if (result.isInvalid()) return ExprError(); 9099 9100 // If that gives us a pseudo-object result back, the pseudo-object 9101 // expression must have been an lvalue-to-rvalue conversion which we 9102 // should reapply. 9103 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9104 result = SemaRef.checkPseudoObjectRValue(result.get()); 9105 9106 return result; 9107 } 9108 9109 template<typename Derived> 9110 ExprResult 9111 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9112 UnaryExprOrTypeTraitExpr *E) { 9113 if (E->isArgumentType()) { 9114 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9115 9116 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9117 if (!NewT) 9118 return ExprError(); 9119 9120 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9121 return E; 9122 9123 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9124 E->getKind(), 9125 E->getSourceRange()); 9126 } 9127 9128 // C++0x [expr.sizeof]p1: 9129 // The operand is either an expression, which is an unevaluated operand 9130 // [...] 9131 EnterExpressionEvaluationContext Unevaluated( 9132 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9133 Sema::ReuseLambdaContextDecl); 9134 9135 // Try to recover if we have something like sizeof(T::X) where X is a type. 9136 // Notably, there must be *exactly* one set of parens if X is a type. 9137 TypeSourceInfo *RecoveryTSI = nullptr; 9138 ExprResult SubExpr; 9139 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9140 if (auto *DRE = 9141 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9142 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9143 PE, DRE, false, &RecoveryTSI); 9144 else 9145 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9146 9147 if (RecoveryTSI) { 9148 return getDerived().RebuildUnaryExprOrTypeTrait( 9149 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9150 } else if (SubExpr.isInvalid()) 9151 return ExprError(); 9152 9153 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9154 return E; 9155 9156 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9157 E->getOperatorLoc(), 9158 E->getKind(), 9159 E->getSourceRange()); 9160 } 9161 9162 template<typename Derived> 9163 ExprResult 9164 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9165 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9166 if (LHS.isInvalid()) 9167 return ExprError(); 9168 9169 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9170 if (RHS.isInvalid()) 9171 return ExprError(); 9172 9173 9174 if (!getDerived().AlwaysRebuild() && 9175 LHS.get() == E->getLHS() && 9176 RHS.get() == E->getRHS()) 9177 return E; 9178 9179 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 9180 /*FIXME:*/E->getLHS()->getLocStart(), 9181 RHS.get(), 9182 E->getRBracketLoc()); 9183 } 9184 9185 template <typename Derived> 9186 ExprResult 9187 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9188 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9189 if (Base.isInvalid()) 9190 return ExprError(); 9191 9192 ExprResult LowerBound; 9193 if (E->getLowerBound()) { 9194 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9195 if (LowerBound.isInvalid()) 9196 return ExprError(); 9197 } 9198 9199 ExprResult Length; 9200 if (E->getLength()) { 9201 Length = getDerived().TransformExpr(E->getLength()); 9202 if (Length.isInvalid()) 9203 return ExprError(); 9204 } 9205 9206 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9207 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9208 return E; 9209 9210 return getDerived().RebuildOMPArraySectionExpr( 9211 Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(), 9212 Length.get(), E->getRBracketLoc()); 9213 } 9214 9215 template<typename Derived> 9216 ExprResult 9217 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9218 // Transform the callee. 9219 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9220 if (Callee.isInvalid()) 9221 return ExprError(); 9222 9223 // Transform arguments. 9224 bool ArgChanged = false; 9225 SmallVector<Expr*, 8> Args; 9226 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9227 &ArgChanged)) 9228 return ExprError(); 9229 9230 if (!getDerived().AlwaysRebuild() && 9231 Callee.get() == E->getCallee() && 9232 !ArgChanged) 9233 return SemaRef.MaybeBindToTemporary(E); 9234 9235 // FIXME: Wrong source location information for the '('. 9236 SourceLocation FakeLParenLoc 9237 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9238 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9239 Args, 9240 E->getRParenLoc()); 9241 } 9242 9243 template<typename Derived> 9244 ExprResult 9245 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9246 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9247 if (Base.isInvalid()) 9248 return ExprError(); 9249 9250 NestedNameSpecifierLoc QualifierLoc; 9251 if (E->hasQualifier()) { 9252 QualifierLoc 9253 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9254 9255 if (!QualifierLoc) 9256 return ExprError(); 9257 } 9258 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9259 9260 ValueDecl *Member 9261 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9262 E->getMemberDecl())); 9263 if (!Member) 9264 return ExprError(); 9265 9266 NamedDecl *FoundDecl = E->getFoundDecl(); 9267 if (FoundDecl == E->getMemberDecl()) { 9268 FoundDecl = Member; 9269 } else { 9270 FoundDecl = cast_or_null<NamedDecl>( 9271 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9272 if (!FoundDecl) 9273 return ExprError(); 9274 } 9275 9276 if (!getDerived().AlwaysRebuild() && 9277 Base.get() == E->getBase() && 9278 QualifierLoc == E->getQualifierLoc() && 9279 Member == E->getMemberDecl() && 9280 FoundDecl == E->getFoundDecl() && 9281 !E->hasExplicitTemplateArgs()) { 9282 9283 // Mark it referenced in the new context regardless. 9284 // FIXME: this is a bit instantiation-specific. 9285 SemaRef.MarkMemberReferenced(E); 9286 9287 return E; 9288 } 9289 9290 TemplateArgumentListInfo TransArgs; 9291 if (E->hasExplicitTemplateArgs()) { 9292 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9293 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9294 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9295 E->getNumTemplateArgs(), 9296 TransArgs)) 9297 return ExprError(); 9298 } 9299 9300 // FIXME: Bogus source location for the operator 9301 SourceLocation FakeOperatorLoc = 9302 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9303 9304 // FIXME: to do this check properly, we will need to preserve the 9305 // first-qualifier-in-scope here, just in case we had a dependent 9306 // base (and therefore couldn't do the check) and a 9307 // nested-name-qualifier (and therefore could do the lookup). 9308 NamedDecl *FirstQualifierInScope = nullptr; 9309 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9310 if (MemberNameInfo.getName()) { 9311 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9312 if (!MemberNameInfo.getName()) 9313 return ExprError(); 9314 } 9315 9316 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9317 E->isArrow(), 9318 QualifierLoc, 9319 TemplateKWLoc, 9320 MemberNameInfo, 9321 Member, 9322 FoundDecl, 9323 (E->hasExplicitTemplateArgs() 9324 ? &TransArgs : nullptr), 9325 FirstQualifierInScope); 9326 } 9327 9328 template<typename Derived> 9329 ExprResult 9330 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9331 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9332 if (LHS.isInvalid()) 9333 return ExprError(); 9334 9335 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9336 if (RHS.isInvalid()) 9337 return ExprError(); 9338 9339 if (!getDerived().AlwaysRebuild() && 9340 LHS.get() == E->getLHS() && 9341 RHS.get() == E->getRHS()) 9342 return E; 9343 9344 Sema::FPContractStateRAII FPContractState(getSema()); 9345 getSema().FPFeatures = E->getFPFeatures(); 9346 9347 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9348 LHS.get(), RHS.get()); 9349 } 9350 9351 template<typename Derived> 9352 ExprResult 9353 TreeTransform<Derived>::TransformCompoundAssignOperator( 9354 CompoundAssignOperator *E) { 9355 return getDerived().TransformBinaryOperator(E); 9356 } 9357 9358 template<typename Derived> 9359 ExprResult TreeTransform<Derived>:: 9360 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9361 // Just rebuild the common and RHS expressions and see whether we 9362 // get any changes. 9363 9364 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9365 if (commonExpr.isInvalid()) 9366 return ExprError(); 9367 9368 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9369 if (rhs.isInvalid()) 9370 return ExprError(); 9371 9372 if (!getDerived().AlwaysRebuild() && 9373 commonExpr.get() == e->getCommon() && 9374 rhs.get() == e->getFalseExpr()) 9375 return e; 9376 9377 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9378 e->getQuestionLoc(), 9379 nullptr, 9380 e->getColonLoc(), 9381 rhs.get()); 9382 } 9383 9384 template<typename Derived> 9385 ExprResult 9386 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9387 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9388 if (Cond.isInvalid()) 9389 return ExprError(); 9390 9391 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9392 if (LHS.isInvalid()) 9393 return ExprError(); 9394 9395 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9396 if (RHS.isInvalid()) 9397 return ExprError(); 9398 9399 if (!getDerived().AlwaysRebuild() && 9400 Cond.get() == E->getCond() && 9401 LHS.get() == E->getLHS() && 9402 RHS.get() == E->getRHS()) 9403 return E; 9404 9405 return getDerived().RebuildConditionalOperator(Cond.get(), 9406 E->getQuestionLoc(), 9407 LHS.get(), 9408 E->getColonLoc(), 9409 RHS.get()); 9410 } 9411 9412 template<typename Derived> 9413 ExprResult 9414 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9415 // Implicit casts are eliminated during transformation, since they 9416 // will be recomputed by semantic analysis after transformation. 9417 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9418 } 9419 9420 template<typename Derived> 9421 ExprResult 9422 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9423 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9424 if (!Type) 9425 return ExprError(); 9426 9427 ExprResult SubExpr 9428 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9429 if (SubExpr.isInvalid()) 9430 return ExprError(); 9431 9432 if (!getDerived().AlwaysRebuild() && 9433 Type == E->getTypeInfoAsWritten() && 9434 SubExpr.get() == E->getSubExpr()) 9435 return E; 9436 9437 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9438 Type, 9439 E->getRParenLoc(), 9440 SubExpr.get()); 9441 } 9442 9443 template<typename Derived> 9444 ExprResult 9445 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9446 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9447 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9448 if (!NewT) 9449 return ExprError(); 9450 9451 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9452 if (Init.isInvalid()) 9453 return ExprError(); 9454 9455 if (!getDerived().AlwaysRebuild() && 9456 OldT == NewT && 9457 Init.get() == E->getInitializer()) 9458 return SemaRef.MaybeBindToTemporary(E); 9459 9460 // Note: the expression type doesn't necessarily match the 9461 // type-as-written, but that's okay, because it should always be 9462 // derivable from the initializer. 9463 9464 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 9465 /*FIXME:*/E->getInitializer()->getLocEnd(), 9466 Init.get()); 9467 } 9468 9469 template<typename Derived> 9470 ExprResult 9471 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9472 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9473 if (Base.isInvalid()) 9474 return ExprError(); 9475 9476 if (!getDerived().AlwaysRebuild() && 9477 Base.get() == E->getBase()) 9478 return E; 9479 9480 // FIXME: Bad source location 9481 SourceLocation FakeOperatorLoc = 9482 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 9483 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9484 E->getAccessorLoc(), 9485 E->getAccessor()); 9486 } 9487 9488 template<typename Derived> 9489 ExprResult 9490 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9491 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9492 E = Syntactic; 9493 9494 bool InitChanged = false; 9495 9496 SmallVector<Expr*, 4> Inits; 9497 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9498 Inits, &InitChanged)) 9499 return ExprError(); 9500 9501 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9502 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9503 // in some cases. We can't reuse it in general, because the syntactic and 9504 // semantic forms are linked, and we can't know that semantic form will 9505 // match even if the syntactic form does. 9506 } 9507 9508 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9509 E->getRBraceLoc()); 9510 } 9511 9512 template<typename Derived> 9513 ExprResult 9514 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9515 Designation Desig; 9516 9517 // transform the initializer value 9518 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9519 if (Init.isInvalid()) 9520 return ExprError(); 9521 9522 // transform the designators. 9523 SmallVector<Expr*, 4> ArrayExprs; 9524 bool ExprChanged = false; 9525 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9526 if (D.isFieldDesignator()) { 9527 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9528 D.getDotLoc(), 9529 D.getFieldLoc())); 9530 if (D.getField()) { 9531 FieldDecl *Field = cast_or_null<FieldDecl>( 9532 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9533 if (Field != D.getField()) 9534 // Rebuild the expression when the transformed FieldDecl is 9535 // different to the already assigned FieldDecl. 9536 ExprChanged = true; 9537 } else { 9538 // Ensure that the designator expression is rebuilt when there isn't 9539 // a resolved FieldDecl in the designator as we don't want to assign 9540 // a FieldDecl to a pattern designator that will be instantiated again. 9541 ExprChanged = true; 9542 } 9543 continue; 9544 } 9545 9546 if (D.isArrayDesignator()) { 9547 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9548 if (Index.isInvalid()) 9549 return ExprError(); 9550 9551 Desig.AddDesignator( 9552 Designator::getArray(Index.get(), D.getLBracketLoc())); 9553 9554 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9555 ArrayExprs.push_back(Index.get()); 9556 continue; 9557 } 9558 9559 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9560 ExprResult Start 9561 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9562 if (Start.isInvalid()) 9563 return ExprError(); 9564 9565 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9566 if (End.isInvalid()) 9567 return ExprError(); 9568 9569 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9570 End.get(), 9571 D.getLBracketLoc(), 9572 D.getEllipsisLoc())); 9573 9574 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9575 End.get() != E->getArrayRangeEnd(D); 9576 9577 ArrayExprs.push_back(Start.get()); 9578 ArrayExprs.push_back(End.get()); 9579 } 9580 9581 if (!getDerived().AlwaysRebuild() && 9582 Init.get() == E->getInit() && 9583 !ExprChanged) 9584 return E; 9585 9586 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9587 E->getEqualOrColonLoc(), 9588 E->usesGNUSyntax(), Init.get()); 9589 } 9590 9591 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9592 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9593 template<typename Derived> 9594 ExprResult 9595 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9596 DesignatedInitUpdateExpr *E) { 9597 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9598 "initializer"); 9599 return ExprError(); 9600 } 9601 9602 template<typename Derived> 9603 ExprResult 9604 TreeTransform<Derived>::TransformNoInitExpr( 9605 NoInitExpr *E) { 9606 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9607 return ExprError(); 9608 } 9609 9610 template<typename Derived> 9611 ExprResult 9612 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9613 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9614 return ExprError(); 9615 } 9616 9617 template<typename Derived> 9618 ExprResult 9619 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9620 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9621 return ExprError(); 9622 } 9623 9624 template<typename Derived> 9625 ExprResult 9626 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9627 ImplicitValueInitExpr *E) { 9628 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 9629 9630 // FIXME: Will we ever have proper type location here? Will we actually 9631 // need to transform the type? 9632 QualType T = getDerived().TransformType(E->getType()); 9633 if (T.isNull()) 9634 return ExprError(); 9635 9636 if (!getDerived().AlwaysRebuild() && 9637 T == E->getType()) 9638 return E; 9639 9640 return getDerived().RebuildImplicitValueInitExpr(T); 9641 } 9642 9643 template<typename Derived> 9644 ExprResult 9645 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9646 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9647 if (!TInfo) 9648 return ExprError(); 9649 9650 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9651 if (SubExpr.isInvalid()) 9652 return ExprError(); 9653 9654 if (!getDerived().AlwaysRebuild() && 9655 TInfo == E->getWrittenTypeInfo() && 9656 SubExpr.get() == E->getSubExpr()) 9657 return E; 9658 9659 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9660 TInfo, E->getRParenLoc()); 9661 } 9662 9663 template<typename Derived> 9664 ExprResult 9665 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9666 bool ArgumentChanged = false; 9667 SmallVector<Expr*, 4> Inits; 9668 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9669 &ArgumentChanged)) 9670 return ExprError(); 9671 9672 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9673 Inits, 9674 E->getRParenLoc()); 9675 } 9676 9677 /// Transform an address-of-label expression. 9678 /// 9679 /// By default, the transformation of an address-of-label expression always 9680 /// rebuilds the expression, so that the label identifier can be resolved to 9681 /// the corresponding label statement by semantic analysis. 9682 template<typename Derived> 9683 ExprResult 9684 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9685 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9686 E->getLabel()); 9687 if (!LD) 9688 return ExprError(); 9689 9690 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9691 cast<LabelDecl>(LD)); 9692 } 9693 9694 template<typename Derived> 9695 ExprResult 9696 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9697 SemaRef.ActOnStartStmtExpr(); 9698 StmtResult SubStmt 9699 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9700 if (SubStmt.isInvalid()) { 9701 SemaRef.ActOnStmtExprError(); 9702 return ExprError(); 9703 } 9704 9705 if (!getDerived().AlwaysRebuild() && 9706 SubStmt.get() == E->getSubStmt()) { 9707 // Calling this an 'error' is unintuitive, but it does the right thing. 9708 SemaRef.ActOnStmtExprError(); 9709 return SemaRef.MaybeBindToTemporary(E); 9710 } 9711 9712 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9713 SubStmt.get(), 9714 E->getRParenLoc()); 9715 } 9716 9717 template<typename Derived> 9718 ExprResult 9719 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9720 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9721 if (Cond.isInvalid()) 9722 return ExprError(); 9723 9724 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9725 if (LHS.isInvalid()) 9726 return ExprError(); 9727 9728 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9729 if (RHS.isInvalid()) 9730 return ExprError(); 9731 9732 if (!getDerived().AlwaysRebuild() && 9733 Cond.get() == E->getCond() && 9734 LHS.get() == E->getLHS() && 9735 RHS.get() == E->getRHS()) 9736 return E; 9737 9738 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9739 Cond.get(), LHS.get(), RHS.get(), 9740 E->getRParenLoc()); 9741 } 9742 9743 template<typename Derived> 9744 ExprResult 9745 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9746 return E; 9747 } 9748 9749 template<typename Derived> 9750 ExprResult 9751 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9752 switch (E->getOperator()) { 9753 case OO_New: 9754 case OO_Delete: 9755 case OO_Array_New: 9756 case OO_Array_Delete: 9757 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9758 9759 case OO_Call: { 9760 // This is a call to an object's operator(). 9761 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9762 9763 // Transform the object itself. 9764 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9765 if (Object.isInvalid()) 9766 return ExprError(); 9767 9768 // FIXME: Poor location information 9769 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9770 static_cast<Expr *>(Object.get())->getLocEnd()); 9771 9772 // Transform the call arguments. 9773 SmallVector<Expr*, 8> Args; 9774 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9775 Args)) 9776 return ExprError(); 9777 9778 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 9779 Args, 9780 E->getLocEnd()); 9781 } 9782 9783 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9784 case OO_##Name: 9785 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9786 #include "clang/Basic/OperatorKinds.def" 9787 case OO_Subscript: 9788 // Handled below. 9789 break; 9790 9791 case OO_Conditional: 9792 llvm_unreachable("conditional operator is not actually overloadable"); 9793 9794 case OO_None: 9795 case NUM_OVERLOADED_OPERATORS: 9796 llvm_unreachable("not an overloaded operator?"); 9797 } 9798 9799 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9800 if (Callee.isInvalid()) 9801 return ExprError(); 9802 9803 ExprResult First; 9804 if (E->getOperator() == OO_Amp) 9805 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9806 else 9807 First = getDerived().TransformExpr(E->getArg(0)); 9808 if (First.isInvalid()) 9809 return ExprError(); 9810 9811 ExprResult Second; 9812 if (E->getNumArgs() == 2) { 9813 Second = getDerived().TransformExpr(E->getArg(1)); 9814 if (Second.isInvalid()) 9815 return ExprError(); 9816 } 9817 9818 if (!getDerived().AlwaysRebuild() && 9819 Callee.get() == E->getCallee() && 9820 First.get() == E->getArg(0) && 9821 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9822 return SemaRef.MaybeBindToTemporary(E); 9823 9824 Sema::FPContractStateRAII FPContractState(getSema()); 9825 getSema().FPFeatures = E->getFPFeatures(); 9826 9827 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9828 E->getOperatorLoc(), 9829 Callee.get(), 9830 First.get(), 9831 Second.get()); 9832 } 9833 9834 template<typename Derived> 9835 ExprResult 9836 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9837 return getDerived().TransformCallExpr(E); 9838 } 9839 9840 template<typename Derived> 9841 ExprResult 9842 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9843 // Transform the callee. 9844 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9845 if (Callee.isInvalid()) 9846 return ExprError(); 9847 9848 // Transform exec config. 9849 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9850 if (EC.isInvalid()) 9851 return ExprError(); 9852 9853 // Transform arguments. 9854 bool ArgChanged = false; 9855 SmallVector<Expr*, 8> Args; 9856 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9857 &ArgChanged)) 9858 return ExprError(); 9859 9860 if (!getDerived().AlwaysRebuild() && 9861 Callee.get() == E->getCallee() && 9862 !ArgChanged) 9863 return SemaRef.MaybeBindToTemporary(E); 9864 9865 // FIXME: Wrong source location information for the '('. 9866 SourceLocation FakeLParenLoc 9867 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9868 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9869 Args, 9870 E->getRParenLoc(), EC.get()); 9871 } 9872 9873 template<typename Derived> 9874 ExprResult 9875 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9876 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9877 if (!Type) 9878 return ExprError(); 9879 9880 ExprResult SubExpr 9881 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9882 if (SubExpr.isInvalid()) 9883 return ExprError(); 9884 9885 if (!getDerived().AlwaysRebuild() && 9886 Type == E->getTypeInfoAsWritten() && 9887 SubExpr.get() == E->getSubExpr()) 9888 return E; 9889 return getDerived().RebuildCXXNamedCastExpr( 9890 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9891 Type, E->getAngleBrackets().getEnd(), 9892 // FIXME. this should be '(' location 9893 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9894 } 9895 9896 template<typename Derived> 9897 ExprResult 9898 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9899 return getDerived().TransformCXXNamedCastExpr(E); 9900 } 9901 9902 template<typename Derived> 9903 ExprResult 9904 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9905 return getDerived().TransformCXXNamedCastExpr(E); 9906 } 9907 9908 template<typename Derived> 9909 ExprResult 9910 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9911 CXXReinterpretCastExpr *E) { 9912 return getDerived().TransformCXXNamedCastExpr(E); 9913 } 9914 9915 template<typename Derived> 9916 ExprResult 9917 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9918 return getDerived().TransformCXXNamedCastExpr(E); 9919 } 9920 9921 template<typename Derived> 9922 ExprResult 9923 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9924 CXXFunctionalCastExpr *E) { 9925 TypeSourceInfo *Type = 9926 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 9927 if (!Type) 9928 return ExprError(); 9929 9930 ExprResult SubExpr 9931 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9932 if (SubExpr.isInvalid()) 9933 return ExprError(); 9934 9935 if (!getDerived().AlwaysRebuild() && 9936 Type == E->getTypeInfoAsWritten() && 9937 SubExpr.get() == E->getSubExpr()) 9938 return E; 9939 9940 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9941 E->getLParenLoc(), 9942 SubExpr.get(), 9943 E->getRParenLoc(), 9944 E->isListInitialization()); 9945 } 9946 9947 template<typename Derived> 9948 ExprResult 9949 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9950 if (E->isTypeOperand()) { 9951 TypeSourceInfo *TInfo 9952 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9953 if (!TInfo) 9954 return ExprError(); 9955 9956 if (!getDerived().AlwaysRebuild() && 9957 TInfo == E->getTypeOperandSourceInfo()) 9958 return E; 9959 9960 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9961 E->getLocStart(), 9962 TInfo, 9963 E->getLocEnd()); 9964 } 9965 9966 // We don't know whether the subexpression is potentially evaluated until 9967 // after we perform semantic analysis. We speculatively assume it is 9968 // unevaluated; it will get fixed later if the subexpression is in fact 9969 // potentially evaluated. 9970 EnterExpressionEvaluationContext Unevaluated( 9971 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9972 Sema::ReuseLambdaContextDecl); 9973 9974 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9975 if (SubExpr.isInvalid()) 9976 return ExprError(); 9977 9978 if (!getDerived().AlwaysRebuild() && 9979 SubExpr.get() == E->getExprOperand()) 9980 return E; 9981 9982 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9983 E->getLocStart(), 9984 SubExpr.get(), 9985 E->getLocEnd()); 9986 } 9987 9988 template<typename Derived> 9989 ExprResult 9990 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 9991 if (E->isTypeOperand()) { 9992 TypeSourceInfo *TInfo 9993 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9994 if (!TInfo) 9995 return ExprError(); 9996 9997 if (!getDerived().AlwaysRebuild() && 9998 TInfo == E->getTypeOperandSourceInfo()) 9999 return E; 10000 10001 return getDerived().RebuildCXXUuidofExpr(E->getType(), 10002 E->getLocStart(), 10003 TInfo, 10004 E->getLocEnd()); 10005 } 10006 10007 EnterExpressionEvaluationContext Unevaluated( 10008 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10009 10010 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10011 if (SubExpr.isInvalid()) 10012 return ExprError(); 10013 10014 if (!getDerived().AlwaysRebuild() && 10015 SubExpr.get() == E->getExprOperand()) 10016 return E; 10017 10018 return getDerived().RebuildCXXUuidofExpr(E->getType(), 10019 E->getLocStart(), 10020 SubExpr.get(), 10021 E->getLocEnd()); 10022 } 10023 10024 template<typename Derived> 10025 ExprResult 10026 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10027 return E; 10028 } 10029 10030 template<typename Derived> 10031 ExprResult 10032 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10033 CXXNullPtrLiteralExpr *E) { 10034 return E; 10035 } 10036 10037 template<typename Derived> 10038 ExprResult 10039 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10040 QualType T = getSema().getCurrentThisType(); 10041 10042 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10043 // Make sure that we capture 'this'. 10044 getSema().CheckCXXThisCapture(E->getLocStart()); 10045 return E; 10046 } 10047 10048 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 10049 } 10050 10051 template<typename Derived> 10052 ExprResult 10053 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10054 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10055 if (SubExpr.isInvalid()) 10056 return ExprError(); 10057 10058 if (!getDerived().AlwaysRebuild() && 10059 SubExpr.get() == E->getSubExpr()) 10060 return E; 10061 10062 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10063 E->isThrownVariableInScope()); 10064 } 10065 10066 template<typename Derived> 10067 ExprResult 10068 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10069 ParmVarDecl *Param 10070 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 10071 E->getParam())); 10072 if (!Param) 10073 return ExprError(); 10074 10075 if (!getDerived().AlwaysRebuild() && 10076 Param == E->getParam()) 10077 return E; 10078 10079 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10080 } 10081 10082 template<typename Derived> 10083 ExprResult 10084 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10085 FieldDecl *Field 10086 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 10087 E->getField())); 10088 if (!Field) 10089 return ExprError(); 10090 10091 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10092 return E; 10093 10094 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10095 } 10096 10097 template<typename Derived> 10098 ExprResult 10099 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10100 CXXScalarValueInitExpr *E) { 10101 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10102 if (!T) 10103 return ExprError(); 10104 10105 if (!getDerived().AlwaysRebuild() && 10106 T == E->getTypeSourceInfo()) 10107 return E; 10108 10109 return getDerived().RebuildCXXScalarValueInitExpr(T, 10110 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10111 E->getRParenLoc()); 10112 } 10113 10114 template<typename Derived> 10115 ExprResult 10116 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10117 // Transform the type that we're allocating 10118 TypeSourceInfo *AllocTypeInfo = 10119 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10120 if (!AllocTypeInfo) 10121 return ExprError(); 10122 10123 // Transform the size of the array we're allocating (if any). 10124 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10125 if (ArraySize.isInvalid()) 10126 return ExprError(); 10127 10128 // Transform the placement arguments (if any). 10129 bool ArgumentChanged = false; 10130 SmallVector<Expr*, 8> PlacementArgs; 10131 if (getDerived().TransformExprs(E->getPlacementArgs(), 10132 E->getNumPlacementArgs(), true, 10133 PlacementArgs, &ArgumentChanged)) 10134 return ExprError(); 10135 10136 // Transform the initializer (if any). 10137 Expr *OldInit = E->getInitializer(); 10138 ExprResult NewInit; 10139 if (OldInit) 10140 NewInit = getDerived().TransformInitializer(OldInit, true); 10141 if (NewInit.isInvalid()) 10142 return ExprError(); 10143 10144 // Transform new operator and delete operator. 10145 FunctionDecl *OperatorNew = nullptr; 10146 if (E->getOperatorNew()) { 10147 OperatorNew = cast_or_null<FunctionDecl>( 10148 getDerived().TransformDecl(E->getLocStart(), 10149 E->getOperatorNew())); 10150 if (!OperatorNew) 10151 return ExprError(); 10152 } 10153 10154 FunctionDecl *OperatorDelete = nullptr; 10155 if (E->getOperatorDelete()) { 10156 OperatorDelete = cast_or_null<FunctionDecl>( 10157 getDerived().TransformDecl(E->getLocStart(), 10158 E->getOperatorDelete())); 10159 if (!OperatorDelete) 10160 return ExprError(); 10161 } 10162 10163 if (!getDerived().AlwaysRebuild() && 10164 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10165 ArraySize.get() == E->getArraySize() && 10166 NewInit.get() == OldInit && 10167 OperatorNew == E->getOperatorNew() && 10168 OperatorDelete == E->getOperatorDelete() && 10169 !ArgumentChanged) { 10170 // Mark any declarations we need as referenced. 10171 // FIXME: instantiation-specific. 10172 if (OperatorNew) 10173 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 10174 if (OperatorDelete) 10175 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10176 10177 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10178 QualType ElementType 10179 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10180 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10181 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10182 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10183 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 10184 } 10185 } 10186 } 10187 10188 return E; 10189 } 10190 10191 QualType AllocType = AllocTypeInfo->getType(); 10192 if (!ArraySize.get()) { 10193 // If no array size was specified, but the new expression was 10194 // instantiated with an array type (e.g., "new T" where T is 10195 // instantiated with "int[4]"), extract the outer bound from the 10196 // array type as our array size. We do this with constant and 10197 // dependently-sized array types. 10198 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10199 if (!ArrayT) { 10200 // Do nothing 10201 } else if (const ConstantArrayType *ConsArrayT 10202 = dyn_cast<ConstantArrayType>(ArrayT)) { 10203 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10204 SemaRef.Context.getSizeType(), 10205 /*FIXME:*/ E->getLocStart()); 10206 AllocType = ConsArrayT->getElementType(); 10207 } else if (const DependentSizedArrayType *DepArrayT 10208 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10209 if (DepArrayT->getSizeExpr()) { 10210 ArraySize = DepArrayT->getSizeExpr(); 10211 AllocType = DepArrayT->getElementType(); 10212 } 10213 } 10214 } 10215 10216 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 10217 E->isGlobalNew(), 10218 /*FIXME:*/E->getLocStart(), 10219 PlacementArgs, 10220 /*FIXME:*/E->getLocStart(), 10221 E->getTypeIdParens(), 10222 AllocType, 10223 AllocTypeInfo, 10224 ArraySize.get(), 10225 E->getDirectInitRange(), 10226 NewInit.get()); 10227 } 10228 10229 template<typename Derived> 10230 ExprResult 10231 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10232 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10233 if (Operand.isInvalid()) 10234 return ExprError(); 10235 10236 // Transform the delete operator, if known. 10237 FunctionDecl *OperatorDelete = nullptr; 10238 if (E->getOperatorDelete()) { 10239 OperatorDelete = cast_or_null<FunctionDecl>( 10240 getDerived().TransformDecl(E->getLocStart(), 10241 E->getOperatorDelete())); 10242 if (!OperatorDelete) 10243 return ExprError(); 10244 } 10245 10246 if (!getDerived().AlwaysRebuild() && 10247 Operand.get() == E->getArgument() && 10248 OperatorDelete == E->getOperatorDelete()) { 10249 // Mark any declarations we need as referenced. 10250 // FIXME: instantiation-specific. 10251 if (OperatorDelete) 10252 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10253 10254 if (!E->getArgument()->isTypeDependent()) { 10255 QualType Destroyed = SemaRef.Context.getBaseElementType( 10256 E->getDestroyedType()); 10257 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10258 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10259 SemaRef.MarkFunctionReferenced(E->getLocStart(), 10260 SemaRef.LookupDestructor(Record)); 10261 } 10262 } 10263 10264 return E; 10265 } 10266 10267 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 10268 E->isGlobalDelete(), 10269 E->isArrayForm(), 10270 Operand.get()); 10271 } 10272 10273 template<typename Derived> 10274 ExprResult 10275 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10276 CXXPseudoDestructorExpr *E) { 10277 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10278 if (Base.isInvalid()) 10279 return ExprError(); 10280 10281 ParsedType ObjectTypePtr; 10282 bool MayBePseudoDestructor = false; 10283 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10284 E->getOperatorLoc(), 10285 E->isArrow()? tok::arrow : tok::period, 10286 ObjectTypePtr, 10287 MayBePseudoDestructor); 10288 if (Base.isInvalid()) 10289 return ExprError(); 10290 10291 QualType ObjectType = ObjectTypePtr.get(); 10292 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10293 if (QualifierLoc) { 10294 QualifierLoc 10295 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10296 if (!QualifierLoc) 10297 return ExprError(); 10298 } 10299 CXXScopeSpec SS; 10300 SS.Adopt(QualifierLoc); 10301 10302 PseudoDestructorTypeStorage Destroyed; 10303 if (E->getDestroyedTypeInfo()) { 10304 TypeSourceInfo *DestroyedTypeInfo 10305 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10306 ObjectType, nullptr, SS); 10307 if (!DestroyedTypeInfo) 10308 return ExprError(); 10309 Destroyed = DestroyedTypeInfo; 10310 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10311 // We aren't likely to be able to resolve the identifier down to a type 10312 // now anyway, so just retain the identifier. 10313 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10314 E->getDestroyedTypeLoc()); 10315 } else { 10316 // Look for a destructor known with the given name. 10317 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10318 *E->getDestroyedTypeIdentifier(), 10319 E->getDestroyedTypeLoc(), 10320 /*Scope=*/nullptr, 10321 SS, ObjectTypePtr, 10322 false); 10323 if (!T) 10324 return ExprError(); 10325 10326 Destroyed 10327 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10328 E->getDestroyedTypeLoc()); 10329 } 10330 10331 TypeSourceInfo *ScopeTypeInfo = nullptr; 10332 if (E->getScopeTypeInfo()) { 10333 CXXScopeSpec EmptySS; 10334 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10335 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10336 if (!ScopeTypeInfo) 10337 return ExprError(); 10338 } 10339 10340 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10341 E->getOperatorLoc(), 10342 E->isArrow(), 10343 SS, 10344 ScopeTypeInfo, 10345 E->getColonColonLoc(), 10346 E->getTildeLoc(), 10347 Destroyed); 10348 } 10349 10350 template <typename Derived> 10351 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10352 bool RequiresADL, 10353 LookupResult &R) { 10354 // Transform all the decls. 10355 bool AllEmptyPacks = true; 10356 for (auto *OldD : Old->decls()) { 10357 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10358 if (!InstD) { 10359 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10360 // This can happen because of dependent hiding. 10361 if (isa<UsingShadowDecl>(OldD)) 10362 continue; 10363 else { 10364 R.clear(); 10365 return true; 10366 } 10367 } 10368 10369 // Expand using pack declarations. 10370 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10371 ArrayRef<NamedDecl*> Decls = SingleDecl; 10372 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10373 Decls = UPD->expansions(); 10374 10375 // Expand using declarations. 10376 for (auto *D : Decls) { 10377 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10378 for (auto *SD : UD->shadows()) 10379 R.addDecl(SD); 10380 } else { 10381 R.addDecl(D); 10382 } 10383 } 10384 10385 AllEmptyPacks &= Decls.empty(); 10386 }; 10387 10388 // C++ [temp.res]/8.4.2: 10389 // The program is ill-formed, no diagnostic required, if [...] lookup for 10390 // a name in the template definition found a using-declaration, but the 10391 // lookup in the corresponding scope in the instantiation odoes not find 10392 // any declarations because the using-declaration was a pack expansion and 10393 // the corresponding pack is empty 10394 if (AllEmptyPacks && !RequiresADL) { 10395 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10396 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10397 return true; 10398 } 10399 10400 // Resolve a kind, but don't do any further analysis. If it's 10401 // ambiguous, the callee needs to deal with it. 10402 R.resolveKind(); 10403 return false; 10404 } 10405 10406 template<typename Derived> 10407 ExprResult 10408 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10409 UnresolvedLookupExpr *Old) { 10410 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10411 Sema::LookupOrdinaryName); 10412 10413 // Transform the declaration set. 10414 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10415 return ExprError(); 10416 10417 // Rebuild the nested-name qualifier, if present. 10418 CXXScopeSpec SS; 10419 if (Old->getQualifierLoc()) { 10420 NestedNameSpecifierLoc QualifierLoc 10421 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10422 if (!QualifierLoc) 10423 return ExprError(); 10424 10425 SS.Adopt(QualifierLoc); 10426 } 10427 10428 if (Old->getNamingClass()) { 10429 CXXRecordDecl *NamingClass 10430 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10431 Old->getNameLoc(), 10432 Old->getNamingClass())); 10433 if (!NamingClass) { 10434 R.clear(); 10435 return ExprError(); 10436 } 10437 10438 R.setNamingClass(NamingClass); 10439 } 10440 10441 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10442 10443 // If we have neither explicit template arguments, nor the template keyword, 10444 // it's a normal declaration name or member reference. 10445 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10446 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10447 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10448 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10449 // give a good diagnostic. 10450 if (D && D->isCXXInstanceMember()) { 10451 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10452 /*TemplateArgs=*/nullptr, 10453 /*Scope=*/nullptr); 10454 } 10455 10456 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10457 } 10458 10459 // If we have template arguments, rebuild them, then rebuild the 10460 // templateid expression. 10461 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10462 if (Old->hasExplicitTemplateArgs() && 10463 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10464 Old->getNumTemplateArgs(), 10465 TransArgs)) { 10466 R.clear(); 10467 return ExprError(); 10468 } 10469 10470 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10471 Old->requiresADL(), &TransArgs); 10472 } 10473 10474 template<typename Derived> 10475 ExprResult 10476 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10477 bool ArgChanged = false; 10478 SmallVector<TypeSourceInfo *, 4> Args; 10479 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10480 TypeSourceInfo *From = E->getArg(I); 10481 TypeLoc FromTL = From->getTypeLoc(); 10482 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10483 TypeLocBuilder TLB; 10484 TLB.reserve(FromTL.getFullDataSize()); 10485 QualType To = getDerived().TransformType(TLB, FromTL); 10486 if (To.isNull()) 10487 return ExprError(); 10488 10489 if (To == From->getType()) 10490 Args.push_back(From); 10491 else { 10492 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10493 ArgChanged = true; 10494 } 10495 continue; 10496 } 10497 10498 ArgChanged = true; 10499 10500 // We have a pack expansion. Instantiate it. 10501 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10502 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10503 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10504 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10505 10506 // Determine whether the set of unexpanded parameter packs can and should 10507 // be expanded. 10508 bool Expand = true; 10509 bool RetainExpansion = false; 10510 Optional<unsigned> OrigNumExpansions = 10511 ExpansionTL.getTypePtr()->getNumExpansions(); 10512 Optional<unsigned> NumExpansions = OrigNumExpansions; 10513 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10514 PatternTL.getSourceRange(), 10515 Unexpanded, 10516 Expand, RetainExpansion, 10517 NumExpansions)) 10518 return ExprError(); 10519 10520 if (!Expand) { 10521 // The transform has determined that we should perform a simple 10522 // transformation on the pack expansion, producing another pack 10523 // expansion. 10524 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10525 10526 TypeLocBuilder TLB; 10527 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10528 10529 QualType To = getDerived().TransformType(TLB, PatternTL); 10530 if (To.isNull()) 10531 return ExprError(); 10532 10533 To = getDerived().RebuildPackExpansionType(To, 10534 PatternTL.getSourceRange(), 10535 ExpansionTL.getEllipsisLoc(), 10536 NumExpansions); 10537 if (To.isNull()) 10538 return ExprError(); 10539 10540 PackExpansionTypeLoc ToExpansionTL 10541 = TLB.push<PackExpansionTypeLoc>(To); 10542 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10543 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10544 continue; 10545 } 10546 10547 // Expand the pack expansion by substituting for each argument in the 10548 // pack(s). 10549 for (unsigned I = 0; I != *NumExpansions; ++I) { 10550 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10551 TypeLocBuilder TLB; 10552 TLB.reserve(PatternTL.getFullDataSize()); 10553 QualType To = getDerived().TransformType(TLB, PatternTL); 10554 if (To.isNull()) 10555 return ExprError(); 10556 10557 if (To->containsUnexpandedParameterPack()) { 10558 To = getDerived().RebuildPackExpansionType(To, 10559 PatternTL.getSourceRange(), 10560 ExpansionTL.getEllipsisLoc(), 10561 NumExpansions); 10562 if (To.isNull()) 10563 return ExprError(); 10564 10565 PackExpansionTypeLoc ToExpansionTL 10566 = TLB.push<PackExpansionTypeLoc>(To); 10567 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10568 } 10569 10570 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10571 } 10572 10573 if (!RetainExpansion) 10574 continue; 10575 10576 // If we're supposed to retain a pack expansion, do so by temporarily 10577 // forgetting the partially-substituted parameter pack. 10578 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10579 10580 TypeLocBuilder TLB; 10581 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10582 10583 QualType To = getDerived().TransformType(TLB, PatternTL); 10584 if (To.isNull()) 10585 return ExprError(); 10586 10587 To = getDerived().RebuildPackExpansionType(To, 10588 PatternTL.getSourceRange(), 10589 ExpansionTL.getEllipsisLoc(), 10590 NumExpansions); 10591 if (To.isNull()) 10592 return ExprError(); 10593 10594 PackExpansionTypeLoc ToExpansionTL 10595 = TLB.push<PackExpansionTypeLoc>(To); 10596 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10597 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10598 } 10599 10600 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10601 return E; 10602 10603 return getDerived().RebuildTypeTrait(E->getTrait(), 10604 E->getLocStart(), 10605 Args, 10606 E->getLocEnd()); 10607 } 10608 10609 template<typename Derived> 10610 ExprResult 10611 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10612 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10613 if (!T) 10614 return ExprError(); 10615 10616 if (!getDerived().AlwaysRebuild() && 10617 T == E->getQueriedTypeSourceInfo()) 10618 return E; 10619 10620 ExprResult SubExpr; 10621 { 10622 EnterExpressionEvaluationContext Unevaluated( 10623 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10624 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10625 if (SubExpr.isInvalid()) 10626 return ExprError(); 10627 10628 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10629 return E; 10630 } 10631 10632 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 10633 E->getLocStart(), 10634 T, 10635 SubExpr.get(), 10636 E->getLocEnd()); 10637 } 10638 10639 template<typename Derived> 10640 ExprResult 10641 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10642 ExprResult SubExpr; 10643 { 10644 EnterExpressionEvaluationContext Unevaluated( 10645 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10646 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10647 if (SubExpr.isInvalid()) 10648 return ExprError(); 10649 10650 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10651 return E; 10652 } 10653 10654 return getDerived().RebuildExpressionTrait( 10655 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 10656 } 10657 10658 template <typename Derived> 10659 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10660 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10661 TypeSourceInfo **RecoveryTSI) { 10662 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10663 DRE, AddrTaken, RecoveryTSI); 10664 10665 // Propagate both errors and recovered types, which return ExprEmpty. 10666 if (!NewDRE.isUsable()) 10667 return NewDRE; 10668 10669 // We got an expr, wrap it up in parens. 10670 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10671 return PE; 10672 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10673 PE->getRParen()); 10674 } 10675 10676 template <typename Derived> 10677 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10678 DependentScopeDeclRefExpr *E) { 10679 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10680 nullptr); 10681 } 10682 10683 template<typename Derived> 10684 ExprResult 10685 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10686 DependentScopeDeclRefExpr *E, 10687 bool IsAddressOfOperand, 10688 TypeSourceInfo **RecoveryTSI) { 10689 assert(E->getQualifierLoc()); 10690 NestedNameSpecifierLoc QualifierLoc 10691 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10692 if (!QualifierLoc) 10693 return ExprError(); 10694 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10695 10696 // TODO: If this is a conversion-function-id, verify that the 10697 // destination type name (if present) resolves the same way after 10698 // instantiation as it did in the local scope. 10699 10700 DeclarationNameInfo NameInfo 10701 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10702 if (!NameInfo.getName()) 10703 return ExprError(); 10704 10705 if (!E->hasExplicitTemplateArgs()) { 10706 if (!getDerived().AlwaysRebuild() && 10707 QualifierLoc == E->getQualifierLoc() && 10708 // Note: it is sufficient to compare the Name component of NameInfo: 10709 // if name has not changed, DNLoc has not changed either. 10710 NameInfo.getName() == E->getDeclName()) 10711 return E; 10712 10713 return getDerived().RebuildDependentScopeDeclRefExpr( 10714 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10715 IsAddressOfOperand, RecoveryTSI); 10716 } 10717 10718 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10719 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10720 E->getNumTemplateArgs(), 10721 TransArgs)) 10722 return ExprError(); 10723 10724 return getDerived().RebuildDependentScopeDeclRefExpr( 10725 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10726 RecoveryTSI); 10727 } 10728 10729 template<typename Derived> 10730 ExprResult 10731 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10732 // CXXConstructExprs other than for list-initialization and 10733 // CXXTemporaryObjectExpr are always implicit, so when we have 10734 // a 1-argument construction we just transform that argument. 10735 if ((E->getNumArgs() == 1 || 10736 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10737 (!getDerived().DropCallArgument(E->getArg(0))) && 10738 !E->isListInitialization()) 10739 return getDerived().TransformExpr(E->getArg(0)); 10740 10741 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 10742 10743 QualType T = getDerived().TransformType(E->getType()); 10744 if (T.isNull()) 10745 return ExprError(); 10746 10747 CXXConstructorDecl *Constructor 10748 = cast_or_null<CXXConstructorDecl>( 10749 getDerived().TransformDecl(E->getLocStart(), 10750 E->getConstructor())); 10751 if (!Constructor) 10752 return ExprError(); 10753 10754 bool ArgumentChanged = false; 10755 SmallVector<Expr*, 8> Args; 10756 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10757 &ArgumentChanged)) 10758 return ExprError(); 10759 10760 if (!getDerived().AlwaysRebuild() && 10761 T == E->getType() && 10762 Constructor == E->getConstructor() && 10763 !ArgumentChanged) { 10764 // Mark the constructor as referenced. 10765 // FIXME: Instantiation-specific 10766 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10767 return E; 10768 } 10769 10770 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 10771 Constructor, 10772 E->isElidable(), Args, 10773 E->hadMultipleCandidates(), 10774 E->isListInitialization(), 10775 E->isStdInitListInitialization(), 10776 E->requiresZeroInitialization(), 10777 E->getConstructionKind(), 10778 E->getParenOrBraceRange()); 10779 } 10780 10781 template<typename Derived> 10782 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10783 CXXInheritedCtorInitExpr *E) { 10784 QualType T = getDerived().TransformType(E->getType()); 10785 if (T.isNull()) 10786 return ExprError(); 10787 10788 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10789 getDerived().TransformDecl(E->getLocStart(), E->getConstructor())); 10790 if (!Constructor) 10791 return ExprError(); 10792 10793 if (!getDerived().AlwaysRebuild() && 10794 T == E->getType() && 10795 Constructor == E->getConstructor()) { 10796 // Mark the constructor as referenced. 10797 // FIXME: Instantiation-specific 10798 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10799 return E; 10800 } 10801 10802 return getDerived().RebuildCXXInheritedCtorInitExpr( 10803 T, E->getLocation(), Constructor, 10804 E->constructsVBase(), E->inheritedFromVBase()); 10805 } 10806 10807 /// Transform a C++ temporary-binding expression. 10808 /// 10809 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10810 /// transform the subexpression and return that. 10811 template<typename Derived> 10812 ExprResult 10813 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10814 return getDerived().TransformExpr(E->getSubExpr()); 10815 } 10816 10817 /// Transform a C++ expression that contains cleanups that should 10818 /// be run after the expression is evaluated. 10819 /// 10820 /// Since ExprWithCleanups nodes are implicitly generated, we 10821 /// just transform the subexpression and return that. 10822 template<typename Derived> 10823 ExprResult 10824 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10825 return getDerived().TransformExpr(E->getSubExpr()); 10826 } 10827 10828 template<typename Derived> 10829 ExprResult 10830 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10831 CXXTemporaryObjectExpr *E) { 10832 TypeSourceInfo *T = 10833 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10834 if (!T) 10835 return ExprError(); 10836 10837 CXXConstructorDecl *Constructor 10838 = cast_or_null<CXXConstructorDecl>( 10839 getDerived().TransformDecl(E->getLocStart(), 10840 E->getConstructor())); 10841 if (!Constructor) 10842 return ExprError(); 10843 10844 bool ArgumentChanged = false; 10845 SmallVector<Expr*, 8> Args; 10846 Args.reserve(E->getNumArgs()); 10847 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10848 &ArgumentChanged)) 10849 return ExprError(); 10850 10851 if (!getDerived().AlwaysRebuild() && 10852 T == E->getTypeSourceInfo() && 10853 Constructor == E->getConstructor() && 10854 !ArgumentChanged) { 10855 // FIXME: Instantiation-specific 10856 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10857 return SemaRef.MaybeBindToTemporary(E); 10858 } 10859 10860 // FIXME: We should just pass E->isListInitialization(), but we're not 10861 // prepared to handle list-initialization without a child InitListExpr. 10862 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 10863 return getDerived().RebuildCXXTemporaryObjectExpr( 10864 T, LParenLoc, Args, E->getLocEnd(), 10865 /*ListInitialization=*/LParenLoc.isInvalid()); 10866 } 10867 10868 template<typename Derived> 10869 ExprResult 10870 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10871 // Transform any init-capture expressions before entering the scope of the 10872 // lambda body, because they are not semantically within that scope. 10873 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10874 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10875 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10876 E->explicit_capture_begin()); 10877 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10878 CEnd = E->capture_end(); 10879 C != CEnd; ++C) { 10880 if (!E->isInitCapture(C)) 10881 continue; 10882 EnterExpressionEvaluationContext EEEC( 10883 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10884 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10885 C->getCapturedVar()->getInit(), 10886 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10887 10888 if (NewExprInitResult.isInvalid()) 10889 return ExprError(); 10890 Expr *NewExprInit = NewExprInitResult.get(); 10891 10892 VarDecl *OldVD = C->getCapturedVar(); 10893 QualType NewInitCaptureType = 10894 getSema().buildLambdaInitCaptureInitialization( 10895 C->getLocation(), OldVD->getType()->isReferenceType(), 10896 OldVD->getIdentifier(), 10897 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10898 NewExprInitResult = NewExprInit; 10899 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10900 std::make_pair(NewExprInitResult, NewInitCaptureType); 10901 } 10902 10903 // Transform the template parameters, and add them to the current 10904 // instantiation scope. The null case is handled correctly. 10905 auto TPL = getDerived().TransformTemplateParameterList( 10906 E->getTemplateParameterList()); 10907 10908 // Transform the type of the original lambda's call operator. 10909 // The transformation MUST be done in the CurrentInstantiationScope since 10910 // it introduces a mapping of the original to the newly created 10911 // transformed parameters. 10912 TypeSourceInfo *NewCallOpTSI = nullptr; 10913 { 10914 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10915 FunctionProtoTypeLoc OldCallOpFPTL = 10916 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10917 10918 TypeLocBuilder NewCallOpTLBuilder; 10919 SmallVector<QualType, 4> ExceptionStorage; 10920 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10921 QualType NewCallOpType = TransformFunctionProtoType( 10922 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10923 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10924 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10925 ExceptionStorage, Changed); 10926 }); 10927 if (NewCallOpType.isNull()) 10928 return ExprError(); 10929 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10930 NewCallOpType); 10931 } 10932 10933 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10934 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10935 LSI->GLTemplateParameterList = TPL; 10936 10937 // Create the local class that will describe the lambda. 10938 CXXRecordDecl *Class 10939 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10940 NewCallOpTSI, 10941 /*KnownDependent=*/false, 10942 E->getCaptureDefault()); 10943 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10944 10945 // Build the call operator. 10946 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10947 Class, E->getIntroducerRange(), NewCallOpTSI, 10948 E->getCallOperator()->getLocEnd(), 10949 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10950 E->getCallOperator()->isConstexpr()); 10951 10952 LSI->CallOperator = NewCallOperator; 10953 10954 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 10955 I != NumParams; ++I) { 10956 auto *P = NewCallOperator->getParamDecl(I); 10957 if (P->hasUninstantiatedDefaultArg()) { 10958 EnterExpressionEvaluationContext Eval( 10959 getSema(), 10960 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 10961 ExprResult R = getDerived().TransformExpr( 10962 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 10963 P->setDefaultArg(R.get()); 10964 } 10965 } 10966 10967 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10968 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10969 10970 // Introduce the context of the call operator. 10971 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10972 /*NewThisContext*/false); 10973 10974 // Enter the scope of the lambda. 10975 getSema().buildLambdaScope(LSI, NewCallOperator, 10976 E->getIntroducerRange(), 10977 E->getCaptureDefault(), 10978 E->getCaptureDefaultLoc(), 10979 E->hasExplicitParameters(), 10980 E->hasExplicitResultType(), 10981 E->isMutable()); 10982 10983 bool Invalid = false; 10984 10985 // Transform captures. 10986 bool FinishedExplicitCaptures = false; 10987 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10988 CEnd = E->capture_end(); 10989 C != CEnd; ++C) { 10990 // When we hit the first implicit capture, tell Sema that we've finished 10991 // the list of explicit captures. 10992 if (!FinishedExplicitCaptures && C->isImplicit()) { 10993 getSema().finishLambdaExplicitCaptures(LSI); 10994 FinishedExplicitCaptures = true; 10995 } 10996 10997 // Capturing 'this' is trivial. 10998 if (C->capturesThis()) { 10999 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11000 /*BuildAndDiagnose*/ true, nullptr, 11001 C->getCaptureKind() == LCK_StarThis); 11002 continue; 11003 } 11004 // Captured expression will be recaptured during captured variables 11005 // rebuilding. 11006 if (C->capturesVLAType()) 11007 continue; 11008 11009 // Rebuild init-captures, including the implied field declaration. 11010 if (E->isInitCapture(C)) { 11011 InitCaptureInfoTy InitExprTypePair = 11012 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11013 ExprResult Init = InitExprTypePair.first; 11014 QualType InitQualType = InitExprTypePair.second; 11015 if (Init.isInvalid() || InitQualType.isNull()) { 11016 Invalid = true; 11017 continue; 11018 } 11019 VarDecl *OldVD = C->getCapturedVar(); 11020 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11021 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11022 OldVD->getInitStyle(), Init.get()); 11023 if (!NewVD) 11024 Invalid = true; 11025 else { 11026 getDerived().transformedLocalDecl(OldVD, NewVD); 11027 } 11028 getSema().buildInitCaptureField(LSI, NewVD); 11029 continue; 11030 } 11031 11032 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11033 11034 // Determine the capture kind for Sema. 11035 Sema::TryCaptureKind Kind 11036 = C->isImplicit()? Sema::TryCapture_Implicit 11037 : C->getCaptureKind() == LCK_ByCopy 11038 ? Sema::TryCapture_ExplicitByVal 11039 : Sema::TryCapture_ExplicitByRef; 11040 SourceLocation EllipsisLoc; 11041 if (C->isPackExpansion()) { 11042 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11043 bool ShouldExpand = false; 11044 bool RetainExpansion = false; 11045 Optional<unsigned> NumExpansions; 11046 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11047 C->getLocation(), 11048 Unexpanded, 11049 ShouldExpand, RetainExpansion, 11050 NumExpansions)) { 11051 Invalid = true; 11052 continue; 11053 } 11054 11055 if (ShouldExpand) { 11056 // The transform has determined that we should perform an expansion; 11057 // transform and capture each of the arguments. 11058 // expansion of the pattern. Do so. 11059 VarDecl *Pack = C->getCapturedVar(); 11060 for (unsigned I = 0; I != *NumExpansions; ++I) { 11061 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11062 VarDecl *CapturedVar 11063 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11064 Pack)); 11065 if (!CapturedVar) { 11066 Invalid = true; 11067 continue; 11068 } 11069 11070 // Capture the transformed variable. 11071 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11072 } 11073 11074 // FIXME: Retain a pack expansion if RetainExpansion is true. 11075 11076 continue; 11077 } 11078 11079 EllipsisLoc = C->getEllipsisLoc(); 11080 } 11081 11082 // Transform the captured variable. 11083 VarDecl *CapturedVar 11084 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11085 C->getCapturedVar())); 11086 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11087 Invalid = true; 11088 continue; 11089 } 11090 11091 // Capture the transformed variable. 11092 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11093 EllipsisLoc); 11094 } 11095 if (!FinishedExplicitCaptures) 11096 getSema().finishLambdaExplicitCaptures(LSI); 11097 11098 // Enter a new evaluation context to insulate the lambda from any 11099 // cleanups from the enclosing full-expression. 11100 getSema().PushExpressionEvaluationContext( 11101 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11102 11103 // Instantiate the body of the lambda expression. 11104 StmtResult Body = 11105 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11106 11107 // ActOnLambda* will pop the function scope for us. 11108 FuncScopeCleanup.disable(); 11109 11110 if (Body.isInvalid()) { 11111 SavedContext.pop(); 11112 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 11113 /*IsInstantiation=*/true); 11114 return ExprError(); 11115 } 11116 11117 // Copy the LSI before ActOnFinishFunctionBody removes it. 11118 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11119 // the call operator. 11120 auto LSICopy = *LSI; 11121 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11122 /*IsInstantiation*/ true); 11123 SavedContext.pop(); 11124 11125 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 11126 &LSICopy); 11127 } 11128 11129 template<typename Derived> 11130 ExprResult 11131 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11132 CXXUnresolvedConstructExpr *E) { 11133 TypeSourceInfo *T = 11134 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11135 if (!T) 11136 return ExprError(); 11137 11138 bool ArgumentChanged = false; 11139 SmallVector<Expr*, 8> Args; 11140 Args.reserve(E->arg_size()); 11141 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11142 &ArgumentChanged)) 11143 return ExprError(); 11144 11145 if (!getDerived().AlwaysRebuild() && 11146 T == E->getTypeSourceInfo() && 11147 !ArgumentChanged) 11148 return E; 11149 11150 // FIXME: we're faking the locations of the commas 11151 return getDerived().RebuildCXXUnresolvedConstructExpr( 11152 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11153 } 11154 11155 template<typename Derived> 11156 ExprResult 11157 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11158 CXXDependentScopeMemberExpr *E) { 11159 // Transform the base of the expression. 11160 ExprResult Base((Expr*) nullptr); 11161 Expr *OldBase; 11162 QualType BaseType; 11163 QualType ObjectType; 11164 if (!E->isImplicitAccess()) { 11165 OldBase = E->getBase(); 11166 Base = getDerived().TransformExpr(OldBase); 11167 if (Base.isInvalid()) 11168 return ExprError(); 11169 11170 // Start the member reference and compute the object's type. 11171 ParsedType ObjectTy; 11172 bool MayBePseudoDestructor = false; 11173 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11174 E->getOperatorLoc(), 11175 E->isArrow()? tok::arrow : tok::period, 11176 ObjectTy, 11177 MayBePseudoDestructor); 11178 if (Base.isInvalid()) 11179 return ExprError(); 11180 11181 ObjectType = ObjectTy.get(); 11182 BaseType = ((Expr*) Base.get())->getType(); 11183 } else { 11184 OldBase = nullptr; 11185 BaseType = getDerived().TransformType(E->getBaseType()); 11186 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11187 } 11188 11189 // Transform the first part of the nested-name-specifier that qualifies 11190 // the member name. 11191 NamedDecl *FirstQualifierInScope 11192 = getDerived().TransformFirstQualifierInScope( 11193 E->getFirstQualifierFoundInScope(), 11194 E->getQualifierLoc().getBeginLoc()); 11195 11196 NestedNameSpecifierLoc QualifierLoc; 11197 if (E->getQualifier()) { 11198 QualifierLoc 11199 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11200 ObjectType, 11201 FirstQualifierInScope); 11202 if (!QualifierLoc) 11203 return ExprError(); 11204 } 11205 11206 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11207 11208 // TODO: If this is a conversion-function-id, verify that the 11209 // destination type name (if present) resolves the same way after 11210 // instantiation as it did in the local scope. 11211 11212 DeclarationNameInfo NameInfo 11213 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11214 if (!NameInfo.getName()) 11215 return ExprError(); 11216 11217 if (!E->hasExplicitTemplateArgs()) { 11218 // This is a reference to a member without an explicitly-specified 11219 // template argument list. Optimize for this common case. 11220 if (!getDerived().AlwaysRebuild() && 11221 Base.get() == OldBase && 11222 BaseType == E->getBaseType() && 11223 QualifierLoc == E->getQualifierLoc() && 11224 NameInfo.getName() == E->getMember() && 11225 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11226 return E; 11227 11228 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11229 BaseType, 11230 E->isArrow(), 11231 E->getOperatorLoc(), 11232 QualifierLoc, 11233 TemplateKWLoc, 11234 FirstQualifierInScope, 11235 NameInfo, 11236 /*TemplateArgs*/nullptr); 11237 } 11238 11239 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11240 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11241 E->getNumTemplateArgs(), 11242 TransArgs)) 11243 return ExprError(); 11244 11245 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11246 BaseType, 11247 E->isArrow(), 11248 E->getOperatorLoc(), 11249 QualifierLoc, 11250 TemplateKWLoc, 11251 FirstQualifierInScope, 11252 NameInfo, 11253 &TransArgs); 11254 } 11255 11256 template<typename Derived> 11257 ExprResult 11258 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11259 // Transform the base of the expression. 11260 ExprResult Base((Expr*) nullptr); 11261 QualType BaseType; 11262 if (!Old->isImplicitAccess()) { 11263 Base = getDerived().TransformExpr(Old->getBase()); 11264 if (Base.isInvalid()) 11265 return ExprError(); 11266 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11267 Old->isArrow()); 11268 if (Base.isInvalid()) 11269 return ExprError(); 11270 BaseType = Base.get()->getType(); 11271 } else { 11272 BaseType = getDerived().TransformType(Old->getBaseType()); 11273 } 11274 11275 NestedNameSpecifierLoc QualifierLoc; 11276 if (Old->getQualifierLoc()) { 11277 QualifierLoc 11278 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11279 if (!QualifierLoc) 11280 return ExprError(); 11281 } 11282 11283 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11284 11285 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11286 Sema::LookupOrdinaryName); 11287 11288 // Transform the declaration set. 11289 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11290 return ExprError(); 11291 11292 // Determine the naming class. 11293 if (Old->getNamingClass()) { 11294 CXXRecordDecl *NamingClass 11295 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11296 Old->getMemberLoc(), 11297 Old->getNamingClass())); 11298 if (!NamingClass) 11299 return ExprError(); 11300 11301 R.setNamingClass(NamingClass); 11302 } 11303 11304 TemplateArgumentListInfo TransArgs; 11305 if (Old->hasExplicitTemplateArgs()) { 11306 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11307 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11308 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11309 Old->getNumTemplateArgs(), 11310 TransArgs)) 11311 return ExprError(); 11312 } 11313 11314 // FIXME: to do this check properly, we will need to preserve the 11315 // first-qualifier-in-scope here, just in case we had a dependent 11316 // base (and therefore couldn't do the check) and a 11317 // nested-name-qualifier (and therefore could do the lookup). 11318 NamedDecl *FirstQualifierInScope = nullptr; 11319 11320 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11321 BaseType, 11322 Old->getOperatorLoc(), 11323 Old->isArrow(), 11324 QualifierLoc, 11325 TemplateKWLoc, 11326 FirstQualifierInScope, 11327 R, 11328 (Old->hasExplicitTemplateArgs() 11329 ? &TransArgs : nullptr)); 11330 } 11331 11332 template<typename Derived> 11333 ExprResult 11334 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11335 EnterExpressionEvaluationContext Unevaluated( 11336 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11337 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11338 if (SubExpr.isInvalid()) 11339 return ExprError(); 11340 11341 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11342 return E; 11343 11344 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11345 } 11346 11347 template<typename Derived> 11348 ExprResult 11349 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11350 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11351 if (Pattern.isInvalid()) 11352 return ExprError(); 11353 11354 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11355 return E; 11356 11357 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11358 E->getNumExpansions()); 11359 } 11360 11361 template<typename Derived> 11362 ExprResult 11363 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11364 // If E is not value-dependent, then nothing will change when we transform it. 11365 // Note: This is an instantiation-centric view. 11366 if (!E->isValueDependent()) 11367 return E; 11368 11369 EnterExpressionEvaluationContext Unevaluated( 11370 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11371 11372 ArrayRef<TemplateArgument> PackArgs; 11373 TemplateArgument ArgStorage; 11374 11375 // Find the argument list to transform. 11376 if (E->isPartiallySubstituted()) { 11377 PackArgs = E->getPartialArguments(); 11378 } else if (E->isValueDependent()) { 11379 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11380 bool ShouldExpand = false; 11381 bool RetainExpansion = false; 11382 Optional<unsigned> NumExpansions; 11383 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11384 Unexpanded, 11385 ShouldExpand, RetainExpansion, 11386 NumExpansions)) 11387 return ExprError(); 11388 11389 // If we need to expand the pack, build a template argument from it and 11390 // expand that. 11391 if (ShouldExpand) { 11392 auto *Pack = E->getPack(); 11393 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11394 ArgStorage = getSema().Context.getPackExpansionType( 11395 getSema().Context.getTypeDeclType(TTPD), None); 11396 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11397 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11398 } else { 11399 auto *VD = cast<ValueDecl>(Pack); 11400 ExprResult DRE = getSema().BuildDeclRefExpr( 11401 VD, VD->getType().getNonLValueExprType(getSema().Context), 11402 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11403 E->getPackLoc()); 11404 if (DRE.isInvalid()) 11405 return ExprError(); 11406 ArgStorage = new (getSema().Context) PackExpansionExpr( 11407 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11408 } 11409 PackArgs = ArgStorage; 11410 } 11411 } 11412 11413 // If we're not expanding the pack, just transform the decl. 11414 if (!PackArgs.size()) { 11415 auto *Pack = cast_or_null<NamedDecl>( 11416 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11417 if (!Pack) 11418 return ExprError(); 11419 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11420 E->getPackLoc(), 11421 E->getRParenLoc(), None, None); 11422 } 11423 11424 // Try to compute the result without performing a partial substitution. 11425 Optional<unsigned> Result = 0; 11426 for (const TemplateArgument &Arg : PackArgs) { 11427 if (!Arg.isPackExpansion()) { 11428 Result = *Result + 1; 11429 continue; 11430 } 11431 11432 TemplateArgumentLoc ArgLoc; 11433 InventTemplateArgumentLoc(Arg, ArgLoc); 11434 11435 // Find the pattern of the pack expansion. 11436 SourceLocation Ellipsis; 11437 Optional<unsigned> OrigNumExpansions; 11438 TemplateArgumentLoc Pattern = 11439 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11440 OrigNumExpansions); 11441 11442 // Substitute under the pack expansion. Do not expand the pack (yet). 11443 TemplateArgumentLoc OutPattern; 11444 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11445 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11446 /*Uneval*/ true)) 11447 return true; 11448 11449 // See if we can determine the number of arguments from the result. 11450 Optional<unsigned> NumExpansions = 11451 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11452 if (!NumExpansions) { 11453 // No: we must be in an alias template expansion, and we're going to need 11454 // to actually expand the packs. 11455 Result = None; 11456 break; 11457 } 11458 11459 Result = *Result + *NumExpansions; 11460 } 11461 11462 // Common case: we could determine the number of expansions without 11463 // substituting. 11464 if (Result) 11465 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11466 E->getPackLoc(), 11467 E->getRParenLoc(), *Result, None); 11468 11469 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11470 E->getPackLoc()); 11471 { 11472 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11473 typedef TemplateArgumentLocInventIterator< 11474 Derived, const TemplateArgument*> PackLocIterator; 11475 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11476 PackLocIterator(*this, PackArgs.end()), 11477 TransformedPackArgs, /*Uneval*/true)) 11478 return ExprError(); 11479 } 11480 11481 // Check whether we managed to fully-expand the pack. 11482 // FIXME: Is it possible for us to do so and not hit the early exit path? 11483 SmallVector<TemplateArgument, 8> Args; 11484 bool PartialSubstitution = false; 11485 for (auto &Loc : TransformedPackArgs.arguments()) { 11486 Args.push_back(Loc.getArgument()); 11487 if (Loc.getArgument().isPackExpansion()) 11488 PartialSubstitution = true; 11489 } 11490 11491 if (PartialSubstitution) 11492 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11493 E->getPackLoc(), 11494 E->getRParenLoc(), None, Args); 11495 11496 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11497 E->getPackLoc(), E->getRParenLoc(), 11498 Args.size(), None); 11499 } 11500 11501 template<typename Derived> 11502 ExprResult 11503 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11504 SubstNonTypeTemplateParmPackExpr *E) { 11505 // Default behavior is to do nothing with this transformation. 11506 return E; 11507 } 11508 11509 template<typename Derived> 11510 ExprResult 11511 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11512 SubstNonTypeTemplateParmExpr *E) { 11513 // Default behavior is to do nothing with this transformation. 11514 return E; 11515 } 11516 11517 template<typename Derived> 11518 ExprResult 11519 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11520 // Default behavior is to do nothing with this transformation. 11521 return E; 11522 } 11523 11524 template<typename Derived> 11525 ExprResult 11526 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11527 MaterializeTemporaryExpr *E) { 11528 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11529 } 11530 11531 template<typename Derived> 11532 ExprResult 11533 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11534 Expr *Pattern = E->getPattern(); 11535 11536 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11537 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11538 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11539 11540 // Determine whether the set of unexpanded parameter packs can and should 11541 // be expanded. 11542 bool Expand = true; 11543 bool RetainExpansion = false; 11544 Optional<unsigned> NumExpansions; 11545 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11546 Pattern->getSourceRange(), 11547 Unexpanded, 11548 Expand, RetainExpansion, 11549 NumExpansions)) 11550 return true; 11551 11552 if (!Expand) { 11553 // Do not expand any packs here, just transform and rebuild a fold 11554 // expression. 11555 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11556 11557 ExprResult LHS = 11558 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11559 if (LHS.isInvalid()) 11560 return true; 11561 11562 ExprResult RHS = 11563 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11564 if (RHS.isInvalid()) 11565 return true; 11566 11567 if (!getDerived().AlwaysRebuild() && 11568 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11569 return E; 11570 11571 return getDerived().RebuildCXXFoldExpr( 11572 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11573 RHS.get(), E->getLocEnd()); 11574 } 11575 11576 // The transform has determined that we should perform an elementwise 11577 // expansion of the pattern. Do so. 11578 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11579 if (Result.isInvalid()) 11580 return true; 11581 bool LeftFold = E->isLeftFold(); 11582 11583 // If we're retaining an expansion for a right fold, it is the innermost 11584 // component and takes the init (if any). 11585 if (!LeftFold && RetainExpansion) { 11586 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11587 11588 ExprResult Out = getDerived().TransformExpr(Pattern); 11589 if (Out.isInvalid()) 11590 return true; 11591 11592 Result = getDerived().RebuildCXXFoldExpr( 11593 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11594 Result.get(), E->getLocEnd()); 11595 if (Result.isInvalid()) 11596 return true; 11597 } 11598 11599 for (unsigned I = 0; I != *NumExpansions; ++I) { 11600 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11601 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11602 ExprResult Out = getDerived().TransformExpr(Pattern); 11603 if (Out.isInvalid()) 11604 return true; 11605 11606 if (Out.get()->containsUnexpandedParameterPack()) { 11607 // We still have a pack; retain a pack expansion for this slice. 11608 Result = getDerived().RebuildCXXFoldExpr( 11609 E->getLocStart(), 11610 LeftFold ? Result.get() : Out.get(), 11611 E->getOperator(), E->getEllipsisLoc(), 11612 LeftFold ? Out.get() : Result.get(), 11613 E->getLocEnd()); 11614 } else if (Result.isUsable()) { 11615 // We've got down to a single element; build a binary operator. 11616 Result = getDerived().RebuildBinaryOperator( 11617 E->getEllipsisLoc(), E->getOperator(), 11618 LeftFold ? Result.get() : Out.get(), 11619 LeftFold ? Out.get() : Result.get()); 11620 } else 11621 Result = Out; 11622 11623 if (Result.isInvalid()) 11624 return true; 11625 } 11626 11627 // If we're retaining an expansion for a left fold, it is the outermost 11628 // component and takes the complete expansion so far as its init (if any). 11629 if (LeftFold && RetainExpansion) { 11630 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11631 11632 ExprResult Out = getDerived().TransformExpr(Pattern); 11633 if (Out.isInvalid()) 11634 return true; 11635 11636 Result = getDerived().RebuildCXXFoldExpr( 11637 E->getLocStart(), Result.get(), 11638 E->getOperator(), E->getEllipsisLoc(), 11639 Out.get(), E->getLocEnd()); 11640 if (Result.isInvalid()) 11641 return true; 11642 } 11643 11644 // If we had no init and an empty pack, and we're not retaining an expansion, 11645 // then produce a fallback value or error. 11646 if (Result.isUnset()) 11647 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11648 E->getOperator()); 11649 11650 return Result; 11651 } 11652 11653 template<typename Derived> 11654 ExprResult 11655 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11656 CXXStdInitializerListExpr *E) { 11657 return getDerived().TransformExpr(E->getSubExpr()); 11658 } 11659 11660 template<typename Derived> 11661 ExprResult 11662 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11663 return SemaRef.MaybeBindToTemporary(E); 11664 } 11665 11666 template<typename Derived> 11667 ExprResult 11668 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11669 return E; 11670 } 11671 11672 template<typename Derived> 11673 ExprResult 11674 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11675 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11676 if (SubExpr.isInvalid()) 11677 return ExprError(); 11678 11679 if (!getDerived().AlwaysRebuild() && 11680 SubExpr.get() == E->getSubExpr()) 11681 return E; 11682 11683 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11684 } 11685 11686 template<typename Derived> 11687 ExprResult 11688 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11689 // Transform each of the elements. 11690 SmallVector<Expr *, 8> Elements; 11691 bool ArgChanged = false; 11692 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11693 /*IsCall=*/false, Elements, &ArgChanged)) 11694 return ExprError(); 11695 11696 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11697 return SemaRef.MaybeBindToTemporary(E); 11698 11699 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11700 Elements.data(), 11701 Elements.size()); 11702 } 11703 11704 template<typename Derived> 11705 ExprResult 11706 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11707 ObjCDictionaryLiteral *E) { 11708 // Transform each of the elements. 11709 SmallVector<ObjCDictionaryElement, 8> Elements; 11710 bool ArgChanged = false; 11711 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11712 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11713 11714 if (OrigElement.isPackExpansion()) { 11715 // This key/value element is a pack expansion. 11716 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11717 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11718 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11719 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11720 11721 // Determine whether the set of unexpanded parameter packs can 11722 // and should be expanded. 11723 bool Expand = true; 11724 bool RetainExpansion = false; 11725 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11726 Optional<unsigned> NumExpansions = OrigNumExpansions; 11727 SourceRange PatternRange(OrigElement.Key->getLocStart(), 11728 OrigElement.Value->getLocEnd()); 11729 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11730 PatternRange, 11731 Unexpanded, 11732 Expand, RetainExpansion, 11733 NumExpansions)) 11734 return ExprError(); 11735 11736 if (!Expand) { 11737 // The transform has determined that we should perform a simple 11738 // transformation on the pack expansion, producing another pack 11739 // expansion. 11740 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11741 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11742 if (Key.isInvalid()) 11743 return ExprError(); 11744 11745 if (Key.get() != OrigElement.Key) 11746 ArgChanged = true; 11747 11748 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11749 if (Value.isInvalid()) 11750 return ExprError(); 11751 11752 if (Value.get() != OrigElement.Value) 11753 ArgChanged = true; 11754 11755 ObjCDictionaryElement Expansion = { 11756 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11757 }; 11758 Elements.push_back(Expansion); 11759 continue; 11760 } 11761 11762 // Record right away that the argument was changed. This needs 11763 // to happen even if the array expands to nothing. 11764 ArgChanged = true; 11765 11766 // The transform has determined that we should perform an elementwise 11767 // expansion of the pattern. Do so. 11768 for (unsigned I = 0; I != *NumExpansions; ++I) { 11769 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11770 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11771 if (Key.isInvalid()) 11772 return ExprError(); 11773 11774 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11775 if (Value.isInvalid()) 11776 return ExprError(); 11777 11778 ObjCDictionaryElement Element = { 11779 Key.get(), Value.get(), SourceLocation(), NumExpansions 11780 }; 11781 11782 // If any unexpanded parameter packs remain, we still have a 11783 // pack expansion. 11784 // FIXME: Can this really happen? 11785 if (Key.get()->containsUnexpandedParameterPack() || 11786 Value.get()->containsUnexpandedParameterPack()) 11787 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11788 11789 Elements.push_back(Element); 11790 } 11791 11792 // FIXME: Retain a pack expansion if RetainExpansion is true. 11793 11794 // We've finished with this pack expansion. 11795 continue; 11796 } 11797 11798 // Transform and check key. 11799 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11800 if (Key.isInvalid()) 11801 return ExprError(); 11802 11803 if (Key.get() != OrigElement.Key) 11804 ArgChanged = true; 11805 11806 // Transform and check value. 11807 ExprResult Value 11808 = getDerived().TransformExpr(OrigElement.Value); 11809 if (Value.isInvalid()) 11810 return ExprError(); 11811 11812 if (Value.get() != OrigElement.Value) 11813 ArgChanged = true; 11814 11815 ObjCDictionaryElement Element = { 11816 Key.get(), Value.get(), SourceLocation(), None 11817 }; 11818 Elements.push_back(Element); 11819 } 11820 11821 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11822 return SemaRef.MaybeBindToTemporary(E); 11823 11824 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11825 Elements); 11826 } 11827 11828 template<typename Derived> 11829 ExprResult 11830 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11831 TypeSourceInfo *EncodedTypeInfo 11832 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11833 if (!EncodedTypeInfo) 11834 return ExprError(); 11835 11836 if (!getDerived().AlwaysRebuild() && 11837 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11838 return E; 11839 11840 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11841 EncodedTypeInfo, 11842 E->getRParenLoc()); 11843 } 11844 11845 template<typename Derived> 11846 ExprResult TreeTransform<Derived>:: 11847 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11848 // This is a kind of implicit conversion, and it needs to get dropped 11849 // and recomputed for the same general reasons that ImplicitCastExprs 11850 // do, as well a more specific one: this expression is only valid when 11851 // it appears *immediately* as an argument expression. 11852 return getDerived().TransformExpr(E->getSubExpr()); 11853 } 11854 11855 template<typename Derived> 11856 ExprResult TreeTransform<Derived>:: 11857 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11858 TypeSourceInfo *TSInfo 11859 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11860 if (!TSInfo) 11861 return ExprError(); 11862 11863 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11864 if (Result.isInvalid()) 11865 return ExprError(); 11866 11867 if (!getDerived().AlwaysRebuild() && 11868 TSInfo == E->getTypeInfoAsWritten() && 11869 Result.get() == E->getSubExpr()) 11870 return E; 11871 11872 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11873 E->getBridgeKeywordLoc(), TSInfo, 11874 Result.get()); 11875 } 11876 11877 template <typename Derived> 11878 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11879 ObjCAvailabilityCheckExpr *E) { 11880 return E; 11881 } 11882 11883 template<typename Derived> 11884 ExprResult 11885 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11886 // Transform arguments. 11887 bool ArgChanged = false; 11888 SmallVector<Expr*, 8> Args; 11889 Args.reserve(E->getNumArgs()); 11890 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11891 &ArgChanged)) 11892 return ExprError(); 11893 11894 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11895 // Class message: transform the receiver type. 11896 TypeSourceInfo *ReceiverTypeInfo 11897 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11898 if (!ReceiverTypeInfo) 11899 return ExprError(); 11900 11901 // If nothing changed, just retain the existing message send. 11902 if (!getDerived().AlwaysRebuild() && 11903 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11904 return SemaRef.MaybeBindToTemporary(E); 11905 11906 // Build a new class message send. 11907 SmallVector<SourceLocation, 16> SelLocs; 11908 E->getSelectorLocs(SelLocs); 11909 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11910 E->getSelector(), 11911 SelLocs, 11912 E->getMethodDecl(), 11913 E->getLeftLoc(), 11914 Args, 11915 E->getRightLoc()); 11916 } 11917 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11918 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11919 if (!E->getMethodDecl()) 11920 return ExprError(); 11921 11922 // Build a new class message send to 'super'. 11923 SmallVector<SourceLocation, 16> SelLocs; 11924 E->getSelectorLocs(SelLocs); 11925 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11926 E->getSelector(), 11927 SelLocs, 11928 E->getReceiverType(), 11929 E->getMethodDecl(), 11930 E->getLeftLoc(), 11931 Args, 11932 E->getRightLoc()); 11933 } 11934 11935 // Instance message: transform the receiver 11936 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 11937 "Only class and instance messages may be instantiated"); 11938 ExprResult Receiver 11939 = getDerived().TransformExpr(E->getInstanceReceiver()); 11940 if (Receiver.isInvalid()) 11941 return ExprError(); 11942 11943 // If nothing changed, just retain the existing message send. 11944 if (!getDerived().AlwaysRebuild() && 11945 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11946 return SemaRef.MaybeBindToTemporary(E); 11947 11948 // Build a new instance message send. 11949 SmallVector<SourceLocation, 16> SelLocs; 11950 E->getSelectorLocs(SelLocs); 11951 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11952 E->getSelector(), 11953 SelLocs, 11954 E->getMethodDecl(), 11955 E->getLeftLoc(), 11956 Args, 11957 E->getRightLoc()); 11958 } 11959 11960 template<typename Derived> 11961 ExprResult 11962 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11963 return E; 11964 } 11965 11966 template<typename Derived> 11967 ExprResult 11968 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11969 return E; 11970 } 11971 11972 template<typename Derived> 11973 ExprResult 11974 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11975 // Transform the base expression. 11976 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11977 if (Base.isInvalid()) 11978 return ExprError(); 11979 11980 // We don't need to transform the ivar; it will never change. 11981 11982 // If nothing changed, just retain the existing expression. 11983 if (!getDerived().AlwaysRebuild() && 11984 Base.get() == E->getBase()) 11985 return E; 11986 11987 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11988 E->getLocation(), 11989 E->isArrow(), E->isFreeIvar()); 11990 } 11991 11992 template<typename Derived> 11993 ExprResult 11994 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11995 // 'super' and types never change. Property never changes. Just 11996 // retain the existing expression. 11997 if (!E->isObjectReceiver()) 11998 return E; 11999 12000 // Transform the base expression. 12001 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12002 if (Base.isInvalid()) 12003 return ExprError(); 12004 12005 // We don't need to transform the property; it will never change. 12006 12007 // If nothing changed, just retain the existing expression. 12008 if (!getDerived().AlwaysRebuild() && 12009 Base.get() == E->getBase()) 12010 return E; 12011 12012 if (E->isExplicitProperty()) 12013 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12014 E->getExplicitProperty(), 12015 E->getLocation()); 12016 12017 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12018 SemaRef.Context.PseudoObjectTy, 12019 E->getImplicitPropertyGetter(), 12020 E->getImplicitPropertySetter(), 12021 E->getLocation()); 12022 } 12023 12024 template<typename Derived> 12025 ExprResult 12026 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12027 // Transform the base expression. 12028 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12029 if (Base.isInvalid()) 12030 return ExprError(); 12031 12032 // Transform the key expression. 12033 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12034 if (Key.isInvalid()) 12035 return ExprError(); 12036 12037 // If nothing changed, just retain the existing expression. 12038 if (!getDerived().AlwaysRebuild() && 12039 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12040 return E; 12041 12042 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12043 Base.get(), Key.get(), 12044 E->getAtIndexMethodDecl(), 12045 E->setAtIndexMethodDecl()); 12046 } 12047 12048 template<typename Derived> 12049 ExprResult 12050 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12051 // Transform the base expression. 12052 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12053 if (Base.isInvalid()) 12054 return ExprError(); 12055 12056 // If nothing changed, just retain the existing expression. 12057 if (!getDerived().AlwaysRebuild() && 12058 Base.get() == E->getBase()) 12059 return E; 12060 12061 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12062 E->getOpLoc(), 12063 E->isArrow()); 12064 } 12065 12066 template<typename Derived> 12067 ExprResult 12068 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12069 bool ArgumentChanged = false; 12070 SmallVector<Expr*, 8> SubExprs; 12071 SubExprs.reserve(E->getNumSubExprs()); 12072 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12073 SubExprs, &ArgumentChanged)) 12074 return ExprError(); 12075 12076 if (!getDerived().AlwaysRebuild() && 12077 !ArgumentChanged) 12078 return E; 12079 12080 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12081 SubExprs, 12082 E->getRParenLoc()); 12083 } 12084 12085 template<typename Derived> 12086 ExprResult 12087 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12088 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12089 if (SrcExpr.isInvalid()) 12090 return ExprError(); 12091 12092 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12093 if (!Type) 12094 return ExprError(); 12095 12096 if (!getDerived().AlwaysRebuild() && 12097 Type == E->getTypeSourceInfo() && 12098 SrcExpr.get() == E->getSrcExpr()) 12099 return E; 12100 12101 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12102 SrcExpr.get(), Type, 12103 E->getRParenLoc()); 12104 } 12105 12106 template<typename Derived> 12107 ExprResult 12108 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12109 BlockDecl *oldBlock = E->getBlockDecl(); 12110 12111 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12112 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12113 12114 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12115 blockScope->TheDecl->setBlockMissingReturnType( 12116 oldBlock->blockMissingReturnType()); 12117 12118 SmallVector<ParmVarDecl*, 4> params; 12119 SmallVector<QualType, 4> paramTypes; 12120 12121 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12122 12123 // Parameter substitution. 12124 Sema::ExtParameterInfoBuilder extParamInfos; 12125 if (getDerived().TransformFunctionTypeParams( 12126 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12127 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12128 extParamInfos)) { 12129 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12130 return ExprError(); 12131 } 12132 12133 QualType exprResultType = 12134 getDerived().TransformType(exprFunctionType->getReturnType()); 12135 12136 auto epi = exprFunctionType->getExtProtoInfo(); 12137 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12138 12139 QualType functionType = 12140 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12141 blockScope->FunctionType = functionType; 12142 12143 // Set the parameters on the block decl. 12144 if (!params.empty()) 12145 blockScope->TheDecl->setParams(params); 12146 12147 if (!oldBlock->blockMissingReturnType()) { 12148 blockScope->HasImplicitReturnType = false; 12149 blockScope->ReturnType = exprResultType; 12150 } 12151 12152 // Transform the body 12153 StmtResult body = getDerived().TransformStmt(E->getBody()); 12154 if (body.isInvalid()) { 12155 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12156 return ExprError(); 12157 } 12158 12159 #ifndef NDEBUG 12160 // In builds with assertions, make sure that we captured everything we 12161 // captured before. 12162 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12163 for (const auto &I : oldBlock->captures()) { 12164 VarDecl *oldCapture = I.getVariable(); 12165 12166 // Ignore parameter packs. 12167 if (isa<ParmVarDecl>(oldCapture) && 12168 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12169 continue; 12170 12171 VarDecl *newCapture = 12172 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12173 oldCapture)); 12174 assert(blockScope->CaptureMap.count(newCapture)); 12175 } 12176 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12177 } 12178 #endif 12179 12180 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12181 /*Scope=*/nullptr); 12182 } 12183 12184 template<typename Derived> 12185 ExprResult 12186 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12187 llvm_unreachable("Cannot transform asType expressions yet"); 12188 } 12189 12190 template<typename Derived> 12191 ExprResult 12192 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12193 QualType RetTy = getDerived().TransformType(E->getType()); 12194 bool ArgumentChanged = false; 12195 SmallVector<Expr*, 8> SubExprs; 12196 SubExprs.reserve(E->getNumSubExprs()); 12197 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12198 SubExprs, &ArgumentChanged)) 12199 return ExprError(); 12200 12201 if (!getDerived().AlwaysRebuild() && 12202 !ArgumentChanged) 12203 return E; 12204 12205 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12206 RetTy, E->getOp(), E->getRParenLoc()); 12207 } 12208 12209 //===----------------------------------------------------------------------===// 12210 // Type reconstruction 12211 //===----------------------------------------------------------------------===// 12212 12213 template<typename Derived> 12214 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12215 SourceLocation Star) { 12216 return SemaRef.BuildPointerType(PointeeType, Star, 12217 getDerived().getBaseEntity()); 12218 } 12219 12220 template<typename Derived> 12221 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12222 SourceLocation Star) { 12223 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12224 getDerived().getBaseEntity()); 12225 } 12226 12227 template<typename Derived> 12228 QualType 12229 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12230 bool WrittenAsLValue, 12231 SourceLocation Sigil) { 12232 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12233 Sigil, getDerived().getBaseEntity()); 12234 } 12235 12236 template<typename Derived> 12237 QualType 12238 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12239 QualType ClassType, 12240 SourceLocation Sigil) { 12241 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12242 getDerived().getBaseEntity()); 12243 } 12244 12245 template<typename Derived> 12246 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12247 const ObjCTypeParamDecl *Decl, 12248 SourceLocation ProtocolLAngleLoc, 12249 ArrayRef<ObjCProtocolDecl *> Protocols, 12250 ArrayRef<SourceLocation> ProtocolLocs, 12251 SourceLocation ProtocolRAngleLoc) { 12252 return SemaRef.BuildObjCTypeParamType(Decl, 12253 ProtocolLAngleLoc, Protocols, 12254 ProtocolLocs, ProtocolRAngleLoc, 12255 /*FailOnError=*/true); 12256 } 12257 12258 template<typename Derived> 12259 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12260 QualType BaseType, 12261 SourceLocation Loc, 12262 SourceLocation TypeArgsLAngleLoc, 12263 ArrayRef<TypeSourceInfo *> TypeArgs, 12264 SourceLocation TypeArgsRAngleLoc, 12265 SourceLocation ProtocolLAngleLoc, 12266 ArrayRef<ObjCProtocolDecl *> Protocols, 12267 ArrayRef<SourceLocation> ProtocolLocs, 12268 SourceLocation ProtocolRAngleLoc) { 12269 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12270 TypeArgs, TypeArgsRAngleLoc, 12271 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12272 ProtocolRAngleLoc, 12273 /*FailOnError=*/true); 12274 } 12275 12276 template<typename Derived> 12277 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12278 QualType PointeeType, 12279 SourceLocation Star) { 12280 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12281 } 12282 12283 template<typename Derived> 12284 QualType 12285 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12286 ArrayType::ArraySizeModifier SizeMod, 12287 const llvm::APInt *Size, 12288 Expr *SizeExpr, 12289 unsigned IndexTypeQuals, 12290 SourceRange BracketsRange) { 12291 if (SizeExpr || !Size) 12292 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12293 IndexTypeQuals, BracketsRange, 12294 getDerived().getBaseEntity()); 12295 12296 QualType Types[] = { 12297 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12298 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12299 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12300 }; 12301 const unsigned NumTypes = llvm::array_lengthof(Types); 12302 QualType SizeType; 12303 for (unsigned I = 0; I != NumTypes; ++I) 12304 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12305 SizeType = Types[I]; 12306 break; 12307 } 12308 12309 // Note that we can return a VariableArrayType here in the case where 12310 // the element type was a dependent VariableArrayType. 12311 IntegerLiteral *ArraySize 12312 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12313 /*FIXME*/BracketsRange.getBegin()); 12314 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12315 IndexTypeQuals, BracketsRange, 12316 getDerived().getBaseEntity()); 12317 } 12318 12319 template<typename Derived> 12320 QualType 12321 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12322 ArrayType::ArraySizeModifier SizeMod, 12323 const llvm::APInt &Size, 12324 unsigned IndexTypeQuals, 12325 SourceRange BracketsRange) { 12326 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12327 IndexTypeQuals, BracketsRange); 12328 } 12329 12330 template<typename Derived> 12331 QualType 12332 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12333 ArrayType::ArraySizeModifier SizeMod, 12334 unsigned IndexTypeQuals, 12335 SourceRange BracketsRange) { 12336 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12337 IndexTypeQuals, BracketsRange); 12338 } 12339 12340 template<typename Derived> 12341 QualType 12342 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12343 ArrayType::ArraySizeModifier SizeMod, 12344 Expr *SizeExpr, 12345 unsigned IndexTypeQuals, 12346 SourceRange BracketsRange) { 12347 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12348 SizeExpr, 12349 IndexTypeQuals, BracketsRange); 12350 } 12351 12352 template<typename Derived> 12353 QualType 12354 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12355 ArrayType::ArraySizeModifier SizeMod, 12356 Expr *SizeExpr, 12357 unsigned IndexTypeQuals, 12358 SourceRange BracketsRange) { 12359 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12360 SizeExpr, 12361 IndexTypeQuals, BracketsRange); 12362 } 12363 12364 template <typename Derived> 12365 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12366 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12367 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12368 AttributeLoc); 12369 } 12370 12371 template <typename Derived> 12372 QualType 12373 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12374 unsigned NumElements, 12375 VectorType::VectorKind VecKind) { 12376 // FIXME: semantic checking! 12377 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12378 } 12379 12380 template<typename Derived> 12381 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12382 unsigned NumElements, 12383 SourceLocation AttributeLoc) { 12384 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12385 NumElements, true); 12386 IntegerLiteral *VectorSize 12387 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12388 AttributeLoc); 12389 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12390 } 12391 12392 template<typename Derived> 12393 QualType 12394 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12395 Expr *SizeExpr, 12396 SourceLocation AttributeLoc) { 12397 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12398 } 12399 12400 template<typename Derived> 12401 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12402 QualType T, 12403 MutableArrayRef<QualType> ParamTypes, 12404 const FunctionProtoType::ExtProtoInfo &EPI) { 12405 return SemaRef.BuildFunctionType(T, ParamTypes, 12406 getDerived().getBaseLocation(), 12407 getDerived().getBaseEntity(), 12408 EPI); 12409 } 12410 12411 template<typename Derived> 12412 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12413 return SemaRef.Context.getFunctionNoProtoType(T); 12414 } 12415 12416 template<typename Derived> 12417 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12418 Decl *D) { 12419 assert(D && "no decl found"); 12420 if (D->isInvalidDecl()) return QualType(); 12421 12422 // FIXME: Doesn't account for ObjCInterfaceDecl! 12423 TypeDecl *Ty; 12424 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12425 // A valid resolved using typename pack expansion decl can have multiple 12426 // UsingDecls, but they must each have exactly one type, and it must be 12427 // the same type in every case. But we must have at least one expansion! 12428 if (UPD->expansions().empty()) { 12429 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12430 << UPD->isCXXClassMember() << UPD; 12431 return QualType(); 12432 } 12433 12434 // We might still have some unresolved types. Try to pick a resolved type 12435 // if we can. The final instantiation will check that the remaining 12436 // unresolved types instantiate to the type we pick. 12437 QualType FallbackT; 12438 QualType T; 12439 for (auto *E : UPD->expansions()) { 12440 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12441 if (ThisT.isNull()) 12442 continue; 12443 else if (ThisT->getAs<UnresolvedUsingType>()) 12444 FallbackT = ThisT; 12445 else if (T.isNull()) 12446 T = ThisT; 12447 else 12448 assert(getSema().Context.hasSameType(ThisT, T) && 12449 "mismatched resolved types in using pack expansion"); 12450 } 12451 return T.isNull() ? FallbackT : T; 12452 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12453 assert(Using->hasTypename() && 12454 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12455 12456 // A valid resolved using typename decl points to exactly one type decl. 12457 assert(++Using->shadow_begin() == Using->shadow_end()); 12458 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12459 } else { 12460 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12461 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12462 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12463 } 12464 12465 return SemaRef.Context.getTypeDeclType(Ty); 12466 } 12467 12468 template<typename Derived> 12469 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12470 SourceLocation Loc) { 12471 return SemaRef.BuildTypeofExprType(E, Loc); 12472 } 12473 12474 template<typename Derived> 12475 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12476 return SemaRef.Context.getTypeOfType(Underlying); 12477 } 12478 12479 template<typename Derived> 12480 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12481 SourceLocation Loc) { 12482 return SemaRef.BuildDecltypeType(E, Loc); 12483 } 12484 12485 template<typename Derived> 12486 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12487 UnaryTransformType::UTTKind UKind, 12488 SourceLocation Loc) { 12489 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12490 } 12491 12492 template<typename Derived> 12493 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12494 TemplateName Template, 12495 SourceLocation TemplateNameLoc, 12496 TemplateArgumentListInfo &TemplateArgs) { 12497 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12498 } 12499 12500 template<typename Derived> 12501 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12502 SourceLocation KWLoc) { 12503 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12504 } 12505 12506 template<typename Derived> 12507 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12508 SourceLocation KWLoc, 12509 bool isReadPipe) { 12510 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12511 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12512 } 12513 12514 template<typename Derived> 12515 TemplateName 12516 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12517 bool TemplateKW, 12518 TemplateDecl *Template) { 12519 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12520 Template); 12521 } 12522 12523 template<typename Derived> 12524 TemplateName 12525 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12526 SourceLocation TemplateKWLoc, 12527 const IdentifierInfo &Name, 12528 SourceLocation NameLoc, 12529 QualType ObjectType, 12530 NamedDecl *FirstQualifierInScope, 12531 bool AllowInjectedClassName) { 12532 UnqualifiedId TemplateName; 12533 TemplateName.setIdentifier(&Name, NameLoc); 12534 Sema::TemplateTy Template; 12535 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12536 SS, TemplateKWLoc, TemplateName, 12537 ParsedType::make(ObjectType), 12538 /*EnteringContext=*/false, 12539 Template, AllowInjectedClassName); 12540 return Template.get(); 12541 } 12542 12543 template<typename Derived> 12544 TemplateName 12545 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12546 SourceLocation TemplateKWLoc, 12547 OverloadedOperatorKind Operator, 12548 SourceLocation NameLoc, 12549 QualType ObjectType, 12550 bool AllowInjectedClassName) { 12551 UnqualifiedId Name; 12552 // FIXME: Bogus location information. 12553 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12554 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12555 Sema::TemplateTy Template; 12556 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12557 SS, TemplateKWLoc, Name, 12558 ParsedType::make(ObjectType), 12559 /*EnteringContext=*/false, 12560 Template, AllowInjectedClassName); 12561 return Template.get(); 12562 } 12563 12564 template<typename Derived> 12565 ExprResult 12566 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12567 SourceLocation OpLoc, 12568 Expr *OrigCallee, 12569 Expr *First, 12570 Expr *Second) { 12571 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12572 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12573 12574 if (First->getObjectKind() == OK_ObjCProperty) { 12575 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12576 if (BinaryOperator::isAssignmentOp(Opc)) 12577 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12578 First, Second); 12579 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12580 if (Result.isInvalid()) 12581 return ExprError(); 12582 First = Result.get(); 12583 } 12584 12585 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12586 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12587 if (Result.isInvalid()) 12588 return ExprError(); 12589 Second = Result.get(); 12590 } 12591 12592 // Determine whether this should be a builtin operation. 12593 if (Op == OO_Subscript) { 12594 if (!First->getType()->isOverloadableType() && 12595 !Second->getType()->isOverloadableType()) 12596 return getSema().CreateBuiltinArraySubscriptExpr(First, 12597 Callee->getLocStart(), 12598 Second, OpLoc); 12599 } else if (Op == OO_Arrow) { 12600 // -> is never a builtin operation. 12601 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12602 } else if (Second == nullptr || isPostIncDec) { 12603 if (!First->getType()->isOverloadableType()) { 12604 // The argument is not of overloadable type, so try to create a 12605 // built-in unary operation. 12606 UnaryOperatorKind Opc 12607 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12608 12609 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12610 } 12611 } else { 12612 if (!First->getType()->isOverloadableType() && 12613 !Second->getType()->isOverloadableType()) { 12614 // Neither of the arguments is an overloadable type, so try to 12615 // create a built-in binary operation. 12616 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12617 ExprResult Result 12618 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12619 if (Result.isInvalid()) 12620 return ExprError(); 12621 12622 return Result; 12623 } 12624 } 12625 12626 // Compute the transformed set of functions (and function templates) to be 12627 // used during overload resolution. 12628 UnresolvedSet<16> Functions; 12629 bool RequiresADL; 12630 12631 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12632 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12633 // If the overload could not be resolved in the template definition 12634 // (because we had a dependent argument), ADL is performed as part of 12635 // template instantiation. 12636 RequiresADL = ULE->requiresADL(); 12637 } else { 12638 // If we've resolved this to a particular non-member function, just call 12639 // that function. If we resolved it to a member function, 12640 // CreateOverloaded* will find that function for us. 12641 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12642 if (!isa<CXXMethodDecl>(ND)) 12643 Functions.addDecl(ND); 12644 RequiresADL = false; 12645 } 12646 12647 // Add any functions found via argument-dependent lookup. 12648 Expr *Args[2] = { First, Second }; 12649 unsigned NumArgs = 1 + (Second != nullptr); 12650 12651 // Create the overloaded operator invocation for unary operators. 12652 if (NumArgs == 1 || isPostIncDec) { 12653 UnaryOperatorKind Opc 12654 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12655 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12656 RequiresADL); 12657 } 12658 12659 if (Op == OO_Subscript) { 12660 SourceLocation LBrace; 12661 SourceLocation RBrace; 12662 12663 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12664 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12665 LBrace = SourceLocation::getFromRawEncoding( 12666 NameLoc.CXXOperatorName.BeginOpNameLoc); 12667 RBrace = SourceLocation::getFromRawEncoding( 12668 NameLoc.CXXOperatorName.EndOpNameLoc); 12669 } else { 12670 LBrace = Callee->getLocStart(); 12671 RBrace = OpLoc; 12672 } 12673 12674 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12675 First, Second); 12676 } 12677 12678 // Create the overloaded operator invocation for binary operators. 12679 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12680 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12681 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12682 if (Result.isInvalid()) 12683 return ExprError(); 12684 12685 return Result; 12686 } 12687 12688 template<typename Derived> 12689 ExprResult 12690 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12691 SourceLocation OperatorLoc, 12692 bool isArrow, 12693 CXXScopeSpec &SS, 12694 TypeSourceInfo *ScopeType, 12695 SourceLocation CCLoc, 12696 SourceLocation TildeLoc, 12697 PseudoDestructorTypeStorage Destroyed) { 12698 QualType BaseType = Base->getType(); 12699 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12700 (!isArrow && !BaseType->getAs<RecordType>()) || 12701 (isArrow && BaseType->getAs<PointerType>() && 12702 !BaseType->getAs<PointerType>()->getPointeeType() 12703 ->template getAs<RecordType>())){ 12704 // This pseudo-destructor expression is still a pseudo-destructor. 12705 return SemaRef.BuildPseudoDestructorExpr( 12706 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12707 CCLoc, TildeLoc, Destroyed); 12708 } 12709 12710 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12711 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12712 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12713 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12714 NameInfo.setNamedTypeInfo(DestroyedType); 12715 12716 // The scope type is now known to be a valid nested name specifier 12717 // component. Tack it on to the end of the nested name specifier. 12718 if (ScopeType) { 12719 if (!ScopeType->getType()->getAs<TagType>()) { 12720 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12721 diag::err_expected_class_or_namespace) 12722 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12723 return ExprError(); 12724 } 12725 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12726 CCLoc); 12727 } 12728 12729 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12730 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12731 OperatorLoc, isArrow, 12732 SS, TemplateKWLoc, 12733 /*FIXME: FirstQualifier*/ nullptr, 12734 NameInfo, 12735 /*TemplateArgs*/ nullptr, 12736 /*S*/nullptr); 12737 } 12738 12739 template<typename Derived> 12740 StmtResult 12741 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12742 SourceLocation Loc = S->getLocStart(); 12743 CapturedDecl *CD = S->getCapturedDecl(); 12744 unsigned NumParams = CD->getNumParams(); 12745 unsigned ContextParamPos = CD->getContextParamPosition(); 12746 SmallVector<Sema::CapturedParamNameType, 4> Params; 12747 for (unsigned I = 0; I < NumParams; ++I) { 12748 if (I != ContextParamPos) { 12749 Params.push_back( 12750 std::make_pair( 12751 CD->getParam(I)->getName(), 12752 getDerived().TransformType(CD->getParam(I)->getType()))); 12753 } else { 12754 Params.push_back(std::make_pair(StringRef(), QualType())); 12755 } 12756 } 12757 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12758 S->getCapturedRegionKind(), Params); 12759 StmtResult Body; 12760 { 12761 Sema::CompoundScopeRAII CompoundScope(getSema()); 12762 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12763 } 12764 12765 if (Body.isInvalid()) { 12766 getSema().ActOnCapturedRegionError(); 12767 return StmtError(); 12768 } 12769 12770 return getSema().ActOnCapturedRegionEnd(Body.get()); 12771 } 12772 12773 } // end namespace clang 12774 12775 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12776