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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief Initializes a new tree transformer. 124 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 125 126 /// \brief Retrieves a reference to the derived class. 127 Derived &getDerived() { return static_cast<Derived&>(*this); } 128 129 /// \brief 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 /// \brief Retrieves a reference to the semantic analysis object used for 138 /// this tree transform. 139 Sema &getSema() const { return SemaRef; } 140 141 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief "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 /// \brief "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 /// \brief Note to the derived class when a function parameter pack is 281 /// being expanded. 282 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 283 284 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 582 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 583 TemplateArgumentLoc &ArgLoc); 584 585 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief Build a new unprototyped function type. 859 QualType RebuildFunctionNoProtoType(QualType ResultType); 860 861 /// \brief Rebuild an unresolved typename type, given the decl that 862 /// the UnresolvedUsingTypenameDecl was transformed to. 863 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 864 865 /// \brief Build a new typedef type. 866 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 867 return SemaRef.Context.getTypeDeclType(Typedef); 868 } 869 870 /// \brief Build a new class/struct/union type. 871 QualType RebuildRecordType(RecordDecl *Record) { 872 return SemaRef.Context.getTypeDeclType(Record); 873 } 874 875 /// \brief Build a new Enum type. 876 QualType RebuildEnumType(EnumDecl *Enum) { 877 return SemaRef.Context.getTypeDeclType(Enum); 878 } 879 880 /// \brief 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 /// \brief 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 /// \brief Build a new unary transform type. 892 QualType RebuildUnaryTransformType(QualType BaseType, 893 UnaryTransformType::UTTKind UKind, 894 SourceLocation Loc); 895 896 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 /// \brief 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 const IdentifierInfo *Name, 961 SourceLocation NameLoc, 962 TemplateArgumentListInfo &Args, 963 bool AllowInjectedClassName) { 964 // Rebuild the template name. 965 // TODO: avoid TemplateName abstraction 966 CXXScopeSpec SS; 967 SS.Adopt(QualifierLoc); 968 TemplateName InstName 969 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 970 nullptr, AllowInjectedClassName); 971 972 if (InstName.isNull()) 973 return QualType(); 974 975 // If it's still dependent, make a dependent specialization. 976 if (InstName.getAsDependentTemplateName()) 977 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 978 QualifierLoc.getNestedNameSpecifier(), 979 Name, 980 Args); 981 982 // Otherwise, make an elaborated type wrapping a non-dependent 983 // specialization. 984 QualType T = 985 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 986 if (T.isNull()) return QualType(); 987 988 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 989 return T; 990 991 return SemaRef.Context.getElaboratedType(Keyword, 992 QualifierLoc.getNestedNameSpecifier(), 993 T); 994 } 995 996 /// \brief Build a new typename type that refers to an identifier. 997 /// 998 /// By default, performs semantic analysis when building the typename type 999 /// (or elaborated type). Subclasses may override this routine to provide 1000 /// different behavior. 1001 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1002 SourceLocation KeywordLoc, 1003 NestedNameSpecifierLoc QualifierLoc, 1004 const IdentifierInfo *Id, 1005 SourceLocation IdLoc, 1006 bool DeducedTSTContext) { 1007 CXXScopeSpec SS; 1008 SS.Adopt(QualifierLoc); 1009 1010 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1011 // If the name is still dependent, just build a new dependent name type. 1012 if (!SemaRef.computeDeclContext(SS)) 1013 return SemaRef.Context.getDependentNameType(Keyword, 1014 QualifierLoc.getNestedNameSpecifier(), 1015 Id); 1016 } 1017 1018 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1019 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1020 *Id, IdLoc); 1021 // If a dependent name resolves to a deduced template specialization type, 1022 // check that we're in one of the syntactic contexts permitting it. 1023 if (!DeducedTSTContext) { 1024 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1025 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1026 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1027 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1028 Deduced->getTemplateName()) 1029 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1030 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1031 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1032 return QualType(); 1033 } 1034 } 1035 return T; 1036 } 1037 1038 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1039 1040 // We had a dependent elaborated-type-specifier that has been transformed 1041 // into a non-dependent elaborated-type-specifier. Find the tag we're 1042 // referring to. 1043 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1044 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1045 if (!DC) 1046 return QualType(); 1047 1048 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1049 return QualType(); 1050 1051 TagDecl *Tag = nullptr; 1052 SemaRef.LookupQualifiedName(Result, DC); 1053 switch (Result.getResultKind()) { 1054 case LookupResult::NotFound: 1055 case LookupResult::NotFoundInCurrentInstantiation: 1056 break; 1057 1058 case LookupResult::Found: 1059 Tag = Result.getAsSingle<TagDecl>(); 1060 break; 1061 1062 case LookupResult::FoundOverloaded: 1063 case LookupResult::FoundUnresolvedValue: 1064 llvm_unreachable("Tag lookup cannot find non-tags"); 1065 1066 case LookupResult::Ambiguous: 1067 // Let the LookupResult structure handle ambiguities. 1068 return QualType(); 1069 } 1070 1071 if (!Tag) { 1072 // Check where the name exists but isn't a tag type and use that to emit 1073 // better diagnostics. 1074 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1075 SemaRef.LookupQualifiedName(Result, DC); 1076 switch (Result.getResultKind()) { 1077 case LookupResult::Found: 1078 case LookupResult::FoundOverloaded: 1079 case LookupResult::FoundUnresolvedValue: { 1080 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1081 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1082 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1083 << NTK << Kind; 1084 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1085 break; 1086 } 1087 default: 1088 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1089 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1090 break; 1091 } 1092 return QualType(); 1093 } 1094 1095 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1096 IdLoc, Id)) { 1097 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1098 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1099 return QualType(); 1100 } 1101 1102 // Build the elaborated-type-specifier type. 1103 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1104 return SemaRef.Context.getElaboratedType(Keyword, 1105 QualifierLoc.getNestedNameSpecifier(), 1106 T); 1107 } 1108 1109 /// \brief Build a new pack expansion type. 1110 /// 1111 /// By default, builds a new PackExpansionType type from the given pattern. 1112 /// Subclasses may override this routine to provide different behavior. 1113 QualType RebuildPackExpansionType(QualType Pattern, 1114 SourceRange PatternRange, 1115 SourceLocation EllipsisLoc, 1116 Optional<unsigned> NumExpansions) { 1117 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1118 NumExpansions); 1119 } 1120 1121 /// \brief Build a new atomic type given its value type. 1122 /// 1123 /// By default, performs semantic analysis when building the atomic type. 1124 /// Subclasses may override this routine to provide different behavior. 1125 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1126 1127 /// \brief Build a new pipe type given its value type. 1128 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1129 bool isReadPipe); 1130 1131 /// \brief Build a new template name given a nested name specifier, a flag 1132 /// indicating whether the "template" keyword was provided, and the template 1133 /// that the template name refers to. 1134 /// 1135 /// By default, builds the new template name directly. Subclasses may override 1136 /// this routine to provide different behavior. 1137 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1138 bool TemplateKW, 1139 TemplateDecl *Template); 1140 1141 /// \brief Build a new template name given a nested name specifier and the 1142 /// name that is referred to as a template. 1143 /// 1144 /// By default, performs semantic analysis to determine whether the name can 1145 /// be resolved to a specific template, then builds the appropriate kind of 1146 /// template name. Subclasses may override this routine to provide different 1147 /// behavior. 1148 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1149 const IdentifierInfo &Name, 1150 SourceLocation NameLoc, 1151 QualType ObjectType, 1152 NamedDecl *FirstQualifierInScope, 1153 bool AllowInjectedClassName); 1154 1155 /// \brief Build a new template name given a nested name specifier and the 1156 /// overloaded operator name that is referred to as a template. 1157 /// 1158 /// By default, performs semantic analysis to determine whether the name can 1159 /// be resolved to a specific template, then builds the appropriate kind of 1160 /// template name. Subclasses may override this routine to provide different 1161 /// behavior. 1162 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1163 OverloadedOperatorKind Operator, 1164 SourceLocation NameLoc, 1165 QualType ObjectType, 1166 bool AllowInjectedClassName); 1167 1168 /// \brief Build a new template name given a template template parameter pack 1169 /// and the 1170 /// 1171 /// By default, performs semantic analysis to determine whether the name can 1172 /// be resolved to a specific template, then builds the appropriate kind of 1173 /// template name. Subclasses may override this routine to provide different 1174 /// behavior. 1175 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1176 const TemplateArgument &ArgPack) { 1177 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1178 } 1179 1180 /// \brief Build a new compound statement. 1181 /// 1182 /// By default, performs semantic analysis to build the new statement. 1183 /// Subclasses may override this routine to provide different behavior. 1184 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1185 MultiStmtArg Statements, 1186 SourceLocation RBraceLoc, 1187 bool IsStmtExpr) { 1188 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1189 IsStmtExpr); 1190 } 1191 1192 /// \brief Build a new case statement. 1193 /// 1194 /// By default, performs semantic analysis to build the new statement. 1195 /// Subclasses may override this routine to provide different behavior. 1196 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1197 Expr *LHS, 1198 SourceLocation EllipsisLoc, 1199 Expr *RHS, 1200 SourceLocation ColonLoc) { 1201 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1202 ColonLoc); 1203 } 1204 1205 /// \brief Attach the body to a new case statement. 1206 /// 1207 /// By default, performs semantic analysis to build the new statement. 1208 /// Subclasses may override this routine to provide different behavior. 1209 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1210 getSema().ActOnCaseStmtBody(S, Body); 1211 return S; 1212 } 1213 1214 /// \brief Build a new default statement. 1215 /// 1216 /// By default, performs semantic analysis to build the new statement. 1217 /// Subclasses may override this routine to provide different behavior. 1218 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1219 SourceLocation ColonLoc, 1220 Stmt *SubStmt) { 1221 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1222 /*CurScope=*/nullptr); 1223 } 1224 1225 /// \brief Build a new label statement. 1226 /// 1227 /// By default, performs semantic analysis to build the new statement. 1228 /// Subclasses may override this routine to provide different behavior. 1229 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1230 SourceLocation ColonLoc, Stmt *SubStmt) { 1231 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1232 } 1233 1234 /// \brief Build a new label statement. 1235 /// 1236 /// By default, performs semantic analysis to build the new statement. 1237 /// Subclasses may override this routine to provide different behavior. 1238 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1239 ArrayRef<const Attr*> Attrs, 1240 Stmt *SubStmt) { 1241 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1242 } 1243 1244 /// \brief Build a new "if" statement. 1245 /// 1246 /// By default, performs semantic analysis to build the new statement. 1247 /// Subclasses may override this routine to provide different behavior. 1248 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1249 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1250 SourceLocation ElseLoc, Stmt *Else) { 1251 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1252 ElseLoc, Else); 1253 } 1254 1255 /// \brief Start building a new switch statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1260 Sema::ConditionResult Cond) { 1261 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1262 } 1263 1264 /// \brief Attach the body to the switch statement. 1265 /// 1266 /// By default, performs semantic analysis to build the new statement. 1267 /// Subclasses may override this routine to provide different behavior. 1268 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1269 Stmt *Switch, Stmt *Body) { 1270 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1271 } 1272 1273 /// \brief Build a new while statement. 1274 /// 1275 /// By default, performs semantic analysis to build the new statement. 1276 /// Subclasses may override this routine to provide different behavior. 1277 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1278 Sema::ConditionResult Cond, Stmt *Body) { 1279 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1280 } 1281 1282 /// \brief Build a new do-while statement. 1283 /// 1284 /// By default, performs semantic analysis to build the new statement. 1285 /// Subclasses may override this routine to provide different behavior. 1286 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1287 SourceLocation WhileLoc, SourceLocation LParenLoc, 1288 Expr *Cond, SourceLocation RParenLoc) { 1289 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1290 Cond, RParenLoc); 1291 } 1292 1293 /// \brief Build a new for statement. 1294 /// 1295 /// By default, performs semantic analysis to build the new statement. 1296 /// Subclasses may override this routine to provide different behavior. 1297 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1298 Stmt *Init, Sema::ConditionResult Cond, 1299 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1300 Stmt *Body) { 1301 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1302 Inc, RParenLoc, Body); 1303 } 1304 1305 /// \brief Build a new goto statement. 1306 /// 1307 /// By default, performs semantic analysis to build the new statement. 1308 /// Subclasses may override this routine to provide different behavior. 1309 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1310 LabelDecl *Label) { 1311 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1312 } 1313 1314 /// \brief Build a new indirect goto statement. 1315 /// 1316 /// By default, performs semantic analysis to build the new statement. 1317 /// Subclasses may override this routine to provide different behavior. 1318 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1319 SourceLocation StarLoc, 1320 Expr *Target) { 1321 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1322 } 1323 1324 /// \brief Build a new return statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1329 return getSema().BuildReturnStmt(ReturnLoc, Result); 1330 } 1331 1332 /// \brief Build a new declaration statement. 1333 /// 1334 /// By default, performs semantic analysis to build the new statement. 1335 /// Subclasses may override this routine to provide different behavior. 1336 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1337 SourceLocation StartLoc, SourceLocation EndLoc) { 1338 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1339 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1340 } 1341 1342 /// \brief Build a new inline asm statement. 1343 /// 1344 /// By default, performs semantic analysis to build the new statement. 1345 /// Subclasses may override this routine to provide different behavior. 1346 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1347 bool IsVolatile, unsigned NumOutputs, 1348 unsigned NumInputs, IdentifierInfo **Names, 1349 MultiExprArg Constraints, MultiExprArg Exprs, 1350 Expr *AsmString, MultiExprArg Clobbers, 1351 SourceLocation RParenLoc) { 1352 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1353 NumInputs, Names, Constraints, Exprs, 1354 AsmString, Clobbers, RParenLoc); 1355 } 1356 1357 /// \brief Build a new MS style inline asm statement. 1358 /// 1359 /// By default, performs semantic analysis to build the new statement. 1360 /// Subclasses may override this routine to provide different behavior. 1361 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1362 ArrayRef<Token> AsmToks, 1363 StringRef AsmString, 1364 unsigned NumOutputs, unsigned NumInputs, 1365 ArrayRef<StringRef> Constraints, 1366 ArrayRef<StringRef> Clobbers, 1367 ArrayRef<Expr*> Exprs, 1368 SourceLocation EndLoc) { 1369 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1370 NumOutputs, NumInputs, 1371 Constraints, Clobbers, Exprs, EndLoc); 1372 } 1373 1374 /// \brief Build a new co_return statement. 1375 /// 1376 /// By default, performs semantic analysis to build the new statement. 1377 /// Subclasses may override this routine to provide different behavior. 1378 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1379 bool IsImplicit) { 1380 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1381 } 1382 1383 /// \brief Build a new co_await expression. 1384 /// 1385 /// By default, performs semantic analysis to build the new expression. 1386 /// Subclasses may override this routine to provide different behavior. 1387 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1388 bool IsImplicit) { 1389 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1390 } 1391 1392 /// \brief Build a new co_await expression. 1393 /// 1394 /// By default, performs semantic analysis to build the new expression. 1395 /// Subclasses may override this routine to provide different behavior. 1396 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1397 Expr *Result, 1398 UnresolvedLookupExpr *Lookup) { 1399 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1400 } 1401 1402 /// \brief Build a new co_yield expression. 1403 /// 1404 /// By default, performs semantic analysis to build the new expression. 1405 /// Subclasses may override this routine to provide different behavior. 1406 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1407 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1408 } 1409 1410 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1411 return getSema().BuildCoroutineBodyStmt(Args); 1412 } 1413 1414 /// \brief Build a new Objective-C \@try statement. 1415 /// 1416 /// By default, performs semantic analysis to build the new statement. 1417 /// Subclasses may override this routine to provide different behavior. 1418 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1419 Stmt *TryBody, 1420 MultiStmtArg CatchStmts, 1421 Stmt *Finally) { 1422 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1423 Finally); 1424 } 1425 1426 /// \brief Rebuild an Objective-C exception declaration. 1427 /// 1428 /// By default, performs semantic analysis to build the new declaration. 1429 /// Subclasses may override this routine to provide different behavior. 1430 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1431 TypeSourceInfo *TInfo, QualType T) { 1432 return getSema().BuildObjCExceptionDecl(TInfo, T, 1433 ExceptionDecl->getInnerLocStart(), 1434 ExceptionDecl->getLocation(), 1435 ExceptionDecl->getIdentifier()); 1436 } 1437 1438 /// \brief Build a new Objective-C \@catch statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1443 SourceLocation RParenLoc, 1444 VarDecl *Var, 1445 Stmt *Body) { 1446 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1447 Var, Body); 1448 } 1449 1450 /// \brief Build a new Objective-C \@finally statement. 1451 /// 1452 /// By default, performs semantic analysis to build the new statement. 1453 /// Subclasses may override this routine to provide different behavior. 1454 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1455 Stmt *Body) { 1456 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1457 } 1458 1459 /// \brief Build a new Objective-C \@throw statement. 1460 /// 1461 /// By default, performs semantic analysis to build the new statement. 1462 /// Subclasses may override this routine to provide different behavior. 1463 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1464 Expr *Operand) { 1465 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1466 } 1467 1468 /// \brief Build a new OpenMP executable directive. 1469 /// 1470 /// By default, performs semantic analysis to build the new statement. 1471 /// Subclasses may override this routine to provide different behavior. 1472 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1473 DeclarationNameInfo DirName, 1474 OpenMPDirectiveKind CancelRegion, 1475 ArrayRef<OMPClause *> Clauses, 1476 Stmt *AStmt, SourceLocation StartLoc, 1477 SourceLocation EndLoc) { 1478 return getSema().ActOnOpenMPExecutableDirective( 1479 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1480 } 1481 1482 /// \brief Build a new OpenMP 'if' clause. 1483 /// 1484 /// By default, performs semantic analysis to build the new OpenMP clause. 1485 /// Subclasses may override this routine to provide different behavior. 1486 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1487 Expr *Condition, SourceLocation StartLoc, 1488 SourceLocation LParenLoc, 1489 SourceLocation NameModifierLoc, 1490 SourceLocation ColonLoc, 1491 SourceLocation EndLoc) { 1492 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1493 LParenLoc, NameModifierLoc, ColonLoc, 1494 EndLoc); 1495 } 1496 1497 /// \brief Build a new OpenMP 'final' clause. 1498 /// 1499 /// By default, performs semantic analysis to build the new OpenMP clause. 1500 /// Subclasses may override this routine to provide different behavior. 1501 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1502 SourceLocation LParenLoc, 1503 SourceLocation EndLoc) { 1504 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1505 EndLoc); 1506 } 1507 1508 /// \brief Build a new OpenMP 'num_threads' clause. 1509 /// 1510 /// By default, performs semantic analysis to build the new OpenMP clause. 1511 /// Subclasses may override this routine to provide different behavior. 1512 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1513 SourceLocation StartLoc, 1514 SourceLocation LParenLoc, 1515 SourceLocation EndLoc) { 1516 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1517 LParenLoc, EndLoc); 1518 } 1519 1520 /// \brief Build a new OpenMP 'safelen' clause. 1521 /// 1522 /// By default, performs semantic analysis to build the new OpenMP clause. 1523 /// Subclasses may override this routine to provide different behavior. 1524 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1525 SourceLocation LParenLoc, 1526 SourceLocation EndLoc) { 1527 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1528 } 1529 1530 /// \brief Build a new OpenMP 'simdlen' clause. 1531 /// 1532 /// By default, performs semantic analysis to build the new OpenMP clause. 1533 /// Subclasses may override this routine to provide different behavior. 1534 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1535 SourceLocation LParenLoc, 1536 SourceLocation EndLoc) { 1537 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1538 } 1539 1540 /// \brief Build a new OpenMP 'collapse' clause. 1541 /// 1542 /// By default, performs semantic analysis to build the new OpenMP clause. 1543 /// Subclasses may override this routine to provide different behavior. 1544 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1545 SourceLocation LParenLoc, 1546 SourceLocation EndLoc) { 1547 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1548 EndLoc); 1549 } 1550 1551 /// \brief Build a new OpenMP 'default' clause. 1552 /// 1553 /// By default, performs semantic analysis to build the new OpenMP clause. 1554 /// Subclasses may override this routine to provide different behavior. 1555 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1556 SourceLocation KindKwLoc, 1557 SourceLocation StartLoc, 1558 SourceLocation LParenLoc, 1559 SourceLocation EndLoc) { 1560 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1561 StartLoc, LParenLoc, EndLoc); 1562 } 1563 1564 /// \brief Build a new OpenMP 'proc_bind' clause. 1565 /// 1566 /// By default, performs semantic analysis to build the new OpenMP clause. 1567 /// Subclasses may override this routine to provide different behavior. 1568 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1569 SourceLocation KindKwLoc, 1570 SourceLocation StartLoc, 1571 SourceLocation LParenLoc, 1572 SourceLocation EndLoc) { 1573 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1574 StartLoc, LParenLoc, EndLoc); 1575 } 1576 1577 /// \brief Build a new OpenMP 'schedule' clause. 1578 /// 1579 /// By default, performs semantic analysis to build the new OpenMP clause. 1580 /// Subclasses may override this routine to provide different behavior. 1581 OMPClause *RebuildOMPScheduleClause( 1582 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1583 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1584 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1585 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1586 return getSema().ActOnOpenMPScheduleClause( 1587 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1588 CommaLoc, EndLoc); 1589 } 1590 1591 /// \brief Build a new OpenMP 'ordered' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1596 SourceLocation EndLoc, 1597 SourceLocation LParenLoc, Expr *Num) { 1598 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1599 } 1600 1601 /// \brief Build a new OpenMP 'private' clause. 1602 /// 1603 /// By default, performs semantic analysis to build the new OpenMP clause. 1604 /// Subclasses may override this routine to provide different behavior. 1605 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1606 SourceLocation StartLoc, 1607 SourceLocation LParenLoc, 1608 SourceLocation EndLoc) { 1609 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1610 EndLoc); 1611 } 1612 1613 /// \brief Build a new OpenMP 'firstprivate' clause. 1614 /// 1615 /// By default, performs semantic analysis to build the new OpenMP clause. 1616 /// Subclasses may override this routine to provide different behavior. 1617 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1618 SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1622 EndLoc); 1623 } 1624 1625 /// \brief Build a new OpenMP 'lastprivate' clause. 1626 /// 1627 /// By default, performs semantic analysis to build the new OpenMP clause. 1628 /// Subclasses may override this routine to provide different behavior. 1629 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1634 EndLoc); 1635 } 1636 1637 /// \brief Build a new OpenMP 'shared' clause. 1638 /// 1639 /// By default, performs semantic analysis to build the new OpenMP clause. 1640 /// Subclasses may override this routine to provide different behavior. 1641 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1642 SourceLocation StartLoc, 1643 SourceLocation LParenLoc, 1644 SourceLocation EndLoc) { 1645 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1646 EndLoc); 1647 } 1648 1649 /// \brief Build a new OpenMP 'reduction' clause. 1650 /// 1651 /// By default, performs semantic analysis to build the new statement. 1652 /// Subclasses may override this routine to provide different behavior. 1653 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1654 SourceLocation StartLoc, 1655 SourceLocation LParenLoc, 1656 SourceLocation ColonLoc, 1657 SourceLocation EndLoc, 1658 CXXScopeSpec &ReductionIdScopeSpec, 1659 const DeclarationNameInfo &ReductionId, 1660 ArrayRef<Expr *> UnresolvedReductions) { 1661 return getSema().ActOnOpenMPReductionClause( 1662 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1663 ReductionId, UnresolvedReductions); 1664 } 1665 1666 /// Build a new OpenMP 'task_reduction' clause. 1667 /// 1668 /// By default, performs semantic analysis to build the new statement. 1669 /// Subclasses may override this routine to provide different behavior. 1670 OMPClause *RebuildOMPTaskReductionClause( 1671 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1672 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1673 CXXScopeSpec &ReductionIdScopeSpec, 1674 const DeclarationNameInfo &ReductionId, 1675 ArrayRef<Expr *> UnresolvedReductions) { 1676 return getSema().ActOnOpenMPTaskReductionClause( 1677 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1678 ReductionId, UnresolvedReductions); 1679 } 1680 1681 /// Build a new OpenMP 'in_reduction' clause. 1682 /// 1683 /// By default, performs semantic analysis to build the new statement. 1684 /// Subclasses may override this routine to provide different behavior. 1685 OMPClause * 1686 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1687 SourceLocation LParenLoc, SourceLocation ColonLoc, 1688 SourceLocation EndLoc, 1689 CXXScopeSpec &ReductionIdScopeSpec, 1690 const DeclarationNameInfo &ReductionId, 1691 ArrayRef<Expr *> UnresolvedReductions) { 1692 return getSema().ActOnOpenMPInReductionClause( 1693 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1694 ReductionId, UnresolvedReductions); 1695 } 1696 1697 /// \brief Build a new OpenMP 'linear' clause. 1698 /// 1699 /// By default, performs semantic analysis to build the new OpenMP clause. 1700 /// Subclasses may override this routine to provide different behavior. 1701 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1702 SourceLocation StartLoc, 1703 SourceLocation LParenLoc, 1704 OpenMPLinearClauseKind Modifier, 1705 SourceLocation ModifierLoc, 1706 SourceLocation ColonLoc, 1707 SourceLocation EndLoc) { 1708 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1709 Modifier, ModifierLoc, ColonLoc, 1710 EndLoc); 1711 } 1712 1713 /// \brief Build a new OpenMP 'aligned' clause. 1714 /// 1715 /// By default, performs semantic analysis to build the new OpenMP clause. 1716 /// Subclasses may override this routine to provide different behavior. 1717 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1718 SourceLocation StartLoc, 1719 SourceLocation LParenLoc, 1720 SourceLocation ColonLoc, 1721 SourceLocation EndLoc) { 1722 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1723 LParenLoc, ColonLoc, EndLoc); 1724 } 1725 1726 /// \brief Build a new OpenMP 'copyin' clause. 1727 /// 1728 /// By default, performs semantic analysis to build the new OpenMP clause. 1729 /// Subclasses may override this routine to provide different behavior. 1730 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1731 SourceLocation StartLoc, 1732 SourceLocation LParenLoc, 1733 SourceLocation EndLoc) { 1734 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1735 EndLoc); 1736 } 1737 1738 /// \brief Build a new OpenMP 'copyprivate' clause. 1739 /// 1740 /// By default, performs semantic analysis to build the new OpenMP clause. 1741 /// Subclasses may override this routine to provide different behavior. 1742 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1743 SourceLocation StartLoc, 1744 SourceLocation LParenLoc, 1745 SourceLocation EndLoc) { 1746 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1747 EndLoc); 1748 } 1749 1750 /// \brief Build a new OpenMP 'flush' pseudo clause. 1751 /// 1752 /// By default, performs semantic analysis to build the new OpenMP clause. 1753 /// Subclasses may override this routine to provide different behavior. 1754 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1755 SourceLocation StartLoc, 1756 SourceLocation LParenLoc, 1757 SourceLocation EndLoc) { 1758 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1759 EndLoc); 1760 } 1761 1762 /// \brief Build a new OpenMP 'depend' pseudo clause. 1763 /// 1764 /// By default, performs semantic analysis to build the new OpenMP clause. 1765 /// Subclasses may override this routine to provide different behavior. 1766 OMPClause * 1767 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1768 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1769 SourceLocation StartLoc, SourceLocation LParenLoc, 1770 SourceLocation EndLoc) { 1771 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1772 StartLoc, LParenLoc, EndLoc); 1773 } 1774 1775 /// \brief Build a new OpenMP 'device' clause. 1776 /// 1777 /// By default, performs semantic analysis to build the new statement. 1778 /// Subclasses may override this routine to provide different behavior. 1779 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1780 SourceLocation LParenLoc, 1781 SourceLocation EndLoc) { 1782 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1783 EndLoc); 1784 } 1785 1786 /// \brief Build a new OpenMP 'map' clause. 1787 /// 1788 /// By default, performs semantic analysis to build the new OpenMP clause. 1789 /// Subclasses may override this routine to provide different behavior. 1790 OMPClause * 1791 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1792 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1793 SourceLocation MapLoc, SourceLocation ColonLoc, 1794 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1795 SourceLocation LParenLoc, SourceLocation EndLoc) { 1796 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1797 IsMapTypeImplicit, MapLoc, ColonLoc, 1798 VarList, StartLoc, LParenLoc, EndLoc); 1799 } 1800 1801 /// \brief Build a new OpenMP 'num_teams' clause. 1802 /// 1803 /// By default, performs semantic analysis to build the new statement. 1804 /// Subclasses may override this routine to provide different behavior. 1805 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1806 SourceLocation LParenLoc, 1807 SourceLocation EndLoc) { 1808 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1809 EndLoc); 1810 } 1811 1812 /// \brief Build a new OpenMP 'thread_limit' clause. 1813 /// 1814 /// By default, performs semantic analysis to build the new statement. 1815 /// Subclasses may override this routine to provide different behavior. 1816 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1817 SourceLocation StartLoc, 1818 SourceLocation LParenLoc, 1819 SourceLocation EndLoc) { 1820 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1821 LParenLoc, EndLoc); 1822 } 1823 1824 /// \brief Build a new OpenMP 'priority' clause. 1825 /// 1826 /// By default, performs semantic analysis to build the new statement. 1827 /// Subclasses may override this routine to provide different behavior. 1828 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 SourceLocation EndLoc) { 1831 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1832 EndLoc); 1833 } 1834 1835 /// \brief Build a new OpenMP 'grainsize' clause. 1836 /// 1837 /// By default, performs semantic analysis to build the new statement. 1838 /// Subclasses may override this routine to provide different behavior. 1839 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1840 SourceLocation LParenLoc, 1841 SourceLocation EndLoc) { 1842 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1843 EndLoc); 1844 } 1845 1846 /// \brief Build a new OpenMP 'num_tasks' clause. 1847 /// 1848 /// By default, performs semantic analysis to build the new statement. 1849 /// Subclasses may override this routine to provide different behavior. 1850 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1851 SourceLocation LParenLoc, 1852 SourceLocation EndLoc) { 1853 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1854 EndLoc); 1855 } 1856 1857 /// \brief Build a new OpenMP 'hint' clause. 1858 /// 1859 /// By default, performs semantic analysis to build the new statement. 1860 /// Subclasses may override this routine to provide different behavior. 1861 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1862 SourceLocation LParenLoc, 1863 SourceLocation EndLoc) { 1864 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1865 } 1866 1867 /// \brief Build a new OpenMP 'dist_schedule' clause. 1868 /// 1869 /// By default, performs semantic analysis to build the new OpenMP clause. 1870 /// Subclasses may override this routine to provide different behavior. 1871 OMPClause * 1872 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1873 Expr *ChunkSize, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, SourceLocation KindLoc, 1875 SourceLocation CommaLoc, SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPDistScheduleClause( 1877 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1878 } 1879 1880 /// \brief Build a new OpenMP 'to' clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new statement. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1885 SourceLocation StartLoc, 1886 SourceLocation LParenLoc, 1887 SourceLocation EndLoc) { 1888 return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); 1889 } 1890 1891 /// \brief Build a new OpenMP 'from' clause. 1892 /// 1893 /// By default, performs semantic analysis to build the new statement. 1894 /// Subclasses may override this routine to provide different behavior. 1895 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1896 SourceLocation StartLoc, 1897 SourceLocation LParenLoc, 1898 SourceLocation EndLoc) { 1899 return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, 1900 EndLoc); 1901 } 1902 1903 /// Build a new OpenMP 'use_device_ptr' clause. 1904 /// 1905 /// By default, performs semantic analysis to build the new OpenMP clause. 1906 /// Subclasses may override this routine to provide different behavior. 1907 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1908 SourceLocation StartLoc, 1909 SourceLocation LParenLoc, 1910 SourceLocation EndLoc) { 1911 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc, 1912 EndLoc); 1913 } 1914 1915 /// Build a new OpenMP 'is_device_ptr' clause. 1916 /// 1917 /// By default, performs semantic analysis to build the new OpenMP clause. 1918 /// Subclasses may override this routine to provide different behavior. 1919 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1920 SourceLocation StartLoc, 1921 SourceLocation LParenLoc, 1922 SourceLocation EndLoc) { 1923 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc, 1924 EndLoc); 1925 } 1926 1927 /// \brief Rebuild the operand to an Objective-C \@synchronized statement. 1928 /// 1929 /// By default, performs semantic analysis to build the new statement. 1930 /// Subclasses may override this routine to provide different behavior. 1931 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1932 Expr *object) { 1933 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1934 } 1935 1936 /// \brief Build a new Objective-C \@synchronized statement. 1937 /// 1938 /// By default, performs semantic analysis to build the new statement. 1939 /// Subclasses may override this routine to provide different behavior. 1940 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1941 Expr *Object, Stmt *Body) { 1942 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1943 } 1944 1945 /// \brief Build a new Objective-C \@autoreleasepool statement. 1946 /// 1947 /// By default, performs semantic analysis to build the new statement. 1948 /// Subclasses may override this routine to provide different behavior. 1949 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1950 Stmt *Body) { 1951 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1952 } 1953 1954 /// \brief Build a new Objective-C fast enumeration statement. 1955 /// 1956 /// By default, performs semantic analysis to build the new statement. 1957 /// Subclasses may override this routine to provide different behavior. 1958 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1959 Stmt *Element, 1960 Expr *Collection, 1961 SourceLocation RParenLoc, 1962 Stmt *Body) { 1963 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1964 Element, 1965 Collection, 1966 RParenLoc); 1967 if (ForEachStmt.isInvalid()) 1968 return StmtError(); 1969 1970 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1971 } 1972 1973 /// \brief Build a new C++ exception declaration. 1974 /// 1975 /// By default, performs semantic analysis to build the new decaration. 1976 /// Subclasses may override this routine to provide different behavior. 1977 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1978 TypeSourceInfo *Declarator, 1979 SourceLocation StartLoc, 1980 SourceLocation IdLoc, 1981 IdentifierInfo *Id) { 1982 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1983 StartLoc, IdLoc, Id); 1984 if (Var) 1985 getSema().CurContext->addDecl(Var); 1986 return Var; 1987 } 1988 1989 /// \brief Build a new C++ catch statement. 1990 /// 1991 /// By default, performs semantic analysis to build the new statement. 1992 /// Subclasses may override this routine to provide different behavior. 1993 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1994 VarDecl *ExceptionDecl, 1995 Stmt *Handler) { 1996 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1997 Handler)); 1998 } 1999 2000 /// \brief Build a new C++ try statement. 2001 /// 2002 /// By default, performs semantic analysis to build the new statement. 2003 /// Subclasses may override this routine to provide different behavior. 2004 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2005 ArrayRef<Stmt *> Handlers) { 2006 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2007 } 2008 2009 /// \brief Build a new C++0x range-based for statement. 2010 /// 2011 /// By default, performs semantic analysis to build the new statement. 2012 /// Subclasses may override this routine to provide different behavior. 2013 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2014 SourceLocation CoawaitLoc, 2015 SourceLocation ColonLoc, 2016 Stmt *Range, Stmt *Begin, Stmt *End, 2017 Expr *Cond, Expr *Inc, 2018 Stmt *LoopVar, 2019 SourceLocation RParenLoc) { 2020 // If we've just learned that the range is actually an Objective-C 2021 // collection, treat this as an Objective-C fast enumeration loop. 2022 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2023 if (RangeStmt->isSingleDecl()) { 2024 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2025 if (RangeVar->isInvalidDecl()) 2026 return StmtError(); 2027 2028 Expr *RangeExpr = RangeVar->getInit(); 2029 if (!RangeExpr->isTypeDependent() && 2030 RangeExpr->getType()->isObjCObjectPointerType()) 2031 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 2032 RParenLoc); 2033 } 2034 } 2035 } 2036 2037 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc, 2038 Range, Begin, End, 2039 Cond, Inc, LoopVar, RParenLoc, 2040 Sema::BFRK_Rebuild); 2041 } 2042 2043 /// \brief Build a new C++0x range-based for statement. 2044 /// 2045 /// By default, performs semantic analysis to build the new statement. 2046 /// Subclasses may override this routine to provide different behavior. 2047 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2048 bool IsIfExists, 2049 NestedNameSpecifierLoc QualifierLoc, 2050 DeclarationNameInfo NameInfo, 2051 Stmt *Nested) { 2052 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2053 QualifierLoc, NameInfo, Nested); 2054 } 2055 2056 /// \brief Attach body to a C++0x range-based for statement. 2057 /// 2058 /// By default, performs semantic analysis to finish the new statement. 2059 /// Subclasses may override this routine to provide different behavior. 2060 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2061 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2062 } 2063 2064 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2065 Stmt *TryBlock, Stmt *Handler) { 2066 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2067 } 2068 2069 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2070 Stmt *Block) { 2071 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2072 } 2073 2074 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2075 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2076 } 2077 2078 /// \brief Build a new predefined expression. 2079 /// 2080 /// By default, performs semantic analysis to build the new expression. 2081 /// Subclasses may override this routine to provide different behavior. 2082 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2083 PredefinedExpr::IdentType IT) { 2084 return getSema().BuildPredefinedExpr(Loc, IT); 2085 } 2086 2087 /// \brief Build a new expression that references a declaration. 2088 /// 2089 /// By default, performs semantic analysis to build the new expression. 2090 /// Subclasses may override this routine to provide different behavior. 2091 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2092 LookupResult &R, 2093 bool RequiresADL) { 2094 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2095 } 2096 2097 2098 /// \brief Build a new expression that references a declaration. 2099 /// 2100 /// By default, performs semantic analysis to build the new expression. 2101 /// Subclasses may override this routine to provide different behavior. 2102 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2103 ValueDecl *VD, 2104 const DeclarationNameInfo &NameInfo, 2105 TemplateArgumentListInfo *TemplateArgs) { 2106 CXXScopeSpec SS; 2107 SS.Adopt(QualifierLoc); 2108 2109 // FIXME: loses template args. 2110 2111 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2112 } 2113 2114 /// \brief Build a new expression in parentheses. 2115 /// 2116 /// By default, performs semantic analysis to build the new expression. 2117 /// Subclasses may override this routine to provide different behavior. 2118 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2119 SourceLocation RParen) { 2120 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2121 } 2122 2123 /// \brief Build a new pseudo-destructor expression. 2124 /// 2125 /// By default, performs semantic analysis to build the new expression. 2126 /// Subclasses may override this routine to provide different behavior. 2127 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2128 SourceLocation OperatorLoc, 2129 bool isArrow, 2130 CXXScopeSpec &SS, 2131 TypeSourceInfo *ScopeType, 2132 SourceLocation CCLoc, 2133 SourceLocation TildeLoc, 2134 PseudoDestructorTypeStorage Destroyed); 2135 2136 /// \brief Build a new unary operator expression. 2137 /// 2138 /// By default, performs semantic analysis to build the new expression. 2139 /// Subclasses may override this routine to provide different behavior. 2140 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2141 UnaryOperatorKind Opc, 2142 Expr *SubExpr) { 2143 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2144 } 2145 2146 /// \brief Build a new builtin offsetof expression. 2147 /// 2148 /// By default, performs semantic analysis to build the new expression. 2149 /// Subclasses may override this routine to provide different behavior. 2150 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2151 TypeSourceInfo *Type, 2152 ArrayRef<Sema::OffsetOfComponent> Components, 2153 SourceLocation RParenLoc) { 2154 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2155 RParenLoc); 2156 } 2157 2158 /// \brief Build a new sizeof, alignof or vec_step expression with a 2159 /// type argument. 2160 /// 2161 /// By default, performs semantic analysis to build the new expression. 2162 /// Subclasses may override this routine to provide different behavior. 2163 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2164 SourceLocation OpLoc, 2165 UnaryExprOrTypeTrait ExprKind, 2166 SourceRange R) { 2167 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2168 } 2169 2170 /// \brief Build a new sizeof, alignof or vec step expression with an 2171 /// expression argument. 2172 /// 2173 /// By default, performs semantic analysis to build the new expression. 2174 /// Subclasses may override this routine to provide different behavior. 2175 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2176 UnaryExprOrTypeTrait ExprKind, 2177 SourceRange R) { 2178 ExprResult Result 2179 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2180 if (Result.isInvalid()) 2181 return ExprError(); 2182 2183 return Result; 2184 } 2185 2186 /// \brief Build a new array subscript expression. 2187 /// 2188 /// By default, performs semantic analysis to build the new expression. 2189 /// Subclasses may override this routine to provide different behavior. 2190 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2191 SourceLocation LBracketLoc, 2192 Expr *RHS, 2193 SourceLocation RBracketLoc) { 2194 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2195 LBracketLoc, RHS, 2196 RBracketLoc); 2197 } 2198 2199 /// \brief Build a new array section expression. 2200 /// 2201 /// By default, performs semantic analysis to build the new expression. 2202 /// Subclasses may override this routine to provide different behavior. 2203 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2204 Expr *LowerBound, 2205 SourceLocation ColonLoc, Expr *Length, 2206 SourceLocation RBracketLoc) { 2207 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2208 ColonLoc, Length, RBracketLoc); 2209 } 2210 2211 /// \brief Build a new call expression. 2212 /// 2213 /// By default, performs semantic analysis to build the new expression. 2214 /// Subclasses may override this routine to provide different behavior. 2215 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2216 MultiExprArg Args, 2217 SourceLocation RParenLoc, 2218 Expr *ExecConfig = nullptr) { 2219 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2220 Args, RParenLoc, ExecConfig); 2221 } 2222 2223 /// \brief Build a new member access expression. 2224 /// 2225 /// By default, performs semantic analysis to build the new expression. 2226 /// Subclasses may override this routine to provide different behavior. 2227 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2228 bool isArrow, 2229 NestedNameSpecifierLoc QualifierLoc, 2230 SourceLocation TemplateKWLoc, 2231 const DeclarationNameInfo &MemberNameInfo, 2232 ValueDecl *Member, 2233 NamedDecl *FoundDecl, 2234 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2235 NamedDecl *FirstQualifierInScope) { 2236 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2237 isArrow); 2238 if (!Member->getDeclName()) { 2239 // We have a reference to an unnamed field. This is always the 2240 // base of an anonymous struct/union member access, i.e. the 2241 // field is always of record type. 2242 assert(Member->getType()->isRecordType() && 2243 "unnamed member not of record type?"); 2244 2245 BaseResult = 2246 getSema().PerformObjectMemberConversion(BaseResult.get(), 2247 QualifierLoc.getNestedNameSpecifier(), 2248 FoundDecl, Member); 2249 if (BaseResult.isInvalid()) 2250 return ExprError(); 2251 Base = BaseResult.get(); 2252 2253 CXXScopeSpec EmptySS; 2254 return getSema().BuildFieldReferenceExpr( 2255 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2256 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2257 } 2258 2259 CXXScopeSpec SS; 2260 SS.Adopt(QualifierLoc); 2261 2262 Base = BaseResult.get(); 2263 QualType BaseType = Base->getType(); 2264 2265 if (isArrow && !BaseType->isPointerType()) 2266 return ExprError(); 2267 2268 // FIXME: this involves duplicating earlier analysis in a lot of 2269 // cases; we should avoid this when possible. 2270 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2271 R.addDecl(FoundDecl); 2272 R.resolveKind(); 2273 2274 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2275 SS, TemplateKWLoc, 2276 FirstQualifierInScope, 2277 R, ExplicitTemplateArgs, 2278 /*S*/nullptr); 2279 } 2280 2281 /// \brief Build a new binary operator expression. 2282 /// 2283 /// By default, performs semantic analysis to build the new expression. 2284 /// Subclasses may override this routine to provide different behavior. 2285 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2286 BinaryOperatorKind Opc, 2287 Expr *LHS, Expr *RHS) { 2288 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2289 } 2290 2291 /// \brief Build a new conditional operator expression. 2292 /// 2293 /// By default, performs semantic analysis to build the new expression. 2294 /// Subclasses may override this routine to provide different behavior. 2295 ExprResult RebuildConditionalOperator(Expr *Cond, 2296 SourceLocation QuestionLoc, 2297 Expr *LHS, 2298 SourceLocation ColonLoc, 2299 Expr *RHS) { 2300 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2301 LHS, RHS); 2302 } 2303 2304 /// \brief Build a new C-style cast expression. 2305 /// 2306 /// By default, performs semantic analysis to build the new expression. 2307 /// Subclasses may override this routine to provide different behavior. 2308 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2309 TypeSourceInfo *TInfo, 2310 SourceLocation RParenLoc, 2311 Expr *SubExpr) { 2312 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2313 SubExpr); 2314 } 2315 2316 /// \brief Build a new compound literal expression. 2317 /// 2318 /// By default, performs semantic analysis to build the new expression. 2319 /// Subclasses may override this routine to provide different behavior. 2320 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2321 TypeSourceInfo *TInfo, 2322 SourceLocation RParenLoc, 2323 Expr *Init) { 2324 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2325 Init); 2326 } 2327 2328 /// \brief Build a new extended vector element access expression. 2329 /// 2330 /// By default, performs semantic analysis to build the new expression. 2331 /// Subclasses may override this routine to provide different behavior. 2332 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2333 SourceLocation OpLoc, 2334 SourceLocation AccessorLoc, 2335 IdentifierInfo &Accessor) { 2336 2337 CXXScopeSpec SS; 2338 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2339 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2340 OpLoc, /*IsArrow*/ false, 2341 SS, SourceLocation(), 2342 /*FirstQualifierInScope*/ nullptr, 2343 NameInfo, 2344 /* TemplateArgs */ nullptr, 2345 /*S*/ nullptr); 2346 } 2347 2348 /// \brief Build a new initializer list expression. 2349 /// 2350 /// By default, performs semantic analysis to build the new expression. 2351 /// Subclasses may override this routine to provide different behavior. 2352 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2353 MultiExprArg Inits, 2354 SourceLocation RBraceLoc) { 2355 return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2356 } 2357 2358 /// \brief Build a new designated initializer expression. 2359 /// 2360 /// By default, performs semantic analysis to build the new expression. 2361 /// Subclasses may override this routine to provide different behavior. 2362 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2363 MultiExprArg ArrayExprs, 2364 SourceLocation EqualOrColonLoc, 2365 bool GNUSyntax, 2366 Expr *Init) { 2367 ExprResult Result 2368 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2369 Init); 2370 if (Result.isInvalid()) 2371 return ExprError(); 2372 2373 return Result; 2374 } 2375 2376 /// \brief Build a new value-initialized expression. 2377 /// 2378 /// By default, builds the implicit value initialization without performing 2379 /// any semantic analysis. Subclasses may override this routine to provide 2380 /// different behavior. 2381 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2382 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2383 } 2384 2385 /// \brief Build a new \c va_arg expression. 2386 /// 2387 /// By default, performs semantic analysis to build the new expression. 2388 /// Subclasses may override this routine to provide different behavior. 2389 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2390 Expr *SubExpr, TypeSourceInfo *TInfo, 2391 SourceLocation RParenLoc) { 2392 return getSema().BuildVAArgExpr(BuiltinLoc, 2393 SubExpr, TInfo, 2394 RParenLoc); 2395 } 2396 2397 /// \brief Build a new expression list in parentheses. 2398 /// 2399 /// By default, performs semantic analysis to build the new expression. 2400 /// Subclasses may override this routine to provide different behavior. 2401 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2402 MultiExprArg SubExprs, 2403 SourceLocation RParenLoc) { 2404 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2405 } 2406 2407 /// \brief Build a new address-of-label expression. 2408 /// 2409 /// By default, performs semantic analysis, using the name of the label 2410 /// rather than attempting to map the label statement itself. 2411 /// Subclasses may override this routine to provide different behavior. 2412 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2413 SourceLocation LabelLoc, LabelDecl *Label) { 2414 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2415 } 2416 2417 /// \brief Build a new GNU statement expression. 2418 /// 2419 /// By default, performs semantic analysis to build the new expression. 2420 /// Subclasses may override this routine to provide different behavior. 2421 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2422 Stmt *SubStmt, 2423 SourceLocation RParenLoc) { 2424 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2425 } 2426 2427 /// \brief Build a new __builtin_choose_expr expression. 2428 /// 2429 /// By default, performs semantic analysis to build the new expression. 2430 /// Subclasses may override this routine to provide different behavior. 2431 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2432 Expr *Cond, Expr *LHS, Expr *RHS, 2433 SourceLocation RParenLoc) { 2434 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2435 Cond, LHS, RHS, 2436 RParenLoc); 2437 } 2438 2439 /// \brief Build a new generic selection expression. 2440 /// 2441 /// By default, performs semantic analysis to build the new expression. 2442 /// Subclasses may override this routine to provide different behavior. 2443 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2444 SourceLocation DefaultLoc, 2445 SourceLocation RParenLoc, 2446 Expr *ControllingExpr, 2447 ArrayRef<TypeSourceInfo *> Types, 2448 ArrayRef<Expr *> Exprs) { 2449 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2450 ControllingExpr, Types, Exprs); 2451 } 2452 2453 /// \brief Build a new overloaded operator call expression. 2454 /// 2455 /// By default, performs semantic analysis to build the new expression. 2456 /// The semantic analysis provides the behavior of template instantiation, 2457 /// copying with transformations that turn what looks like an overloaded 2458 /// operator call into a use of a builtin operator, performing 2459 /// argument-dependent lookup, etc. Subclasses may override this routine to 2460 /// provide different behavior. 2461 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2462 SourceLocation OpLoc, 2463 Expr *Callee, 2464 Expr *First, 2465 Expr *Second); 2466 2467 /// \brief Build a new C++ "named" cast expression, such as static_cast or 2468 /// reinterpret_cast. 2469 /// 2470 /// By default, this routine dispatches to one of the more-specific routines 2471 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2472 /// Subclasses may override this routine to provide different behavior. 2473 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2474 Stmt::StmtClass Class, 2475 SourceLocation LAngleLoc, 2476 TypeSourceInfo *TInfo, 2477 SourceLocation RAngleLoc, 2478 SourceLocation LParenLoc, 2479 Expr *SubExpr, 2480 SourceLocation RParenLoc) { 2481 switch (Class) { 2482 case Stmt::CXXStaticCastExprClass: 2483 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2484 RAngleLoc, LParenLoc, 2485 SubExpr, RParenLoc); 2486 2487 case Stmt::CXXDynamicCastExprClass: 2488 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2489 RAngleLoc, LParenLoc, 2490 SubExpr, RParenLoc); 2491 2492 case Stmt::CXXReinterpretCastExprClass: 2493 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2494 RAngleLoc, LParenLoc, 2495 SubExpr, 2496 RParenLoc); 2497 2498 case Stmt::CXXConstCastExprClass: 2499 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2500 RAngleLoc, LParenLoc, 2501 SubExpr, RParenLoc); 2502 2503 default: 2504 llvm_unreachable("Invalid C++ named cast"); 2505 } 2506 } 2507 2508 /// \brief Build a new C++ static_cast expression. 2509 /// 2510 /// By default, performs semantic analysis to build the new expression. 2511 /// Subclasses may override this routine to provide different behavior. 2512 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2513 SourceLocation LAngleLoc, 2514 TypeSourceInfo *TInfo, 2515 SourceLocation RAngleLoc, 2516 SourceLocation LParenLoc, 2517 Expr *SubExpr, 2518 SourceLocation RParenLoc) { 2519 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2520 TInfo, SubExpr, 2521 SourceRange(LAngleLoc, RAngleLoc), 2522 SourceRange(LParenLoc, RParenLoc)); 2523 } 2524 2525 /// \brief Build a new C++ dynamic_cast expression. 2526 /// 2527 /// By default, performs semantic analysis to build the new expression. 2528 /// Subclasses may override this routine to provide different behavior. 2529 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2530 SourceLocation LAngleLoc, 2531 TypeSourceInfo *TInfo, 2532 SourceLocation RAngleLoc, 2533 SourceLocation LParenLoc, 2534 Expr *SubExpr, 2535 SourceLocation RParenLoc) { 2536 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2537 TInfo, SubExpr, 2538 SourceRange(LAngleLoc, RAngleLoc), 2539 SourceRange(LParenLoc, RParenLoc)); 2540 } 2541 2542 /// \brief Build a new C++ reinterpret_cast expression. 2543 /// 2544 /// By default, performs semantic analysis to build the new expression. 2545 /// Subclasses may override this routine to provide different behavior. 2546 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2547 SourceLocation LAngleLoc, 2548 TypeSourceInfo *TInfo, 2549 SourceLocation RAngleLoc, 2550 SourceLocation LParenLoc, 2551 Expr *SubExpr, 2552 SourceLocation RParenLoc) { 2553 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2554 TInfo, SubExpr, 2555 SourceRange(LAngleLoc, RAngleLoc), 2556 SourceRange(LParenLoc, RParenLoc)); 2557 } 2558 2559 /// \brief Build a new C++ const_cast expression. 2560 /// 2561 /// By default, performs semantic analysis to build the new expression. 2562 /// Subclasses may override this routine to provide different behavior. 2563 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2564 SourceLocation LAngleLoc, 2565 TypeSourceInfo *TInfo, 2566 SourceLocation RAngleLoc, 2567 SourceLocation LParenLoc, 2568 Expr *SubExpr, 2569 SourceLocation RParenLoc) { 2570 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2571 TInfo, SubExpr, 2572 SourceRange(LAngleLoc, RAngleLoc), 2573 SourceRange(LParenLoc, RParenLoc)); 2574 } 2575 2576 /// \brief Build a new C++ functional-style cast expression. 2577 /// 2578 /// By default, performs semantic analysis to build the new expression. 2579 /// Subclasses may override this routine to provide different behavior. 2580 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2581 SourceLocation LParenLoc, 2582 Expr *Sub, 2583 SourceLocation RParenLoc, 2584 bool ListInitialization) { 2585 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2586 MultiExprArg(&Sub, 1), RParenLoc, 2587 ListInitialization); 2588 } 2589 2590 /// \brief Build a new C++ typeid(type) expression. 2591 /// 2592 /// By default, performs semantic analysis to build the new expression. 2593 /// Subclasses may override this routine to provide different behavior. 2594 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2595 SourceLocation TypeidLoc, 2596 TypeSourceInfo *Operand, 2597 SourceLocation RParenLoc) { 2598 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2599 RParenLoc); 2600 } 2601 2602 2603 /// \brief Build a new C++ typeid(expr) expression. 2604 /// 2605 /// By default, performs semantic analysis to build the new expression. 2606 /// Subclasses may override this routine to provide different behavior. 2607 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2608 SourceLocation TypeidLoc, 2609 Expr *Operand, 2610 SourceLocation RParenLoc) { 2611 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2612 RParenLoc); 2613 } 2614 2615 /// \brief Build a new C++ __uuidof(type) expression. 2616 /// 2617 /// By default, performs semantic analysis to build the new expression. 2618 /// Subclasses may override this routine to provide different behavior. 2619 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2620 SourceLocation TypeidLoc, 2621 TypeSourceInfo *Operand, 2622 SourceLocation RParenLoc) { 2623 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2624 RParenLoc); 2625 } 2626 2627 /// \brief Build a new C++ __uuidof(expr) expression. 2628 /// 2629 /// By default, performs semantic analysis to build the new expression. 2630 /// Subclasses may override this routine to provide different behavior. 2631 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2632 SourceLocation TypeidLoc, 2633 Expr *Operand, 2634 SourceLocation RParenLoc) { 2635 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2636 RParenLoc); 2637 } 2638 2639 /// \brief Build a new C++ "this" expression. 2640 /// 2641 /// By default, builds a new "this" expression without performing any 2642 /// semantic analysis. Subclasses may override this routine to provide 2643 /// different behavior. 2644 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2645 QualType ThisType, 2646 bool isImplicit) { 2647 getSema().CheckCXXThisCapture(ThisLoc); 2648 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2649 } 2650 2651 /// \brief Build a new C++ throw expression. 2652 /// 2653 /// By default, performs semantic analysis to build the new expression. 2654 /// Subclasses may override this routine to provide different behavior. 2655 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2656 bool IsThrownVariableInScope) { 2657 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2658 } 2659 2660 /// \brief Build a new C++ default-argument expression. 2661 /// 2662 /// By default, builds a new default-argument expression, which does not 2663 /// require any semantic analysis. Subclasses may override this routine to 2664 /// provide different behavior. 2665 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2666 ParmVarDecl *Param) { 2667 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2668 } 2669 2670 /// \brief Build a new C++11 default-initialization expression. 2671 /// 2672 /// By default, builds a new default field initialization expression, which 2673 /// does not require any semantic analysis. Subclasses may override this 2674 /// routine to provide different behavior. 2675 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2676 FieldDecl *Field) { 2677 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2678 } 2679 2680 /// \brief Build a new C++ zero-initialization expression. 2681 /// 2682 /// By default, performs semantic analysis to build the new expression. 2683 /// Subclasses may override this routine to provide different behavior. 2684 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2685 SourceLocation LParenLoc, 2686 SourceLocation RParenLoc) { 2687 return getSema().BuildCXXTypeConstructExpr( 2688 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2689 } 2690 2691 /// \brief Build a new C++ "new" expression. 2692 /// 2693 /// By default, performs semantic analysis to build the new expression. 2694 /// Subclasses may override this routine to provide different behavior. 2695 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2696 bool UseGlobal, 2697 SourceLocation PlacementLParen, 2698 MultiExprArg PlacementArgs, 2699 SourceLocation PlacementRParen, 2700 SourceRange TypeIdParens, 2701 QualType AllocatedType, 2702 TypeSourceInfo *AllocatedTypeInfo, 2703 Expr *ArraySize, 2704 SourceRange DirectInitRange, 2705 Expr *Initializer) { 2706 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2707 PlacementLParen, 2708 PlacementArgs, 2709 PlacementRParen, 2710 TypeIdParens, 2711 AllocatedType, 2712 AllocatedTypeInfo, 2713 ArraySize, 2714 DirectInitRange, 2715 Initializer); 2716 } 2717 2718 /// \brief Build a new C++ "delete" expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2723 bool IsGlobalDelete, 2724 bool IsArrayForm, 2725 Expr *Operand) { 2726 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2727 Operand); 2728 } 2729 2730 /// \brief Build a new type trait expression. 2731 /// 2732 /// By default, performs semantic analysis to build the new expression. 2733 /// Subclasses may override this routine to provide different behavior. 2734 ExprResult RebuildTypeTrait(TypeTrait Trait, 2735 SourceLocation StartLoc, 2736 ArrayRef<TypeSourceInfo *> Args, 2737 SourceLocation RParenLoc) { 2738 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2739 } 2740 2741 /// \brief Build a new array type trait expression. 2742 /// 2743 /// By default, performs semantic analysis to build the new expression. 2744 /// Subclasses may override this routine to provide different behavior. 2745 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2746 SourceLocation StartLoc, 2747 TypeSourceInfo *TSInfo, 2748 Expr *DimExpr, 2749 SourceLocation RParenLoc) { 2750 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2751 } 2752 2753 /// \brief Build a new expression trait expression. 2754 /// 2755 /// By default, performs semantic analysis to build the new expression. 2756 /// Subclasses may override this routine to provide different behavior. 2757 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2758 SourceLocation StartLoc, 2759 Expr *Queried, 2760 SourceLocation RParenLoc) { 2761 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2762 } 2763 2764 /// \brief Build a new (previously unresolved) declaration reference 2765 /// expression. 2766 /// 2767 /// By default, performs semantic analysis to build the new expression. 2768 /// Subclasses may override this routine to provide different behavior. 2769 ExprResult RebuildDependentScopeDeclRefExpr( 2770 NestedNameSpecifierLoc QualifierLoc, 2771 SourceLocation TemplateKWLoc, 2772 const DeclarationNameInfo &NameInfo, 2773 const TemplateArgumentListInfo *TemplateArgs, 2774 bool IsAddressOfOperand, 2775 TypeSourceInfo **RecoveryTSI) { 2776 CXXScopeSpec SS; 2777 SS.Adopt(QualifierLoc); 2778 2779 if (TemplateArgs || TemplateKWLoc.isValid()) 2780 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2781 TemplateArgs); 2782 2783 return getSema().BuildQualifiedDeclarationNameExpr( 2784 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2785 } 2786 2787 /// \brief Build a new template-id expression. 2788 /// 2789 /// By default, performs semantic analysis to build the new expression. 2790 /// Subclasses may override this routine to provide different behavior. 2791 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2792 SourceLocation TemplateKWLoc, 2793 LookupResult &R, 2794 bool RequiresADL, 2795 const TemplateArgumentListInfo *TemplateArgs) { 2796 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2797 TemplateArgs); 2798 } 2799 2800 /// \brief Build a new object-construction expression. 2801 /// 2802 /// By default, performs semantic analysis to build the new expression. 2803 /// Subclasses may override this routine to provide different behavior. 2804 ExprResult RebuildCXXConstructExpr(QualType T, 2805 SourceLocation Loc, 2806 CXXConstructorDecl *Constructor, 2807 bool IsElidable, 2808 MultiExprArg Args, 2809 bool HadMultipleCandidates, 2810 bool ListInitialization, 2811 bool StdInitListInitialization, 2812 bool RequiresZeroInit, 2813 CXXConstructExpr::ConstructionKind ConstructKind, 2814 SourceRange ParenRange) { 2815 SmallVector<Expr*, 8> ConvertedArgs; 2816 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2817 ConvertedArgs)) 2818 return ExprError(); 2819 2820 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2821 IsElidable, 2822 ConvertedArgs, 2823 HadMultipleCandidates, 2824 ListInitialization, 2825 StdInitListInitialization, 2826 RequiresZeroInit, ConstructKind, 2827 ParenRange); 2828 } 2829 2830 /// \brief Build a new implicit construction via inherited constructor 2831 /// expression. 2832 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2833 CXXConstructorDecl *Constructor, 2834 bool ConstructsVBase, 2835 bool InheritedFromVBase) { 2836 return new (getSema().Context) CXXInheritedCtorInitExpr( 2837 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2838 } 2839 2840 /// \brief Build a new object-construction expression. 2841 /// 2842 /// By default, performs semantic analysis to build the new expression. 2843 /// Subclasses may override this routine to provide different behavior. 2844 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2845 SourceLocation LParenOrBraceLoc, 2846 MultiExprArg Args, 2847 SourceLocation RParenOrBraceLoc, 2848 bool ListInitialization) { 2849 return getSema().BuildCXXTypeConstructExpr( 2850 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2851 } 2852 2853 /// \brief Build a new object-construction expression. 2854 /// 2855 /// By default, performs semantic analysis to build the new expression. 2856 /// Subclasses may override this routine to provide different behavior. 2857 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2858 SourceLocation LParenLoc, 2859 MultiExprArg Args, 2860 SourceLocation RParenLoc, 2861 bool ListInitialization) { 2862 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2863 RParenLoc, ListInitialization); 2864 } 2865 2866 /// \brief Build a new member reference expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2871 QualType BaseType, 2872 bool IsArrow, 2873 SourceLocation OperatorLoc, 2874 NestedNameSpecifierLoc QualifierLoc, 2875 SourceLocation TemplateKWLoc, 2876 NamedDecl *FirstQualifierInScope, 2877 const DeclarationNameInfo &MemberNameInfo, 2878 const TemplateArgumentListInfo *TemplateArgs) { 2879 CXXScopeSpec SS; 2880 SS.Adopt(QualifierLoc); 2881 2882 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2883 OperatorLoc, IsArrow, 2884 SS, TemplateKWLoc, 2885 FirstQualifierInScope, 2886 MemberNameInfo, 2887 TemplateArgs, /*S*/nullptr); 2888 } 2889 2890 /// \brief Build a new member reference expression. 2891 /// 2892 /// By default, performs semantic analysis to build the new expression. 2893 /// Subclasses may override this routine to provide different behavior. 2894 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2895 SourceLocation OperatorLoc, 2896 bool IsArrow, 2897 NestedNameSpecifierLoc QualifierLoc, 2898 SourceLocation TemplateKWLoc, 2899 NamedDecl *FirstQualifierInScope, 2900 LookupResult &R, 2901 const TemplateArgumentListInfo *TemplateArgs) { 2902 CXXScopeSpec SS; 2903 SS.Adopt(QualifierLoc); 2904 2905 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2906 OperatorLoc, IsArrow, 2907 SS, TemplateKWLoc, 2908 FirstQualifierInScope, 2909 R, TemplateArgs, /*S*/nullptr); 2910 } 2911 2912 /// \brief Build a new noexcept expression. 2913 /// 2914 /// By default, performs semantic analysis to build the new expression. 2915 /// Subclasses may override this routine to provide different behavior. 2916 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2917 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2918 } 2919 2920 /// \brief Build a new expression to compute the length of a parameter pack. 2921 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2922 NamedDecl *Pack, 2923 SourceLocation PackLoc, 2924 SourceLocation RParenLoc, 2925 Optional<unsigned> Length, 2926 ArrayRef<TemplateArgument> PartialArgs) { 2927 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2928 RParenLoc, Length, PartialArgs); 2929 } 2930 2931 /// \brief Build a new Objective-C boxed expression. 2932 /// 2933 /// By default, performs semantic analysis to build the new expression. 2934 /// Subclasses may override this routine to provide different behavior. 2935 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2936 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2937 } 2938 2939 /// \brief Build a new Objective-C array literal. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2944 Expr **Elements, unsigned NumElements) { 2945 return getSema().BuildObjCArrayLiteral(Range, 2946 MultiExprArg(Elements, NumElements)); 2947 } 2948 2949 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2950 Expr *Base, Expr *Key, 2951 ObjCMethodDecl *getterMethod, 2952 ObjCMethodDecl *setterMethod) { 2953 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2954 getterMethod, setterMethod); 2955 } 2956 2957 /// \brief Build a new Objective-C dictionary literal. 2958 /// 2959 /// By default, performs semantic analysis to build the new expression. 2960 /// Subclasses may override this routine to provide different behavior. 2961 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2962 MutableArrayRef<ObjCDictionaryElement> Elements) { 2963 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2964 } 2965 2966 /// \brief Build a new Objective-C \@encode expression. 2967 /// 2968 /// By default, performs semantic analysis to build the new expression. 2969 /// Subclasses may override this routine to provide different behavior. 2970 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2971 TypeSourceInfo *EncodeTypeInfo, 2972 SourceLocation RParenLoc) { 2973 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2974 } 2975 2976 /// \brief Build a new Objective-C class message. 2977 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2978 Selector Sel, 2979 ArrayRef<SourceLocation> SelectorLocs, 2980 ObjCMethodDecl *Method, 2981 SourceLocation LBracLoc, 2982 MultiExprArg Args, 2983 SourceLocation RBracLoc) { 2984 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2985 ReceiverTypeInfo->getType(), 2986 /*SuperLoc=*/SourceLocation(), 2987 Sel, Method, LBracLoc, SelectorLocs, 2988 RBracLoc, Args); 2989 } 2990 2991 /// \brief Build a new Objective-C instance message. 2992 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2993 Selector Sel, 2994 ArrayRef<SourceLocation> SelectorLocs, 2995 ObjCMethodDecl *Method, 2996 SourceLocation LBracLoc, 2997 MultiExprArg Args, 2998 SourceLocation RBracLoc) { 2999 return SemaRef.BuildInstanceMessage(Receiver, 3000 Receiver->getType(), 3001 /*SuperLoc=*/SourceLocation(), 3002 Sel, Method, LBracLoc, SelectorLocs, 3003 RBracLoc, Args); 3004 } 3005 3006 /// \brief Build a new Objective-C instance/class message to 'super'. 3007 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3008 Selector Sel, 3009 ArrayRef<SourceLocation> SelectorLocs, 3010 QualType SuperType, 3011 ObjCMethodDecl *Method, 3012 SourceLocation LBracLoc, 3013 MultiExprArg Args, 3014 SourceLocation RBracLoc) { 3015 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3016 SuperType, 3017 SuperLoc, 3018 Sel, Method, LBracLoc, SelectorLocs, 3019 RBracLoc, Args) 3020 : SemaRef.BuildClassMessage(nullptr, 3021 SuperType, 3022 SuperLoc, 3023 Sel, Method, LBracLoc, SelectorLocs, 3024 RBracLoc, Args); 3025 3026 3027 } 3028 3029 /// \brief Build a new Objective-C ivar reference expression. 3030 /// 3031 /// By default, performs semantic analysis to build the new expression. 3032 /// Subclasses may override this routine to provide different behavior. 3033 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3034 SourceLocation IvarLoc, 3035 bool IsArrow, bool IsFreeIvar) { 3036 CXXScopeSpec SS; 3037 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3038 ExprResult Result = getSema().BuildMemberReferenceExpr( 3039 BaseArg, BaseArg->getType(), 3040 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3041 /*FirstQualifierInScope=*/nullptr, NameInfo, 3042 /*TemplateArgs=*/nullptr, 3043 /*S=*/nullptr); 3044 if (IsFreeIvar && Result.isUsable()) 3045 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3046 return Result; 3047 } 3048 3049 /// \brief Build a new Objective-C property reference expression. 3050 /// 3051 /// By default, performs semantic analysis to build the new expression. 3052 /// Subclasses may override this routine to provide different behavior. 3053 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3054 ObjCPropertyDecl *Property, 3055 SourceLocation PropertyLoc) { 3056 CXXScopeSpec SS; 3057 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3058 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3059 /*FIXME:*/PropertyLoc, 3060 /*IsArrow=*/false, 3061 SS, SourceLocation(), 3062 /*FirstQualifierInScope=*/nullptr, 3063 NameInfo, 3064 /*TemplateArgs=*/nullptr, 3065 /*S=*/nullptr); 3066 } 3067 3068 /// \brief Build a new Objective-C property reference expression. 3069 /// 3070 /// By default, performs semantic analysis to build the new expression. 3071 /// Subclasses may override this routine to provide different behavior. 3072 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3073 ObjCMethodDecl *Getter, 3074 ObjCMethodDecl *Setter, 3075 SourceLocation PropertyLoc) { 3076 // Since these expressions can only be value-dependent, we do not 3077 // need to perform semantic analysis again. 3078 return Owned( 3079 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3080 VK_LValue, OK_ObjCProperty, 3081 PropertyLoc, Base)); 3082 } 3083 3084 /// \brief Build a new Objective-C "isa" expression. 3085 /// 3086 /// By default, performs semantic analysis to build the new expression. 3087 /// Subclasses may override this routine to provide different behavior. 3088 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3089 SourceLocation OpLoc, bool IsArrow) { 3090 CXXScopeSpec SS; 3091 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3092 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3093 OpLoc, IsArrow, 3094 SS, SourceLocation(), 3095 /*FirstQualifierInScope=*/nullptr, 3096 NameInfo, 3097 /*TemplateArgs=*/nullptr, 3098 /*S=*/nullptr); 3099 } 3100 3101 /// \brief Build a new shuffle vector expression. 3102 /// 3103 /// By default, performs semantic analysis to build the new expression. 3104 /// Subclasses may override this routine to provide different behavior. 3105 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3106 MultiExprArg SubExprs, 3107 SourceLocation RParenLoc) { 3108 // Find the declaration for __builtin_shufflevector 3109 const IdentifierInfo &Name 3110 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3111 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3112 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3113 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3114 3115 // Build a reference to the __builtin_shufflevector builtin 3116 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3117 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3118 SemaRef.Context.BuiltinFnTy, 3119 VK_RValue, BuiltinLoc); 3120 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3121 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3122 CK_BuiltinFnToFnPtr).get(); 3123 3124 // Build the CallExpr 3125 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3126 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3127 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3128 3129 // Type-check the __builtin_shufflevector expression. 3130 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3131 } 3132 3133 /// \brief Build a new convert vector expression. 3134 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3135 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3136 SourceLocation RParenLoc) { 3137 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3138 BuiltinLoc, RParenLoc); 3139 } 3140 3141 /// \brief Build a new template argument pack expansion. 3142 /// 3143 /// By default, performs semantic analysis to build a new pack expansion 3144 /// for a template argument. Subclasses may override this routine to provide 3145 /// different behavior. 3146 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3147 SourceLocation EllipsisLoc, 3148 Optional<unsigned> NumExpansions) { 3149 switch (Pattern.getArgument().getKind()) { 3150 case TemplateArgument::Expression: { 3151 ExprResult Result 3152 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3153 EllipsisLoc, NumExpansions); 3154 if (Result.isInvalid()) 3155 return TemplateArgumentLoc(); 3156 3157 return TemplateArgumentLoc(Result.get(), Result.get()); 3158 } 3159 3160 case TemplateArgument::Template: 3161 return TemplateArgumentLoc(TemplateArgument( 3162 Pattern.getArgument().getAsTemplate(), 3163 NumExpansions), 3164 Pattern.getTemplateQualifierLoc(), 3165 Pattern.getTemplateNameLoc(), 3166 EllipsisLoc); 3167 3168 case TemplateArgument::Null: 3169 case TemplateArgument::Integral: 3170 case TemplateArgument::Declaration: 3171 case TemplateArgument::Pack: 3172 case TemplateArgument::TemplateExpansion: 3173 case TemplateArgument::NullPtr: 3174 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3175 3176 case TemplateArgument::Type: 3177 if (TypeSourceInfo *Expansion 3178 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3179 EllipsisLoc, 3180 NumExpansions)) 3181 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3182 Expansion); 3183 break; 3184 } 3185 3186 return TemplateArgumentLoc(); 3187 } 3188 3189 /// \brief Build a new expression pack expansion. 3190 /// 3191 /// By default, performs semantic analysis to build a new pack expansion 3192 /// for an expression. Subclasses may override this routine to provide 3193 /// different behavior. 3194 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3195 Optional<unsigned> NumExpansions) { 3196 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3197 } 3198 3199 /// \brief Build a new C++1z fold-expression. 3200 /// 3201 /// By default, performs semantic analysis in order to build a new fold 3202 /// expression. 3203 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3204 BinaryOperatorKind Operator, 3205 SourceLocation EllipsisLoc, Expr *RHS, 3206 SourceLocation RParenLoc) { 3207 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3208 RHS, RParenLoc); 3209 } 3210 3211 /// \brief Build an empty C++1z fold-expression with the given operator. 3212 /// 3213 /// By default, produces the fallback value for the fold-expression, or 3214 /// produce an error if there is no fallback value. 3215 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3216 BinaryOperatorKind Operator) { 3217 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3218 } 3219 3220 /// \brief Build a new atomic operation expression. 3221 /// 3222 /// By default, performs semantic analysis to build the new expression. 3223 /// Subclasses may override this routine to provide different behavior. 3224 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3225 MultiExprArg SubExprs, 3226 QualType RetTy, 3227 AtomicExpr::AtomicOp Op, 3228 SourceLocation RParenLoc) { 3229 // Just create the expression; there is not any interesting semantic 3230 // analysis here because we can't actually build an AtomicExpr until 3231 // we are sure it is semantically sound. 3232 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3233 RParenLoc); 3234 } 3235 3236 private: 3237 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3238 QualType ObjectType, 3239 NamedDecl *FirstQualifierInScope, 3240 CXXScopeSpec &SS); 3241 3242 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3243 QualType ObjectType, 3244 NamedDecl *FirstQualifierInScope, 3245 CXXScopeSpec &SS); 3246 3247 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3248 NamedDecl *FirstQualifierInScope, 3249 CXXScopeSpec &SS); 3250 3251 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3252 DependentNameTypeLoc TL, 3253 bool DeducibleTSTContext); 3254 }; 3255 3256 template<typename Derived> 3257 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3258 if (!S) 3259 return S; 3260 3261 switch (S->getStmtClass()) { 3262 case Stmt::NoStmtClass: break; 3263 3264 // Transform individual statement nodes 3265 #define STMT(Node, Parent) \ 3266 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3267 #define ABSTRACT_STMT(Node) 3268 #define EXPR(Node, Parent) 3269 #include "clang/AST/StmtNodes.inc" 3270 3271 // Transform expressions by calling TransformExpr. 3272 #define STMT(Node, Parent) 3273 #define ABSTRACT_STMT(Stmt) 3274 #define EXPR(Node, Parent) case Stmt::Node##Class: 3275 #include "clang/AST/StmtNodes.inc" 3276 { 3277 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3278 if (E.isInvalid()) 3279 return StmtError(); 3280 3281 return getSema().ActOnExprStmt(E); 3282 } 3283 } 3284 3285 return S; 3286 } 3287 3288 template<typename Derived> 3289 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3290 if (!S) 3291 return S; 3292 3293 switch (S->getClauseKind()) { 3294 default: break; 3295 // Transform individual clause nodes 3296 #define OPENMP_CLAUSE(Name, Class) \ 3297 case OMPC_ ## Name : \ 3298 return getDerived().Transform ## Class(cast<Class>(S)); 3299 #include "clang/Basic/OpenMPKinds.def" 3300 } 3301 3302 return S; 3303 } 3304 3305 3306 template<typename Derived> 3307 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3308 if (!E) 3309 return E; 3310 3311 switch (E->getStmtClass()) { 3312 case Stmt::NoStmtClass: break; 3313 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3314 #define ABSTRACT_STMT(Stmt) 3315 #define EXPR(Node, Parent) \ 3316 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3317 #include "clang/AST/StmtNodes.inc" 3318 } 3319 3320 return E; 3321 } 3322 3323 template<typename Derived> 3324 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3325 bool NotCopyInit) { 3326 // Initializers are instantiated like expressions, except that various outer 3327 // layers are stripped. 3328 if (!Init) 3329 return Init; 3330 3331 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3332 Init = ExprTemp->getSubExpr(); 3333 3334 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3335 Init = AIL->getCommonExpr(); 3336 3337 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3338 Init = MTE->GetTemporaryExpr(); 3339 3340 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3341 Init = Binder->getSubExpr(); 3342 3343 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3344 Init = ICE->getSubExprAsWritten(); 3345 3346 if (CXXStdInitializerListExpr *ILE = 3347 dyn_cast<CXXStdInitializerListExpr>(Init)) 3348 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3349 3350 // If this is copy-initialization, we only need to reconstruct 3351 // InitListExprs. Other forms of copy-initialization will be a no-op if 3352 // the initializer is already the right type. 3353 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3354 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3355 return getDerived().TransformExpr(Init); 3356 3357 // Revert value-initialization back to empty parens. 3358 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3359 SourceRange Parens = VIE->getSourceRange(); 3360 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3361 Parens.getEnd()); 3362 } 3363 3364 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3365 if (isa<ImplicitValueInitExpr>(Init)) 3366 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3367 SourceLocation()); 3368 3369 // Revert initialization by constructor back to a parenthesized or braced list 3370 // of expressions. Any other form of initializer can just be reused directly. 3371 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3372 return getDerived().TransformExpr(Init); 3373 3374 // If the initialization implicitly converted an initializer list to a 3375 // std::initializer_list object, unwrap the std::initializer_list too. 3376 if (Construct && Construct->isStdInitListInitialization()) 3377 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3378 3379 SmallVector<Expr*, 8> NewArgs; 3380 bool ArgChanged = false; 3381 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3382 /*IsCall*/true, NewArgs, &ArgChanged)) 3383 return ExprError(); 3384 3385 // If this was list initialization, revert to syntactic list form. 3386 if (Construct->isListInitialization()) 3387 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 3388 Construct->getLocEnd()); 3389 3390 // Build a ParenListExpr to represent anything else. 3391 SourceRange Parens = Construct->getParenOrBraceRange(); 3392 if (Parens.isInvalid()) { 3393 // This was a variable declaration's initialization for which no initializer 3394 // was specified. 3395 assert(NewArgs.empty() && 3396 "no parens or braces but have direct init with arguments?"); 3397 return ExprEmpty(); 3398 } 3399 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3400 Parens.getEnd()); 3401 } 3402 3403 template<typename Derived> 3404 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3405 unsigned NumInputs, 3406 bool IsCall, 3407 SmallVectorImpl<Expr *> &Outputs, 3408 bool *ArgChanged) { 3409 for (unsigned I = 0; I != NumInputs; ++I) { 3410 // If requested, drop call arguments that need to be dropped. 3411 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3412 if (ArgChanged) 3413 *ArgChanged = true; 3414 3415 break; 3416 } 3417 3418 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3419 Expr *Pattern = Expansion->getPattern(); 3420 3421 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3422 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3423 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3424 3425 // Determine whether the set of unexpanded parameter packs can and should 3426 // be expanded. 3427 bool Expand = true; 3428 bool RetainExpansion = false; 3429 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3430 Optional<unsigned> NumExpansions = OrigNumExpansions; 3431 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3432 Pattern->getSourceRange(), 3433 Unexpanded, 3434 Expand, RetainExpansion, 3435 NumExpansions)) 3436 return true; 3437 3438 if (!Expand) { 3439 // The transform has determined that we should perform a simple 3440 // transformation on the pack expansion, producing another pack 3441 // expansion. 3442 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3443 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3444 if (OutPattern.isInvalid()) 3445 return true; 3446 3447 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3448 Expansion->getEllipsisLoc(), 3449 NumExpansions); 3450 if (Out.isInvalid()) 3451 return true; 3452 3453 if (ArgChanged) 3454 *ArgChanged = true; 3455 Outputs.push_back(Out.get()); 3456 continue; 3457 } 3458 3459 // Record right away that the argument was changed. This needs 3460 // to happen even if the array expands to nothing. 3461 if (ArgChanged) *ArgChanged = true; 3462 3463 // The transform has determined that we should perform an elementwise 3464 // expansion of the pattern. Do so. 3465 for (unsigned I = 0; I != *NumExpansions; ++I) { 3466 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3467 ExprResult Out = getDerived().TransformExpr(Pattern); 3468 if (Out.isInvalid()) 3469 return true; 3470 3471 if (Out.get()->containsUnexpandedParameterPack()) { 3472 Out = getDerived().RebuildPackExpansion( 3473 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3474 if (Out.isInvalid()) 3475 return true; 3476 } 3477 3478 Outputs.push_back(Out.get()); 3479 } 3480 3481 // If we're supposed to retain a pack expansion, do so by temporarily 3482 // forgetting the partially-substituted parameter pack. 3483 if (RetainExpansion) { 3484 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3485 3486 ExprResult Out = getDerived().TransformExpr(Pattern); 3487 if (Out.isInvalid()) 3488 return true; 3489 3490 Out = getDerived().RebuildPackExpansion( 3491 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3492 if (Out.isInvalid()) 3493 return true; 3494 3495 Outputs.push_back(Out.get()); 3496 } 3497 3498 continue; 3499 } 3500 3501 ExprResult Result = 3502 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3503 : getDerived().TransformExpr(Inputs[I]); 3504 if (Result.isInvalid()) 3505 return true; 3506 3507 if (Result.get() != Inputs[I] && ArgChanged) 3508 *ArgChanged = true; 3509 3510 Outputs.push_back(Result.get()); 3511 } 3512 3513 return false; 3514 } 3515 3516 template <typename Derived> 3517 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3518 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3519 if (Var) { 3520 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3521 getDerived().TransformDefinition(Var->getLocation(), Var)); 3522 3523 if (!ConditionVar) 3524 return Sema::ConditionError(); 3525 3526 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3527 } 3528 3529 if (Expr) { 3530 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3531 3532 if (CondExpr.isInvalid()) 3533 return Sema::ConditionError(); 3534 3535 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3536 } 3537 3538 return Sema::ConditionResult(); 3539 } 3540 3541 template<typename Derived> 3542 NestedNameSpecifierLoc 3543 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3544 NestedNameSpecifierLoc NNS, 3545 QualType ObjectType, 3546 NamedDecl *FirstQualifierInScope) { 3547 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3548 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3549 Qualifier = Qualifier.getPrefix()) 3550 Qualifiers.push_back(Qualifier); 3551 3552 CXXScopeSpec SS; 3553 while (!Qualifiers.empty()) { 3554 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3555 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3556 3557 switch (QNNS->getKind()) { 3558 case NestedNameSpecifier::Identifier: { 3559 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3560 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3561 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3562 SS, FirstQualifierInScope, false)) 3563 return NestedNameSpecifierLoc(); 3564 } 3565 break; 3566 3567 case NestedNameSpecifier::Namespace: { 3568 NamespaceDecl *NS 3569 = cast_or_null<NamespaceDecl>( 3570 getDerived().TransformDecl( 3571 Q.getLocalBeginLoc(), 3572 QNNS->getAsNamespace())); 3573 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3574 break; 3575 } 3576 3577 case NestedNameSpecifier::NamespaceAlias: { 3578 NamespaceAliasDecl *Alias 3579 = cast_or_null<NamespaceAliasDecl>( 3580 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3581 QNNS->getAsNamespaceAlias())); 3582 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3583 Q.getLocalEndLoc()); 3584 break; 3585 } 3586 3587 case NestedNameSpecifier::Global: 3588 // There is no meaningful transformation that one could perform on the 3589 // global scope. 3590 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3591 break; 3592 3593 case NestedNameSpecifier::Super: { 3594 CXXRecordDecl *RD = 3595 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3596 SourceLocation(), QNNS->getAsRecordDecl())); 3597 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3598 break; 3599 } 3600 3601 case NestedNameSpecifier::TypeSpecWithTemplate: 3602 case NestedNameSpecifier::TypeSpec: { 3603 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3604 FirstQualifierInScope, SS); 3605 3606 if (!TL) 3607 return NestedNameSpecifierLoc(); 3608 3609 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3610 (SemaRef.getLangOpts().CPlusPlus11 && 3611 TL.getType()->isEnumeralType())) { 3612 assert(!TL.getType().hasLocalQualifiers() && 3613 "Can't get cv-qualifiers here"); 3614 if (TL.getType()->isEnumeralType()) 3615 SemaRef.Diag(TL.getBeginLoc(), 3616 diag::warn_cxx98_compat_enum_nested_name_spec); 3617 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3618 Q.getLocalEndLoc()); 3619 break; 3620 } 3621 // If the nested-name-specifier is an invalid type def, don't emit an 3622 // error because a previous error should have already been emitted. 3623 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3624 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3625 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3626 << TL.getType() << SS.getRange(); 3627 } 3628 return NestedNameSpecifierLoc(); 3629 } 3630 } 3631 3632 // The qualifier-in-scope and object type only apply to the leftmost entity. 3633 FirstQualifierInScope = nullptr; 3634 ObjectType = QualType(); 3635 } 3636 3637 // Don't rebuild the nested-name-specifier if we don't have to. 3638 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3639 !getDerived().AlwaysRebuild()) 3640 return NNS; 3641 3642 // If we can re-use the source-location data from the original 3643 // nested-name-specifier, do so. 3644 if (SS.location_size() == NNS.getDataLength() && 3645 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3646 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3647 3648 // Allocate new nested-name-specifier location information. 3649 return SS.getWithLocInContext(SemaRef.Context); 3650 } 3651 3652 template<typename Derived> 3653 DeclarationNameInfo 3654 TreeTransform<Derived> 3655 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3656 DeclarationName Name = NameInfo.getName(); 3657 if (!Name) 3658 return DeclarationNameInfo(); 3659 3660 switch (Name.getNameKind()) { 3661 case DeclarationName::Identifier: 3662 case DeclarationName::ObjCZeroArgSelector: 3663 case DeclarationName::ObjCOneArgSelector: 3664 case DeclarationName::ObjCMultiArgSelector: 3665 case DeclarationName::CXXOperatorName: 3666 case DeclarationName::CXXLiteralOperatorName: 3667 case DeclarationName::CXXUsingDirective: 3668 return NameInfo; 3669 3670 case DeclarationName::CXXDeductionGuideName: { 3671 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3672 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3673 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3674 if (!NewTemplate) 3675 return DeclarationNameInfo(); 3676 3677 DeclarationNameInfo NewNameInfo(NameInfo); 3678 NewNameInfo.setName( 3679 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3680 return NewNameInfo; 3681 } 3682 3683 case DeclarationName::CXXConstructorName: 3684 case DeclarationName::CXXDestructorName: 3685 case DeclarationName::CXXConversionFunctionName: { 3686 TypeSourceInfo *NewTInfo; 3687 CanQualType NewCanTy; 3688 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3689 NewTInfo = getDerived().TransformType(OldTInfo); 3690 if (!NewTInfo) 3691 return DeclarationNameInfo(); 3692 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3693 } 3694 else { 3695 NewTInfo = nullptr; 3696 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3697 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3698 if (NewT.isNull()) 3699 return DeclarationNameInfo(); 3700 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3701 } 3702 3703 DeclarationName NewName 3704 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3705 NewCanTy); 3706 DeclarationNameInfo NewNameInfo(NameInfo); 3707 NewNameInfo.setName(NewName); 3708 NewNameInfo.setNamedTypeInfo(NewTInfo); 3709 return NewNameInfo; 3710 } 3711 } 3712 3713 llvm_unreachable("Unknown name kind."); 3714 } 3715 3716 template<typename Derived> 3717 TemplateName 3718 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3719 TemplateName Name, 3720 SourceLocation NameLoc, 3721 QualType ObjectType, 3722 NamedDecl *FirstQualifierInScope, 3723 bool AllowInjectedClassName) { 3724 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3725 TemplateDecl *Template = QTN->getTemplateDecl(); 3726 assert(Template && "qualified template name must refer to a template"); 3727 3728 TemplateDecl *TransTemplate 3729 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3730 Template)); 3731 if (!TransTemplate) 3732 return TemplateName(); 3733 3734 if (!getDerived().AlwaysRebuild() && 3735 SS.getScopeRep() == QTN->getQualifier() && 3736 TransTemplate == Template) 3737 return Name; 3738 3739 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3740 TransTemplate); 3741 } 3742 3743 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3744 if (SS.getScopeRep()) { 3745 // These apply to the scope specifier, not the template. 3746 ObjectType = QualType(); 3747 FirstQualifierInScope = nullptr; 3748 } 3749 3750 if (!getDerived().AlwaysRebuild() && 3751 SS.getScopeRep() == DTN->getQualifier() && 3752 ObjectType.isNull()) 3753 return Name; 3754 3755 if (DTN->isIdentifier()) { 3756 return getDerived().RebuildTemplateName(SS, 3757 *DTN->getIdentifier(), 3758 NameLoc, 3759 ObjectType, 3760 FirstQualifierInScope, 3761 AllowInjectedClassName); 3762 } 3763 3764 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 3765 ObjectType, AllowInjectedClassName); 3766 } 3767 3768 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3769 TemplateDecl *TransTemplate 3770 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3771 Template)); 3772 if (!TransTemplate) 3773 return TemplateName(); 3774 3775 if (!getDerived().AlwaysRebuild() && 3776 TransTemplate == Template) 3777 return Name; 3778 3779 return TemplateName(TransTemplate); 3780 } 3781 3782 if (SubstTemplateTemplateParmPackStorage *SubstPack 3783 = Name.getAsSubstTemplateTemplateParmPack()) { 3784 TemplateTemplateParmDecl *TransParam 3785 = cast_or_null<TemplateTemplateParmDecl>( 3786 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3787 if (!TransParam) 3788 return TemplateName(); 3789 3790 if (!getDerived().AlwaysRebuild() && 3791 TransParam == SubstPack->getParameterPack()) 3792 return Name; 3793 3794 return getDerived().RebuildTemplateName(TransParam, 3795 SubstPack->getArgumentPack()); 3796 } 3797 3798 // These should be getting filtered out before they reach the AST. 3799 llvm_unreachable("overloaded function decl survived to here"); 3800 } 3801 3802 template<typename Derived> 3803 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3804 const TemplateArgument &Arg, 3805 TemplateArgumentLoc &Output) { 3806 SourceLocation Loc = getDerived().getBaseLocation(); 3807 switch (Arg.getKind()) { 3808 case TemplateArgument::Null: 3809 llvm_unreachable("null template argument in TreeTransform"); 3810 break; 3811 3812 case TemplateArgument::Type: 3813 Output = TemplateArgumentLoc(Arg, 3814 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3815 3816 break; 3817 3818 case TemplateArgument::Template: 3819 case TemplateArgument::TemplateExpansion: { 3820 NestedNameSpecifierLocBuilder Builder; 3821 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3822 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3823 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3824 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3825 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3826 3827 if (Arg.getKind() == TemplateArgument::Template) 3828 Output = TemplateArgumentLoc(Arg, 3829 Builder.getWithLocInContext(SemaRef.Context), 3830 Loc); 3831 else 3832 Output = TemplateArgumentLoc(Arg, 3833 Builder.getWithLocInContext(SemaRef.Context), 3834 Loc, Loc); 3835 3836 break; 3837 } 3838 3839 case TemplateArgument::Expression: 3840 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3841 break; 3842 3843 case TemplateArgument::Declaration: 3844 case TemplateArgument::Integral: 3845 case TemplateArgument::Pack: 3846 case TemplateArgument::NullPtr: 3847 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3848 break; 3849 } 3850 } 3851 3852 template<typename Derived> 3853 bool TreeTransform<Derived>::TransformTemplateArgument( 3854 const TemplateArgumentLoc &Input, 3855 TemplateArgumentLoc &Output, bool Uneval) { 3856 const TemplateArgument &Arg = Input.getArgument(); 3857 switch (Arg.getKind()) { 3858 case TemplateArgument::Null: 3859 case TemplateArgument::Integral: 3860 case TemplateArgument::Pack: 3861 case TemplateArgument::Declaration: 3862 case TemplateArgument::NullPtr: 3863 llvm_unreachable("Unexpected TemplateArgument"); 3864 3865 case TemplateArgument::Type: { 3866 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3867 if (!DI) 3868 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3869 3870 DI = getDerived().TransformType(DI); 3871 if (!DI) return true; 3872 3873 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3874 return false; 3875 } 3876 3877 case TemplateArgument::Template: { 3878 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3879 if (QualifierLoc) { 3880 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3881 if (!QualifierLoc) 3882 return true; 3883 } 3884 3885 CXXScopeSpec SS; 3886 SS.Adopt(QualifierLoc); 3887 TemplateName Template 3888 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3889 Input.getTemplateNameLoc()); 3890 if (Template.isNull()) 3891 return true; 3892 3893 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3894 Input.getTemplateNameLoc()); 3895 return false; 3896 } 3897 3898 case TemplateArgument::TemplateExpansion: 3899 llvm_unreachable("Caller should expand pack expansions"); 3900 3901 case TemplateArgument::Expression: { 3902 // Template argument expressions are constant expressions. 3903 EnterExpressionEvaluationContext Unevaluated( 3904 getSema(), Uneval 3905 ? Sema::ExpressionEvaluationContext::Unevaluated 3906 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3907 3908 Expr *InputExpr = Input.getSourceExpression(); 3909 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3910 3911 ExprResult E = getDerived().TransformExpr(InputExpr); 3912 E = SemaRef.ActOnConstantExpression(E); 3913 if (E.isInvalid()) return true; 3914 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3915 return false; 3916 } 3917 } 3918 3919 // Work around bogus GCC warning 3920 return true; 3921 } 3922 3923 /// \brief Iterator adaptor that invents template argument location information 3924 /// for each of the template arguments in its underlying iterator. 3925 template<typename Derived, typename InputIterator> 3926 class TemplateArgumentLocInventIterator { 3927 TreeTransform<Derived> &Self; 3928 InputIterator Iter; 3929 3930 public: 3931 typedef TemplateArgumentLoc value_type; 3932 typedef TemplateArgumentLoc reference; 3933 typedef typename std::iterator_traits<InputIterator>::difference_type 3934 difference_type; 3935 typedef std::input_iterator_tag iterator_category; 3936 3937 class pointer { 3938 TemplateArgumentLoc Arg; 3939 3940 public: 3941 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3942 3943 const TemplateArgumentLoc *operator->() const { return &Arg; } 3944 }; 3945 3946 TemplateArgumentLocInventIterator() { } 3947 3948 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3949 InputIterator Iter) 3950 : Self(Self), Iter(Iter) { } 3951 3952 TemplateArgumentLocInventIterator &operator++() { 3953 ++Iter; 3954 return *this; 3955 } 3956 3957 TemplateArgumentLocInventIterator operator++(int) { 3958 TemplateArgumentLocInventIterator Old(*this); 3959 ++(*this); 3960 return Old; 3961 } 3962 3963 reference operator*() const { 3964 TemplateArgumentLoc Result; 3965 Self.InventTemplateArgumentLoc(*Iter, Result); 3966 return Result; 3967 } 3968 3969 pointer operator->() const { return pointer(**this); } 3970 3971 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3972 const TemplateArgumentLocInventIterator &Y) { 3973 return X.Iter == Y.Iter; 3974 } 3975 3976 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3977 const TemplateArgumentLocInventIterator &Y) { 3978 return X.Iter != Y.Iter; 3979 } 3980 }; 3981 3982 template<typename Derived> 3983 template<typename InputIterator> 3984 bool TreeTransform<Derived>::TransformTemplateArguments( 3985 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 3986 bool Uneval) { 3987 for (; First != Last; ++First) { 3988 TemplateArgumentLoc Out; 3989 TemplateArgumentLoc In = *First; 3990 3991 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3992 // Unpack argument packs, which we translate them into separate 3993 // arguments. 3994 // FIXME: We could do much better if we could guarantee that the 3995 // TemplateArgumentLocInfo for the pack expansion would be usable for 3996 // all of the template arguments in the argument pack. 3997 typedef TemplateArgumentLocInventIterator<Derived, 3998 TemplateArgument::pack_iterator> 3999 PackLocIterator; 4000 if (TransformTemplateArguments(PackLocIterator(*this, 4001 In.getArgument().pack_begin()), 4002 PackLocIterator(*this, 4003 In.getArgument().pack_end()), 4004 Outputs, Uneval)) 4005 return true; 4006 4007 continue; 4008 } 4009 4010 if (In.getArgument().isPackExpansion()) { 4011 // We have a pack expansion, for which we will be substituting into 4012 // the pattern. 4013 SourceLocation Ellipsis; 4014 Optional<unsigned> OrigNumExpansions; 4015 TemplateArgumentLoc Pattern 4016 = getSema().getTemplateArgumentPackExpansionPattern( 4017 In, Ellipsis, OrigNumExpansions); 4018 4019 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4020 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4021 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4022 4023 // Determine whether the set of unexpanded parameter packs can and should 4024 // be expanded. 4025 bool Expand = true; 4026 bool RetainExpansion = false; 4027 Optional<unsigned> NumExpansions = OrigNumExpansions; 4028 if (getDerived().TryExpandParameterPacks(Ellipsis, 4029 Pattern.getSourceRange(), 4030 Unexpanded, 4031 Expand, 4032 RetainExpansion, 4033 NumExpansions)) 4034 return true; 4035 4036 if (!Expand) { 4037 // The transform has determined that we should perform a simple 4038 // transformation on the pack expansion, producing another pack 4039 // expansion. 4040 TemplateArgumentLoc OutPattern; 4041 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4042 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4043 return true; 4044 4045 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4046 NumExpansions); 4047 if (Out.getArgument().isNull()) 4048 return true; 4049 4050 Outputs.addArgument(Out); 4051 continue; 4052 } 4053 4054 // The transform has determined that we should perform an elementwise 4055 // expansion of the pattern. Do so. 4056 for (unsigned I = 0; I != *NumExpansions; ++I) { 4057 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4058 4059 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4060 return true; 4061 4062 if (Out.getArgument().containsUnexpandedParameterPack()) { 4063 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4064 OrigNumExpansions); 4065 if (Out.getArgument().isNull()) 4066 return true; 4067 } 4068 4069 Outputs.addArgument(Out); 4070 } 4071 4072 // If we're supposed to retain a pack expansion, do so by temporarily 4073 // forgetting the partially-substituted parameter pack. 4074 if (RetainExpansion) { 4075 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4076 4077 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4078 return true; 4079 4080 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4081 OrigNumExpansions); 4082 if (Out.getArgument().isNull()) 4083 return true; 4084 4085 Outputs.addArgument(Out); 4086 } 4087 4088 continue; 4089 } 4090 4091 // The simple case: 4092 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4093 return true; 4094 4095 Outputs.addArgument(Out); 4096 } 4097 4098 return false; 4099 4100 } 4101 4102 //===----------------------------------------------------------------------===// 4103 // Type transformation 4104 //===----------------------------------------------------------------------===// 4105 4106 template<typename Derived> 4107 QualType TreeTransform<Derived>::TransformType(QualType T) { 4108 if (getDerived().AlreadyTransformed(T)) 4109 return T; 4110 4111 // Temporary workaround. All of these transformations should 4112 // eventually turn into transformations on TypeLocs. 4113 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4114 getDerived().getBaseLocation()); 4115 4116 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4117 4118 if (!NewDI) 4119 return QualType(); 4120 4121 return NewDI->getType(); 4122 } 4123 4124 template<typename Derived> 4125 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4126 // Refine the base location to the type's location. 4127 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4128 getDerived().getBaseEntity()); 4129 if (getDerived().AlreadyTransformed(DI->getType())) 4130 return DI; 4131 4132 TypeLocBuilder TLB; 4133 4134 TypeLoc TL = DI->getTypeLoc(); 4135 TLB.reserve(TL.getFullDataSize()); 4136 4137 QualType Result = getDerived().TransformType(TLB, TL); 4138 if (Result.isNull()) 4139 return nullptr; 4140 4141 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4142 } 4143 4144 template<typename Derived> 4145 QualType 4146 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4147 switch (T.getTypeLocClass()) { 4148 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4149 #define TYPELOC(CLASS, PARENT) \ 4150 case TypeLoc::CLASS: \ 4151 return getDerived().Transform##CLASS##Type(TLB, \ 4152 T.castAs<CLASS##TypeLoc>()); 4153 #include "clang/AST/TypeLocNodes.def" 4154 } 4155 4156 llvm_unreachable("unhandled type loc!"); 4157 } 4158 4159 template<typename Derived> 4160 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4161 if (!isa<DependentNameType>(T)) 4162 return TransformType(T); 4163 4164 if (getDerived().AlreadyTransformed(T)) 4165 return T; 4166 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4167 getDerived().getBaseLocation()); 4168 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4169 return NewDI ? NewDI->getType() : QualType(); 4170 } 4171 4172 template<typename Derived> 4173 TypeSourceInfo * 4174 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4175 if (!isa<DependentNameType>(DI->getType())) 4176 return TransformType(DI); 4177 4178 // Refine the base location to the type's location. 4179 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4180 getDerived().getBaseEntity()); 4181 if (getDerived().AlreadyTransformed(DI->getType())) 4182 return DI; 4183 4184 TypeLocBuilder TLB; 4185 4186 TypeLoc TL = DI->getTypeLoc(); 4187 TLB.reserve(TL.getFullDataSize()); 4188 4189 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4190 if (QTL) 4191 TL = QTL.getUnqualifiedLoc(); 4192 4193 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4194 4195 QualType Result = getDerived().TransformDependentNameType( 4196 TLB, DNTL, /*DeducedTSTContext*/true); 4197 if (Result.isNull()) 4198 return nullptr; 4199 4200 if (QTL) { 4201 Result = getDerived().RebuildQualifiedType( 4202 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4203 TLB.TypeWasModifiedSafely(Result); 4204 } 4205 4206 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4207 } 4208 4209 template<typename Derived> 4210 QualType 4211 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4212 QualifiedTypeLoc T) { 4213 Qualifiers Quals = T.getType().getLocalQualifiers(); 4214 4215 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4216 if (Result.isNull()) 4217 return QualType(); 4218 4219 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4220 4221 // RebuildQualifiedType might have updated the type, but not in a way 4222 // that invalidates the TypeLoc. (There's no location information for 4223 // qualifiers.) 4224 TLB.TypeWasModifiedSafely(Result); 4225 4226 return Result; 4227 } 4228 4229 template<typename Derived> 4230 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4231 SourceLocation Loc, 4232 Qualifiers Quals) { 4233 // C++ [dcl.fct]p7: 4234 // [When] adding cv-qualifications on top of the function type [...] the 4235 // cv-qualifiers are ignored. 4236 // C++ [dcl.ref]p1: 4237 // when the cv-qualifiers are introduced through the use of a typedef-name 4238 // or decltype-specifier [...] the cv-qualifiers are ignored. 4239 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4240 // applied to a reference type. 4241 // FIXME: This removes all qualifiers, not just cv-qualifiers! 4242 if (T->isFunctionType() || T->isReferenceType()) 4243 return T; 4244 4245 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4246 // resulting type. 4247 if (Quals.hasObjCLifetime()) { 4248 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4249 Quals.removeObjCLifetime(); 4250 else if (T.getObjCLifetime()) { 4251 // Objective-C ARC: 4252 // A lifetime qualifier applied to a substituted template parameter 4253 // overrides the lifetime qualifier from the template argument. 4254 const AutoType *AutoTy; 4255 if (const SubstTemplateTypeParmType *SubstTypeParam 4256 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4257 QualType Replacement = SubstTypeParam->getReplacementType(); 4258 Qualifiers Qs = Replacement.getQualifiers(); 4259 Qs.removeObjCLifetime(); 4260 Replacement = SemaRef.Context.getQualifiedType( 4261 Replacement.getUnqualifiedType(), Qs); 4262 T = SemaRef.Context.getSubstTemplateTypeParmType( 4263 SubstTypeParam->getReplacedParameter(), Replacement); 4264 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4265 // 'auto' types behave the same way as template parameters. 4266 QualType Deduced = AutoTy->getDeducedType(); 4267 Qualifiers Qs = Deduced.getQualifiers(); 4268 Qs.removeObjCLifetime(); 4269 Deduced = 4270 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4271 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4272 AutoTy->isDependentType()); 4273 } else { 4274 // Otherwise, complain about the addition of a qualifier to an 4275 // already-qualified type. 4276 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4277 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4278 Quals.removeObjCLifetime(); 4279 } 4280 } 4281 } 4282 4283 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4284 } 4285 4286 template<typename Derived> 4287 TypeLoc 4288 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4289 QualType ObjectType, 4290 NamedDecl *UnqualLookup, 4291 CXXScopeSpec &SS) { 4292 if (getDerived().AlreadyTransformed(TL.getType())) 4293 return TL; 4294 4295 TypeSourceInfo *TSI = 4296 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4297 if (TSI) 4298 return TSI->getTypeLoc(); 4299 return TypeLoc(); 4300 } 4301 4302 template<typename Derived> 4303 TypeSourceInfo * 4304 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4305 QualType ObjectType, 4306 NamedDecl *UnqualLookup, 4307 CXXScopeSpec &SS) { 4308 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4309 return TSInfo; 4310 4311 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4312 UnqualLookup, SS); 4313 } 4314 4315 template <typename Derived> 4316 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4317 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4318 CXXScopeSpec &SS) { 4319 QualType T = TL.getType(); 4320 assert(!getDerived().AlreadyTransformed(T)); 4321 4322 TypeLocBuilder TLB; 4323 QualType Result; 4324 4325 if (isa<TemplateSpecializationType>(T)) { 4326 TemplateSpecializationTypeLoc SpecTL = 4327 TL.castAs<TemplateSpecializationTypeLoc>(); 4328 4329 TemplateName Template = getDerived().TransformTemplateName( 4330 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4331 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4332 if (Template.isNull()) 4333 return nullptr; 4334 4335 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4336 Template); 4337 } else if (isa<DependentTemplateSpecializationType>(T)) { 4338 DependentTemplateSpecializationTypeLoc SpecTL = 4339 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4340 4341 TemplateName Template 4342 = getDerived().RebuildTemplateName(SS, 4343 *SpecTL.getTypePtr()->getIdentifier(), 4344 SpecTL.getTemplateNameLoc(), 4345 ObjectType, UnqualLookup, 4346 /*AllowInjectedClassName*/true); 4347 if (Template.isNull()) 4348 return nullptr; 4349 4350 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4351 SpecTL, 4352 Template, 4353 SS); 4354 } else { 4355 // Nothing special needs to be done for these. 4356 Result = getDerived().TransformType(TLB, TL); 4357 } 4358 4359 if (Result.isNull()) 4360 return nullptr; 4361 4362 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4363 } 4364 4365 template <class TyLoc> static inline 4366 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4367 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4368 NewT.setNameLoc(T.getNameLoc()); 4369 return T.getType(); 4370 } 4371 4372 template<typename Derived> 4373 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4374 BuiltinTypeLoc T) { 4375 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4376 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4377 if (T.needsExtraLocalData()) 4378 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4379 return T.getType(); 4380 } 4381 4382 template<typename Derived> 4383 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4384 ComplexTypeLoc T) { 4385 // FIXME: recurse? 4386 return TransformTypeSpecType(TLB, T); 4387 } 4388 4389 template <typename Derived> 4390 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4391 AdjustedTypeLoc TL) { 4392 // Adjustments applied during transformation are handled elsewhere. 4393 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4394 } 4395 4396 template<typename Derived> 4397 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4398 DecayedTypeLoc TL) { 4399 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4400 if (OriginalType.isNull()) 4401 return QualType(); 4402 4403 QualType Result = TL.getType(); 4404 if (getDerived().AlwaysRebuild() || 4405 OriginalType != TL.getOriginalLoc().getType()) 4406 Result = SemaRef.Context.getDecayedType(OriginalType); 4407 TLB.push<DecayedTypeLoc>(Result); 4408 // Nothing to set for DecayedTypeLoc. 4409 return Result; 4410 } 4411 4412 template<typename Derived> 4413 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4414 PointerTypeLoc TL) { 4415 QualType PointeeType 4416 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4417 if (PointeeType.isNull()) 4418 return QualType(); 4419 4420 QualType Result = TL.getType(); 4421 if (PointeeType->getAs<ObjCObjectType>()) { 4422 // A dependent pointer type 'T *' has is being transformed such 4423 // that an Objective-C class type is being replaced for 'T'. The 4424 // resulting pointer type is an ObjCObjectPointerType, not a 4425 // PointerType. 4426 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4427 4428 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4429 NewT.setStarLoc(TL.getStarLoc()); 4430 return Result; 4431 } 4432 4433 if (getDerived().AlwaysRebuild() || 4434 PointeeType != TL.getPointeeLoc().getType()) { 4435 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4436 if (Result.isNull()) 4437 return QualType(); 4438 } 4439 4440 // Objective-C ARC can add lifetime qualifiers to the type that we're 4441 // pointing to. 4442 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4443 4444 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4445 NewT.setSigilLoc(TL.getSigilLoc()); 4446 return Result; 4447 } 4448 4449 template<typename Derived> 4450 QualType 4451 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4452 BlockPointerTypeLoc TL) { 4453 QualType PointeeType 4454 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4455 if (PointeeType.isNull()) 4456 return QualType(); 4457 4458 QualType Result = TL.getType(); 4459 if (getDerived().AlwaysRebuild() || 4460 PointeeType != TL.getPointeeLoc().getType()) { 4461 Result = getDerived().RebuildBlockPointerType(PointeeType, 4462 TL.getSigilLoc()); 4463 if (Result.isNull()) 4464 return QualType(); 4465 } 4466 4467 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4468 NewT.setSigilLoc(TL.getSigilLoc()); 4469 return Result; 4470 } 4471 4472 /// Transforms a reference type. Note that somewhat paradoxically we 4473 /// don't care whether the type itself is an l-value type or an r-value 4474 /// type; we only care if the type was *written* as an l-value type 4475 /// or an r-value type. 4476 template<typename Derived> 4477 QualType 4478 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4479 ReferenceTypeLoc TL) { 4480 const ReferenceType *T = TL.getTypePtr(); 4481 4482 // Note that this works with the pointee-as-written. 4483 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4484 if (PointeeType.isNull()) 4485 return QualType(); 4486 4487 QualType Result = TL.getType(); 4488 if (getDerived().AlwaysRebuild() || 4489 PointeeType != T->getPointeeTypeAsWritten()) { 4490 Result = getDerived().RebuildReferenceType(PointeeType, 4491 T->isSpelledAsLValue(), 4492 TL.getSigilLoc()); 4493 if (Result.isNull()) 4494 return QualType(); 4495 } 4496 4497 // Objective-C ARC can add lifetime qualifiers to the type that we're 4498 // referring to. 4499 TLB.TypeWasModifiedSafely( 4500 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4501 4502 // r-value references can be rebuilt as l-value references. 4503 ReferenceTypeLoc NewTL; 4504 if (isa<LValueReferenceType>(Result)) 4505 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4506 else 4507 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4508 NewTL.setSigilLoc(TL.getSigilLoc()); 4509 4510 return Result; 4511 } 4512 4513 template<typename Derived> 4514 QualType 4515 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4516 LValueReferenceTypeLoc TL) { 4517 return TransformReferenceType(TLB, TL); 4518 } 4519 4520 template<typename Derived> 4521 QualType 4522 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4523 RValueReferenceTypeLoc TL) { 4524 return TransformReferenceType(TLB, TL); 4525 } 4526 4527 template<typename Derived> 4528 QualType 4529 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4530 MemberPointerTypeLoc TL) { 4531 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4532 if (PointeeType.isNull()) 4533 return QualType(); 4534 4535 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4536 TypeSourceInfo *NewClsTInfo = nullptr; 4537 if (OldClsTInfo) { 4538 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4539 if (!NewClsTInfo) 4540 return QualType(); 4541 } 4542 4543 const MemberPointerType *T = TL.getTypePtr(); 4544 QualType OldClsType = QualType(T->getClass(), 0); 4545 QualType NewClsType; 4546 if (NewClsTInfo) 4547 NewClsType = NewClsTInfo->getType(); 4548 else { 4549 NewClsType = getDerived().TransformType(OldClsType); 4550 if (NewClsType.isNull()) 4551 return QualType(); 4552 } 4553 4554 QualType Result = TL.getType(); 4555 if (getDerived().AlwaysRebuild() || 4556 PointeeType != T->getPointeeType() || 4557 NewClsType != OldClsType) { 4558 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4559 TL.getStarLoc()); 4560 if (Result.isNull()) 4561 return QualType(); 4562 } 4563 4564 // If we had to adjust the pointee type when building a member pointer, make 4565 // sure to push TypeLoc info for it. 4566 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4567 if (MPT && PointeeType != MPT->getPointeeType()) { 4568 assert(isa<AdjustedType>(MPT->getPointeeType())); 4569 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4570 } 4571 4572 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4573 NewTL.setSigilLoc(TL.getSigilLoc()); 4574 NewTL.setClassTInfo(NewClsTInfo); 4575 4576 return Result; 4577 } 4578 4579 template<typename Derived> 4580 QualType 4581 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4582 ConstantArrayTypeLoc TL) { 4583 const ConstantArrayType *T = TL.getTypePtr(); 4584 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4585 if (ElementType.isNull()) 4586 return QualType(); 4587 4588 QualType Result = TL.getType(); 4589 if (getDerived().AlwaysRebuild() || 4590 ElementType != T->getElementType()) { 4591 Result = getDerived().RebuildConstantArrayType(ElementType, 4592 T->getSizeModifier(), 4593 T->getSize(), 4594 T->getIndexTypeCVRQualifiers(), 4595 TL.getBracketsRange()); 4596 if (Result.isNull()) 4597 return QualType(); 4598 } 4599 4600 // We might have either a ConstantArrayType or a VariableArrayType now: 4601 // a ConstantArrayType is allowed to have an element type which is a 4602 // VariableArrayType if the type is dependent. Fortunately, all array 4603 // types have the same location layout. 4604 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4605 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4606 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4607 4608 Expr *Size = TL.getSizeExpr(); 4609 if (Size) { 4610 EnterExpressionEvaluationContext Unevaluated( 4611 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4612 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4613 Size = SemaRef.ActOnConstantExpression(Size).get(); 4614 } 4615 NewTL.setSizeExpr(Size); 4616 4617 return Result; 4618 } 4619 4620 template<typename Derived> 4621 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4622 TypeLocBuilder &TLB, 4623 IncompleteArrayTypeLoc TL) { 4624 const IncompleteArrayType *T = TL.getTypePtr(); 4625 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4626 if (ElementType.isNull()) 4627 return QualType(); 4628 4629 QualType Result = TL.getType(); 4630 if (getDerived().AlwaysRebuild() || 4631 ElementType != T->getElementType()) { 4632 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4633 T->getSizeModifier(), 4634 T->getIndexTypeCVRQualifiers(), 4635 TL.getBracketsRange()); 4636 if (Result.isNull()) 4637 return QualType(); 4638 } 4639 4640 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4641 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4642 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4643 NewTL.setSizeExpr(nullptr); 4644 4645 return Result; 4646 } 4647 4648 template<typename Derived> 4649 QualType 4650 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4651 VariableArrayTypeLoc TL) { 4652 const VariableArrayType *T = TL.getTypePtr(); 4653 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4654 if (ElementType.isNull()) 4655 return QualType(); 4656 4657 ExprResult SizeResult; 4658 { 4659 EnterExpressionEvaluationContext Context( 4660 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4661 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4662 } 4663 if (SizeResult.isInvalid()) 4664 return QualType(); 4665 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4666 if (SizeResult.isInvalid()) 4667 return QualType(); 4668 4669 Expr *Size = SizeResult.get(); 4670 4671 QualType Result = TL.getType(); 4672 if (getDerived().AlwaysRebuild() || 4673 ElementType != T->getElementType() || 4674 Size != T->getSizeExpr()) { 4675 Result = getDerived().RebuildVariableArrayType(ElementType, 4676 T->getSizeModifier(), 4677 Size, 4678 T->getIndexTypeCVRQualifiers(), 4679 TL.getBracketsRange()); 4680 if (Result.isNull()) 4681 return QualType(); 4682 } 4683 4684 // We might have constant size array now, but fortunately it has the same 4685 // location layout. 4686 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4687 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4688 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4689 NewTL.setSizeExpr(Size); 4690 4691 return Result; 4692 } 4693 4694 template<typename Derived> 4695 QualType 4696 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4697 DependentSizedArrayTypeLoc TL) { 4698 const DependentSizedArrayType *T = TL.getTypePtr(); 4699 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4700 if (ElementType.isNull()) 4701 return QualType(); 4702 4703 // Array bounds are constant expressions. 4704 EnterExpressionEvaluationContext Unevaluated( 4705 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4706 4707 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4708 Expr *origSize = TL.getSizeExpr(); 4709 if (!origSize) origSize = T->getSizeExpr(); 4710 4711 ExprResult sizeResult 4712 = getDerived().TransformExpr(origSize); 4713 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4714 if (sizeResult.isInvalid()) 4715 return QualType(); 4716 4717 Expr *size = sizeResult.get(); 4718 4719 QualType Result = TL.getType(); 4720 if (getDerived().AlwaysRebuild() || 4721 ElementType != T->getElementType() || 4722 size != origSize) { 4723 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4724 T->getSizeModifier(), 4725 size, 4726 T->getIndexTypeCVRQualifiers(), 4727 TL.getBracketsRange()); 4728 if (Result.isNull()) 4729 return QualType(); 4730 } 4731 4732 // We might have any sort of array type now, but fortunately they 4733 // all have the same location layout. 4734 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4735 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4736 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4737 NewTL.setSizeExpr(size); 4738 4739 return Result; 4740 } 4741 4742 template<typename Derived> 4743 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4744 TypeLocBuilder &TLB, 4745 DependentSizedExtVectorTypeLoc TL) { 4746 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4747 4748 // FIXME: ext vector locs should be nested 4749 QualType ElementType = getDerived().TransformType(T->getElementType()); 4750 if (ElementType.isNull()) 4751 return QualType(); 4752 4753 // Vector sizes are constant expressions. 4754 EnterExpressionEvaluationContext Unevaluated( 4755 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4756 4757 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4758 Size = SemaRef.ActOnConstantExpression(Size); 4759 if (Size.isInvalid()) 4760 return QualType(); 4761 4762 QualType Result = TL.getType(); 4763 if (getDerived().AlwaysRebuild() || 4764 ElementType != T->getElementType() || 4765 Size.get() != T->getSizeExpr()) { 4766 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4767 Size.get(), 4768 T->getAttributeLoc()); 4769 if (Result.isNull()) 4770 return QualType(); 4771 } 4772 4773 // Result might be dependent or not. 4774 if (isa<DependentSizedExtVectorType>(Result)) { 4775 DependentSizedExtVectorTypeLoc NewTL 4776 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4777 NewTL.setNameLoc(TL.getNameLoc()); 4778 } else { 4779 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4780 NewTL.setNameLoc(TL.getNameLoc()); 4781 } 4782 4783 return Result; 4784 } 4785 4786 template <typename Derived> 4787 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 4788 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 4789 const DependentAddressSpaceType *T = TL.getTypePtr(); 4790 4791 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 4792 4793 if (pointeeType.isNull()) 4794 return QualType(); 4795 4796 // Address spaces are constant expressions. 4797 EnterExpressionEvaluationContext Unevaluated( 4798 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4799 4800 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 4801 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 4802 if (AddrSpace.isInvalid()) 4803 return QualType(); 4804 4805 QualType Result = TL.getType(); 4806 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 4807 AddrSpace.get() != T->getAddrSpaceExpr()) { 4808 Result = getDerived().RebuildDependentAddressSpaceType( 4809 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 4810 if (Result.isNull()) 4811 return QualType(); 4812 } 4813 4814 // Result might be dependent or not. 4815 if (isa<DependentAddressSpaceType>(Result)) { 4816 DependentAddressSpaceTypeLoc NewTL = 4817 TLB.push<DependentAddressSpaceTypeLoc>(Result); 4818 4819 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4820 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 4821 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 4822 4823 } else { 4824 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 4825 Result, getDerived().getBaseLocation()); 4826 TransformType(TLB, DI->getTypeLoc()); 4827 } 4828 4829 return Result; 4830 } 4831 4832 template <typename Derived> 4833 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4834 VectorTypeLoc TL) { 4835 const VectorType *T = TL.getTypePtr(); 4836 QualType ElementType = getDerived().TransformType(T->getElementType()); 4837 if (ElementType.isNull()) 4838 return QualType(); 4839 4840 QualType Result = TL.getType(); 4841 if (getDerived().AlwaysRebuild() || 4842 ElementType != T->getElementType()) { 4843 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4844 T->getVectorKind()); 4845 if (Result.isNull()) 4846 return QualType(); 4847 } 4848 4849 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4850 NewTL.setNameLoc(TL.getNameLoc()); 4851 4852 return Result; 4853 } 4854 4855 template<typename Derived> 4856 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4857 ExtVectorTypeLoc TL) { 4858 const VectorType *T = TL.getTypePtr(); 4859 QualType ElementType = getDerived().TransformType(T->getElementType()); 4860 if (ElementType.isNull()) 4861 return QualType(); 4862 4863 QualType Result = TL.getType(); 4864 if (getDerived().AlwaysRebuild() || 4865 ElementType != T->getElementType()) { 4866 Result = getDerived().RebuildExtVectorType(ElementType, 4867 T->getNumElements(), 4868 /*FIXME*/ SourceLocation()); 4869 if (Result.isNull()) 4870 return QualType(); 4871 } 4872 4873 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4874 NewTL.setNameLoc(TL.getNameLoc()); 4875 4876 return Result; 4877 } 4878 4879 template <typename Derived> 4880 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4881 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4882 bool ExpectParameterPack) { 4883 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4884 TypeSourceInfo *NewDI = nullptr; 4885 4886 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4887 // If we're substituting into a pack expansion type and we know the 4888 // length we want to expand to, just substitute for the pattern. 4889 TypeLoc OldTL = OldDI->getTypeLoc(); 4890 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4891 4892 TypeLocBuilder TLB; 4893 TypeLoc NewTL = OldDI->getTypeLoc(); 4894 TLB.reserve(NewTL.getFullDataSize()); 4895 4896 QualType Result = getDerived().TransformType(TLB, 4897 OldExpansionTL.getPatternLoc()); 4898 if (Result.isNull()) 4899 return nullptr; 4900 4901 Result = RebuildPackExpansionType(Result, 4902 OldExpansionTL.getPatternLoc().getSourceRange(), 4903 OldExpansionTL.getEllipsisLoc(), 4904 NumExpansions); 4905 if (Result.isNull()) 4906 return nullptr; 4907 4908 PackExpansionTypeLoc NewExpansionTL 4909 = TLB.push<PackExpansionTypeLoc>(Result); 4910 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4911 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4912 } else 4913 NewDI = getDerived().TransformType(OldDI); 4914 if (!NewDI) 4915 return nullptr; 4916 4917 if (NewDI == OldDI && indexAdjustment == 0) 4918 return OldParm; 4919 4920 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4921 OldParm->getDeclContext(), 4922 OldParm->getInnerLocStart(), 4923 OldParm->getLocation(), 4924 OldParm->getIdentifier(), 4925 NewDI->getType(), 4926 NewDI, 4927 OldParm->getStorageClass(), 4928 /* DefArg */ nullptr); 4929 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4930 OldParm->getFunctionScopeIndex() + indexAdjustment); 4931 return newParm; 4932 } 4933 4934 template <typename Derived> 4935 bool TreeTransform<Derived>::TransformFunctionTypeParams( 4936 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 4937 const QualType *ParamTypes, 4938 const FunctionProtoType::ExtParameterInfo *ParamInfos, 4939 SmallVectorImpl<QualType> &OutParamTypes, 4940 SmallVectorImpl<ParmVarDecl *> *PVars, 4941 Sema::ExtParameterInfoBuilder &PInfos) { 4942 int indexAdjustment = 0; 4943 4944 unsigned NumParams = Params.size(); 4945 for (unsigned i = 0; i != NumParams; ++i) { 4946 if (ParmVarDecl *OldParm = Params[i]) { 4947 assert(OldParm->getFunctionScopeIndex() == i); 4948 4949 Optional<unsigned> NumExpansions; 4950 ParmVarDecl *NewParm = nullptr; 4951 if (OldParm->isParameterPack()) { 4952 // We have a function parameter pack that may need to be expanded. 4953 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4954 4955 // Find the parameter packs that could be expanded. 4956 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4957 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4958 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4959 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4960 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4961 4962 // Determine whether we should expand the parameter packs. 4963 bool ShouldExpand = false; 4964 bool RetainExpansion = false; 4965 Optional<unsigned> OrigNumExpansions = 4966 ExpansionTL.getTypePtr()->getNumExpansions(); 4967 NumExpansions = OrigNumExpansions; 4968 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4969 Pattern.getSourceRange(), 4970 Unexpanded, 4971 ShouldExpand, 4972 RetainExpansion, 4973 NumExpansions)) { 4974 return true; 4975 } 4976 4977 if (ShouldExpand) { 4978 // Expand the function parameter pack into multiple, separate 4979 // parameters. 4980 getDerived().ExpandingFunctionParameterPack(OldParm); 4981 for (unsigned I = 0; I != *NumExpansions; ++I) { 4982 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4983 ParmVarDecl *NewParm 4984 = getDerived().TransformFunctionTypeParam(OldParm, 4985 indexAdjustment++, 4986 OrigNumExpansions, 4987 /*ExpectParameterPack=*/false); 4988 if (!NewParm) 4989 return true; 4990 4991 if (ParamInfos) 4992 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4993 OutParamTypes.push_back(NewParm->getType()); 4994 if (PVars) 4995 PVars->push_back(NewParm); 4996 } 4997 4998 // If we're supposed to retain a pack expansion, do so by temporarily 4999 // forgetting the partially-substituted parameter pack. 5000 if (RetainExpansion) { 5001 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5002 ParmVarDecl *NewParm 5003 = getDerived().TransformFunctionTypeParam(OldParm, 5004 indexAdjustment++, 5005 OrigNumExpansions, 5006 /*ExpectParameterPack=*/false); 5007 if (!NewParm) 5008 return true; 5009 5010 if (ParamInfos) 5011 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5012 OutParamTypes.push_back(NewParm->getType()); 5013 if (PVars) 5014 PVars->push_back(NewParm); 5015 } 5016 5017 // The next parameter should have the same adjustment as the 5018 // last thing we pushed, but we post-incremented indexAdjustment 5019 // on every push. Also, if we push nothing, the adjustment should 5020 // go down by one. 5021 indexAdjustment--; 5022 5023 // We're done with the pack expansion. 5024 continue; 5025 } 5026 5027 // We'll substitute the parameter now without expanding the pack 5028 // expansion. 5029 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5030 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5031 indexAdjustment, 5032 NumExpansions, 5033 /*ExpectParameterPack=*/true); 5034 } else { 5035 NewParm = getDerived().TransformFunctionTypeParam( 5036 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5037 } 5038 5039 if (!NewParm) 5040 return true; 5041 5042 if (ParamInfos) 5043 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5044 OutParamTypes.push_back(NewParm->getType()); 5045 if (PVars) 5046 PVars->push_back(NewParm); 5047 continue; 5048 } 5049 5050 // Deal with the possibility that we don't have a parameter 5051 // declaration for this parameter. 5052 QualType OldType = ParamTypes[i]; 5053 bool IsPackExpansion = false; 5054 Optional<unsigned> NumExpansions; 5055 QualType NewType; 5056 if (const PackExpansionType *Expansion 5057 = dyn_cast<PackExpansionType>(OldType)) { 5058 // We have a function parameter pack that may need to be expanded. 5059 QualType Pattern = Expansion->getPattern(); 5060 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5061 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5062 5063 // Determine whether we should expand the parameter packs. 5064 bool ShouldExpand = false; 5065 bool RetainExpansion = false; 5066 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5067 Unexpanded, 5068 ShouldExpand, 5069 RetainExpansion, 5070 NumExpansions)) { 5071 return true; 5072 } 5073 5074 if (ShouldExpand) { 5075 // Expand the function parameter pack into multiple, separate 5076 // parameters. 5077 for (unsigned I = 0; I != *NumExpansions; ++I) { 5078 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5079 QualType NewType = getDerived().TransformType(Pattern); 5080 if (NewType.isNull()) 5081 return true; 5082 5083 if (NewType->containsUnexpandedParameterPack()) { 5084 NewType = 5085 getSema().getASTContext().getPackExpansionType(NewType, None); 5086 5087 if (NewType.isNull()) 5088 return true; 5089 } 5090 5091 if (ParamInfos) 5092 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5093 OutParamTypes.push_back(NewType); 5094 if (PVars) 5095 PVars->push_back(nullptr); 5096 } 5097 5098 // We're done with the pack expansion. 5099 continue; 5100 } 5101 5102 // If we're supposed to retain a pack expansion, do so by temporarily 5103 // forgetting the partially-substituted parameter pack. 5104 if (RetainExpansion) { 5105 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5106 QualType NewType = getDerived().TransformType(Pattern); 5107 if (NewType.isNull()) 5108 return true; 5109 5110 if (ParamInfos) 5111 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5112 OutParamTypes.push_back(NewType); 5113 if (PVars) 5114 PVars->push_back(nullptr); 5115 } 5116 5117 // We'll substitute the parameter now without expanding the pack 5118 // expansion. 5119 OldType = Expansion->getPattern(); 5120 IsPackExpansion = true; 5121 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5122 NewType = getDerived().TransformType(OldType); 5123 } else { 5124 NewType = getDerived().TransformType(OldType); 5125 } 5126 5127 if (NewType.isNull()) 5128 return true; 5129 5130 if (IsPackExpansion) 5131 NewType = getSema().Context.getPackExpansionType(NewType, 5132 NumExpansions); 5133 5134 if (ParamInfos) 5135 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5136 OutParamTypes.push_back(NewType); 5137 if (PVars) 5138 PVars->push_back(nullptr); 5139 } 5140 5141 #ifndef NDEBUG 5142 if (PVars) { 5143 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5144 if (ParmVarDecl *parm = (*PVars)[i]) 5145 assert(parm->getFunctionScopeIndex() == i); 5146 } 5147 #endif 5148 5149 return false; 5150 } 5151 5152 template<typename Derived> 5153 QualType 5154 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5155 FunctionProtoTypeLoc TL) { 5156 SmallVector<QualType, 4> ExceptionStorage; 5157 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5158 return getDerived().TransformFunctionProtoType( 5159 TLB, TL, nullptr, 0, 5160 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5161 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5162 ExceptionStorage, Changed); 5163 }); 5164 } 5165 5166 template<typename Derived> template<typename Fn> 5167 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5168 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5169 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5170 5171 // Transform the parameters and return type. 5172 // 5173 // We are required to instantiate the params and return type in source order. 5174 // When the function has a trailing return type, we instantiate the 5175 // parameters before the return type, since the return type can then refer 5176 // to the parameters themselves (via decltype, sizeof, etc.). 5177 // 5178 SmallVector<QualType, 4> ParamTypes; 5179 SmallVector<ParmVarDecl*, 4> ParamDecls; 5180 Sema::ExtParameterInfoBuilder ExtParamInfos; 5181 const FunctionProtoType *T = TL.getTypePtr(); 5182 5183 QualType ResultType; 5184 5185 if (T->hasTrailingReturn()) { 5186 if (getDerived().TransformFunctionTypeParams( 5187 TL.getBeginLoc(), TL.getParams(), 5188 TL.getTypePtr()->param_type_begin(), 5189 T->getExtParameterInfosOrNull(), 5190 ParamTypes, &ParamDecls, ExtParamInfos)) 5191 return QualType(); 5192 5193 { 5194 // C++11 [expr.prim.general]p3: 5195 // If a declaration declares a member function or member function 5196 // template of a class X, the expression this is a prvalue of type 5197 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5198 // and the end of the function-definition, member-declarator, or 5199 // declarator. 5200 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5201 5202 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5203 if (ResultType.isNull()) 5204 return QualType(); 5205 } 5206 } 5207 else { 5208 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5209 if (ResultType.isNull()) 5210 return QualType(); 5211 5212 if (getDerived().TransformFunctionTypeParams( 5213 TL.getBeginLoc(), TL.getParams(), 5214 TL.getTypePtr()->param_type_begin(), 5215 T->getExtParameterInfosOrNull(), 5216 ParamTypes, &ParamDecls, ExtParamInfos)) 5217 return QualType(); 5218 } 5219 5220 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5221 5222 bool EPIChanged = false; 5223 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5224 return QualType(); 5225 5226 // Handle extended parameter information. 5227 if (auto NewExtParamInfos = 5228 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5229 if (!EPI.ExtParameterInfos || 5230 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5231 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5232 EPIChanged = true; 5233 } 5234 EPI.ExtParameterInfos = NewExtParamInfos; 5235 } else if (EPI.ExtParameterInfos) { 5236 EPIChanged = true; 5237 EPI.ExtParameterInfos = nullptr; 5238 } 5239 5240 QualType Result = TL.getType(); 5241 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5242 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5243 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5244 if (Result.isNull()) 5245 return QualType(); 5246 } 5247 5248 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5249 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5250 NewTL.setLParenLoc(TL.getLParenLoc()); 5251 NewTL.setRParenLoc(TL.getRParenLoc()); 5252 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5253 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5254 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5255 NewTL.setParam(i, ParamDecls[i]); 5256 5257 return Result; 5258 } 5259 5260 template<typename Derived> 5261 bool TreeTransform<Derived>::TransformExceptionSpec( 5262 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5263 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5264 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5265 5266 // Instantiate a dynamic noexcept expression, if any. 5267 if (ESI.Type == EST_ComputedNoexcept) { 5268 EnterExpressionEvaluationContext Unevaluated( 5269 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5270 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5271 if (NoexceptExpr.isInvalid()) 5272 return true; 5273 5274 // FIXME: This is bogus, a noexcept expression is not a condition. 5275 NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get()); 5276 if (NoexceptExpr.isInvalid()) 5277 return true; 5278 5279 if (!NoexceptExpr.get()->isValueDependent()) { 5280 NoexceptExpr = getSema().VerifyIntegerConstantExpression( 5281 NoexceptExpr.get(), nullptr, 5282 diag::err_noexcept_needs_constant_expression, 5283 /*AllowFold*/false); 5284 if (NoexceptExpr.isInvalid()) 5285 return true; 5286 } 5287 5288 if (ESI.NoexceptExpr != NoexceptExpr.get()) 5289 Changed = true; 5290 ESI.NoexceptExpr = NoexceptExpr.get(); 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 /// \brief 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, T->getIdentifier(), 6149 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 8893 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8894 return E; 8895 } 8896 8897 template<typename Derived> 8898 ExprResult 8899 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8900 return E; 8901 } 8902 8903 template<typename Derived> 8904 ExprResult 8905 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8906 return E; 8907 } 8908 8909 template<typename Derived> 8910 ExprResult 8911 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8912 return E; 8913 } 8914 8915 template<typename Derived> 8916 ExprResult 8917 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8918 if (FunctionDecl *FD = E->getDirectCallee()) 8919 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 8920 return SemaRef.MaybeBindToTemporary(E); 8921 } 8922 8923 template<typename Derived> 8924 ExprResult 8925 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8926 ExprResult ControllingExpr = 8927 getDerived().TransformExpr(E->getControllingExpr()); 8928 if (ControllingExpr.isInvalid()) 8929 return ExprError(); 8930 8931 SmallVector<Expr *, 4> AssocExprs; 8932 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8933 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8934 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8935 if (TS) { 8936 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8937 if (!AssocType) 8938 return ExprError(); 8939 AssocTypes.push_back(AssocType); 8940 } else { 8941 AssocTypes.push_back(nullptr); 8942 } 8943 8944 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8945 if (AssocExpr.isInvalid()) 8946 return ExprError(); 8947 AssocExprs.push_back(AssocExpr.get()); 8948 } 8949 8950 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 8951 E->getDefaultLoc(), 8952 E->getRParenLoc(), 8953 ControllingExpr.get(), 8954 AssocTypes, 8955 AssocExprs); 8956 } 8957 8958 template<typename Derived> 8959 ExprResult 8960 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 8961 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8962 if (SubExpr.isInvalid()) 8963 return ExprError(); 8964 8965 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8966 return E; 8967 8968 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 8969 E->getRParen()); 8970 } 8971 8972 /// \brief The operand of a unary address-of operator has special rules: it's 8973 /// allowed to refer to a non-static member of a class even if there's no 'this' 8974 /// object available. 8975 template<typename Derived> 8976 ExprResult 8977 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 8978 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 8979 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 8980 else 8981 return getDerived().TransformExpr(E); 8982 } 8983 8984 template<typename Derived> 8985 ExprResult 8986 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 8987 ExprResult SubExpr; 8988 if (E->getOpcode() == UO_AddrOf) 8989 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 8990 else 8991 SubExpr = TransformExpr(E->getSubExpr()); 8992 if (SubExpr.isInvalid()) 8993 return ExprError(); 8994 8995 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8996 return E; 8997 8998 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 8999 E->getOpcode(), 9000 SubExpr.get()); 9001 } 9002 9003 template<typename Derived> 9004 ExprResult 9005 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9006 // Transform the type. 9007 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9008 if (!Type) 9009 return ExprError(); 9010 9011 // Transform all of the components into components similar to what the 9012 // parser uses. 9013 // FIXME: It would be slightly more efficient in the non-dependent case to 9014 // just map FieldDecls, rather than requiring the rebuilder to look for 9015 // the fields again. However, __builtin_offsetof is rare enough in 9016 // template code that we don't care. 9017 bool ExprChanged = false; 9018 typedef Sema::OffsetOfComponent Component; 9019 SmallVector<Component, 4> Components; 9020 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9021 const OffsetOfNode &ON = E->getComponent(I); 9022 Component Comp; 9023 Comp.isBrackets = true; 9024 Comp.LocStart = ON.getSourceRange().getBegin(); 9025 Comp.LocEnd = ON.getSourceRange().getEnd(); 9026 switch (ON.getKind()) { 9027 case OffsetOfNode::Array: { 9028 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9029 ExprResult Index = getDerived().TransformExpr(FromIndex); 9030 if (Index.isInvalid()) 9031 return ExprError(); 9032 9033 ExprChanged = ExprChanged || Index.get() != FromIndex; 9034 Comp.isBrackets = true; 9035 Comp.U.E = Index.get(); 9036 break; 9037 } 9038 9039 case OffsetOfNode::Field: 9040 case OffsetOfNode::Identifier: 9041 Comp.isBrackets = false; 9042 Comp.U.IdentInfo = ON.getFieldName(); 9043 if (!Comp.U.IdentInfo) 9044 continue; 9045 9046 break; 9047 9048 case OffsetOfNode::Base: 9049 // Will be recomputed during the rebuild. 9050 continue; 9051 } 9052 9053 Components.push_back(Comp); 9054 } 9055 9056 // If nothing changed, retain the existing expression. 9057 if (!getDerived().AlwaysRebuild() && 9058 Type == E->getTypeSourceInfo() && 9059 !ExprChanged) 9060 return E; 9061 9062 // Build a new offsetof expression. 9063 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9064 Components, E->getRParenLoc()); 9065 } 9066 9067 template<typename Derived> 9068 ExprResult 9069 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9070 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9071 "opaque value expression requires transformation"); 9072 return E; 9073 } 9074 9075 template<typename Derived> 9076 ExprResult 9077 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9078 return E; 9079 } 9080 9081 template<typename Derived> 9082 ExprResult 9083 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9084 // Rebuild the syntactic form. The original syntactic form has 9085 // opaque-value expressions in it, so strip those away and rebuild 9086 // the result. This is a really awful way of doing this, but the 9087 // better solution (rebuilding the semantic expressions and 9088 // rebinding OVEs as necessary) doesn't work; we'd need 9089 // TreeTransform to not strip away implicit conversions. 9090 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9091 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9092 if (result.isInvalid()) return ExprError(); 9093 9094 // If that gives us a pseudo-object result back, the pseudo-object 9095 // expression must have been an lvalue-to-rvalue conversion which we 9096 // should reapply. 9097 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9098 result = SemaRef.checkPseudoObjectRValue(result.get()); 9099 9100 return result; 9101 } 9102 9103 template<typename Derived> 9104 ExprResult 9105 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9106 UnaryExprOrTypeTraitExpr *E) { 9107 if (E->isArgumentType()) { 9108 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9109 9110 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9111 if (!NewT) 9112 return ExprError(); 9113 9114 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9115 return E; 9116 9117 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9118 E->getKind(), 9119 E->getSourceRange()); 9120 } 9121 9122 // C++0x [expr.sizeof]p1: 9123 // The operand is either an expression, which is an unevaluated operand 9124 // [...] 9125 EnterExpressionEvaluationContext Unevaluated( 9126 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9127 Sema::ReuseLambdaContextDecl); 9128 9129 // Try to recover if we have something like sizeof(T::X) where X is a type. 9130 // Notably, there must be *exactly* one set of parens if X is a type. 9131 TypeSourceInfo *RecoveryTSI = nullptr; 9132 ExprResult SubExpr; 9133 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9134 if (auto *DRE = 9135 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9136 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9137 PE, DRE, false, &RecoveryTSI); 9138 else 9139 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9140 9141 if (RecoveryTSI) { 9142 return getDerived().RebuildUnaryExprOrTypeTrait( 9143 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9144 } else if (SubExpr.isInvalid()) 9145 return ExprError(); 9146 9147 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9148 return E; 9149 9150 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9151 E->getOperatorLoc(), 9152 E->getKind(), 9153 E->getSourceRange()); 9154 } 9155 9156 template<typename Derived> 9157 ExprResult 9158 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9159 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9160 if (LHS.isInvalid()) 9161 return ExprError(); 9162 9163 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9164 if (RHS.isInvalid()) 9165 return ExprError(); 9166 9167 9168 if (!getDerived().AlwaysRebuild() && 9169 LHS.get() == E->getLHS() && 9170 RHS.get() == E->getRHS()) 9171 return E; 9172 9173 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 9174 /*FIXME:*/E->getLHS()->getLocStart(), 9175 RHS.get(), 9176 E->getRBracketLoc()); 9177 } 9178 9179 template <typename Derived> 9180 ExprResult 9181 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9182 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9183 if (Base.isInvalid()) 9184 return ExprError(); 9185 9186 ExprResult LowerBound; 9187 if (E->getLowerBound()) { 9188 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9189 if (LowerBound.isInvalid()) 9190 return ExprError(); 9191 } 9192 9193 ExprResult Length; 9194 if (E->getLength()) { 9195 Length = getDerived().TransformExpr(E->getLength()); 9196 if (Length.isInvalid()) 9197 return ExprError(); 9198 } 9199 9200 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9201 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9202 return E; 9203 9204 return getDerived().RebuildOMPArraySectionExpr( 9205 Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(), 9206 Length.get(), E->getRBracketLoc()); 9207 } 9208 9209 template<typename Derived> 9210 ExprResult 9211 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9212 // Transform the callee. 9213 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9214 if (Callee.isInvalid()) 9215 return ExprError(); 9216 9217 // Transform arguments. 9218 bool ArgChanged = false; 9219 SmallVector<Expr*, 8> Args; 9220 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9221 &ArgChanged)) 9222 return ExprError(); 9223 9224 if (!getDerived().AlwaysRebuild() && 9225 Callee.get() == E->getCallee() && 9226 !ArgChanged) 9227 return SemaRef.MaybeBindToTemporary(E); 9228 9229 // FIXME: Wrong source location information for the '('. 9230 SourceLocation FakeLParenLoc 9231 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9232 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9233 Args, 9234 E->getRParenLoc()); 9235 } 9236 9237 template<typename Derived> 9238 ExprResult 9239 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9240 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9241 if (Base.isInvalid()) 9242 return ExprError(); 9243 9244 NestedNameSpecifierLoc QualifierLoc; 9245 if (E->hasQualifier()) { 9246 QualifierLoc 9247 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9248 9249 if (!QualifierLoc) 9250 return ExprError(); 9251 } 9252 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9253 9254 ValueDecl *Member 9255 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9256 E->getMemberDecl())); 9257 if (!Member) 9258 return ExprError(); 9259 9260 NamedDecl *FoundDecl = E->getFoundDecl(); 9261 if (FoundDecl == E->getMemberDecl()) { 9262 FoundDecl = Member; 9263 } else { 9264 FoundDecl = cast_or_null<NamedDecl>( 9265 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9266 if (!FoundDecl) 9267 return ExprError(); 9268 } 9269 9270 if (!getDerived().AlwaysRebuild() && 9271 Base.get() == E->getBase() && 9272 QualifierLoc == E->getQualifierLoc() && 9273 Member == E->getMemberDecl() && 9274 FoundDecl == E->getFoundDecl() && 9275 !E->hasExplicitTemplateArgs()) { 9276 9277 // Mark it referenced in the new context regardless. 9278 // FIXME: this is a bit instantiation-specific. 9279 SemaRef.MarkMemberReferenced(E); 9280 9281 return E; 9282 } 9283 9284 TemplateArgumentListInfo TransArgs; 9285 if (E->hasExplicitTemplateArgs()) { 9286 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9287 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9288 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9289 E->getNumTemplateArgs(), 9290 TransArgs)) 9291 return ExprError(); 9292 } 9293 9294 // FIXME: Bogus source location for the operator 9295 SourceLocation FakeOperatorLoc = 9296 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9297 9298 // FIXME: to do this check properly, we will need to preserve the 9299 // first-qualifier-in-scope here, just in case we had a dependent 9300 // base (and therefore couldn't do the check) and a 9301 // nested-name-qualifier (and therefore could do the lookup). 9302 NamedDecl *FirstQualifierInScope = nullptr; 9303 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9304 if (MemberNameInfo.getName()) { 9305 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9306 if (!MemberNameInfo.getName()) 9307 return ExprError(); 9308 } 9309 9310 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9311 E->isArrow(), 9312 QualifierLoc, 9313 TemplateKWLoc, 9314 MemberNameInfo, 9315 Member, 9316 FoundDecl, 9317 (E->hasExplicitTemplateArgs() 9318 ? &TransArgs : nullptr), 9319 FirstQualifierInScope); 9320 } 9321 9322 template<typename Derived> 9323 ExprResult 9324 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9325 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9326 if (LHS.isInvalid()) 9327 return ExprError(); 9328 9329 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9330 if (RHS.isInvalid()) 9331 return ExprError(); 9332 9333 if (!getDerived().AlwaysRebuild() && 9334 LHS.get() == E->getLHS() && 9335 RHS.get() == E->getRHS()) 9336 return E; 9337 9338 Sema::FPContractStateRAII FPContractState(getSema()); 9339 getSema().FPFeatures = E->getFPFeatures(); 9340 9341 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9342 LHS.get(), RHS.get()); 9343 } 9344 9345 template<typename Derived> 9346 ExprResult 9347 TreeTransform<Derived>::TransformCompoundAssignOperator( 9348 CompoundAssignOperator *E) { 9349 return getDerived().TransformBinaryOperator(E); 9350 } 9351 9352 template<typename Derived> 9353 ExprResult TreeTransform<Derived>:: 9354 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9355 // Just rebuild the common and RHS expressions and see whether we 9356 // get any changes. 9357 9358 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9359 if (commonExpr.isInvalid()) 9360 return ExprError(); 9361 9362 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9363 if (rhs.isInvalid()) 9364 return ExprError(); 9365 9366 if (!getDerived().AlwaysRebuild() && 9367 commonExpr.get() == e->getCommon() && 9368 rhs.get() == e->getFalseExpr()) 9369 return e; 9370 9371 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9372 e->getQuestionLoc(), 9373 nullptr, 9374 e->getColonLoc(), 9375 rhs.get()); 9376 } 9377 9378 template<typename Derived> 9379 ExprResult 9380 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9381 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9382 if (Cond.isInvalid()) 9383 return ExprError(); 9384 9385 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9386 if (LHS.isInvalid()) 9387 return ExprError(); 9388 9389 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9390 if (RHS.isInvalid()) 9391 return ExprError(); 9392 9393 if (!getDerived().AlwaysRebuild() && 9394 Cond.get() == E->getCond() && 9395 LHS.get() == E->getLHS() && 9396 RHS.get() == E->getRHS()) 9397 return E; 9398 9399 return getDerived().RebuildConditionalOperator(Cond.get(), 9400 E->getQuestionLoc(), 9401 LHS.get(), 9402 E->getColonLoc(), 9403 RHS.get()); 9404 } 9405 9406 template<typename Derived> 9407 ExprResult 9408 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9409 // Implicit casts are eliminated during transformation, since they 9410 // will be recomputed by semantic analysis after transformation. 9411 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9412 } 9413 9414 template<typename Derived> 9415 ExprResult 9416 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9417 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9418 if (!Type) 9419 return ExprError(); 9420 9421 ExprResult SubExpr 9422 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9423 if (SubExpr.isInvalid()) 9424 return ExprError(); 9425 9426 if (!getDerived().AlwaysRebuild() && 9427 Type == E->getTypeInfoAsWritten() && 9428 SubExpr.get() == E->getSubExpr()) 9429 return E; 9430 9431 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9432 Type, 9433 E->getRParenLoc(), 9434 SubExpr.get()); 9435 } 9436 9437 template<typename Derived> 9438 ExprResult 9439 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9440 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9441 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9442 if (!NewT) 9443 return ExprError(); 9444 9445 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9446 if (Init.isInvalid()) 9447 return ExprError(); 9448 9449 if (!getDerived().AlwaysRebuild() && 9450 OldT == NewT && 9451 Init.get() == E->getInitializer()) 9452 return SemaRef.MaybeBindToTemporary(E); 9453 9454 // Note: the expression type doesn't necessarily match the 9455 // type-as-written, but that's okay, because it should always be 9456 // derivable from the initializer. 9457 9458 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 9459 /*FIXME:*/E->getInitializer()->getLocEnd(), 9460 Init.get()); 9461 } 9462 9463 template<typename Derived> 9464 ExprResult 9465 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9466 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9467 if (Base.isInvalid()) 9468 return ExprError(); 9469 9470 if (!getDerived().AlwaysRebuild() && 9471 Base.get() == E->getBase()) 9472 return E; 9473 9474 // FIXME: Bad source location 9475 SourceLocation FakeOperatorLoc = 9476 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 9477 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9478 E->getAccessorLoc(), 9479 E->getAccessor()); 9480 } 9481 9482 template<typename Derived> 9483 ExprResult 9484 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9485 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9486 E = Syntactic; 9487 9488 bool InitChanged = false; 9489 9490 SmallVector<Expr*, 4> Inits; 9491 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9492 Inits, &InitChanged)) 9493 return ExprError(); 9494 9495 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9496 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9497 // in some cases. We can't reuse it in general, because the syntactic and 9498 // semantic forms are linked, and we can't know that semantic form will 9499 // match even if the syntactic form does. 9500 } 9501 9502 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9503 E->getRBraceLoc()); 9504 } 9505 9506 template<typename Derived> 9507 ExprResult 9508 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9509 Designation Desig; 9510 9511 // transform the initializer value 9512 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9513 if (Init.isInvalid()) 9514 return ExprError(); 9515 9516 // transform the designators. 9517 SmallVector<Expr*, 4> ArrayExprs; 9518 bool ExprChanged = false; 9519 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9520 if (D.isFieldDesignator()) { 9521 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9522 D.getDotLoc(), 9523 D.getFieldLoc())); 9524 if (D.getField()) { 9525 FieldDecl *Field = cast_or_null<FieldDecl>( 9526 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9527 if (Field != D.getField()) 9528 // Rebuild the expression when the transformed FieldDecl is 9529 // different to the already assigned FieldDecl. 9530 ExprChanged = true; 9531 } else { 9532 // Ensure that the designator expression is rebuilt when there isn't 9533 // a resolved FieldDecl in the designator as we don't want to assign 9534 // a FieldDecl to a pattern designator that will be instantiated again. 9535 ExprChanged = true; 9536 } 9537 continue; 9538 } 9539 9540 if (D.isArrayDesignator()) { 9541 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9542 if (Index.isInvalid()) 9543 return ExprError(); 9544 9545 Desig.AddDesignator( 9546 Designator::getArray(Index.get(), D.getLBracketLoc())); 9547 9548 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9549 ArrayExprs.push_back(Index.get()); 9550 continue; 9551 } 9552 9553 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9554 ExprResult Start 9555 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9556 if (Start.isInvalid()) 9557 return ExprError(); 9558 9559 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9560 if (End.isInvalid()) 9561 return ExprError(); 9562 9563 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9564 End.get(), 9565 D.getLBracketLoc(), 9566 D.getEllipsisLoc())); 9567 9568 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9569 End.get() != E->getArrayRangeEnd(D); 9570 9571 ArrayExprs.push_back(Start.get()); 9572 ArrayExprs.push_back(End.get()); 9573 } 9574 9575 if (!getDerived().AlwaysRebuild() && 9576 Init.get() == E->getInit() && 9577 !ExprChanged) 9578 return E; 9579 9580 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9581 E->getEqualOrColonLoc(), 9582 E->usesGNUSyntax(), Init.get()); 9583 } 9584 9585 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9586 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9587 template<typename Derived> 9588 ExprResult 9589 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9590 DesignatedInitUpdateExpr *E) { 9591 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9592 "initializer"); 9593 return ExprError(); 9594 } 9595 9596 template<typename Derived> 9597 ExprResult 9598 TreeTransform<Derived>::TransformNoInitExpr( 9599 NoInitExpr *E) { 9600 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9601 return ExprError(); 9602 } 9603 9604 template<typename Derived> 9605 ExprResult 9606 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9607 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9608 return ExprError(); 9609 } 9610 9611 template<typename Derived> 9612 ExprResult 9613 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9614 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9615 return ExprError(); 9616 } 9617 9618 template<typename Derived> 9619 ExprResult 9620 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9621 ImplicitValueInitExpr *E) { 9622 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 9623 9624 // FIXME: Will we ever have proper type location here? Will we actually 9625 // need to transform the type? 9626 QualType T = getDerived().TransformType(E->getType()); 9627 if (T.isNull()) 9628 return ExprError(); 9629 9630 if (!getDerived().AlwaysRebuild() && 9631 T == E->getType()) 9632 return E; 9633 9634 return getDerived().RebuildImplicitValueInitExpr(T); 9635 } 9636 9637 template<typename Derived> 9638 ExprResult 9639 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9640 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9641 if (!TInfo) 9642 return ExprError(); 9643 9644 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9645 if (SubExpr.isInvalid()) 9646 return ExprError(); 9647 9648 if (!getDerived().AlwaysRebuild() && 9649 TInfo == E->getWrittenTypeInfo() && 9650 SubExpr.get() == E->getSubExpr()) 9651 return E; 9652 9653 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9654 TInfo, E->getRParenLoc()); 9655 } 9656 9657 template<typename Derived> 9658 ExprResult 9659 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9660 bool ArgumentChanged = false; 9661 SmallVector<Expr*, 4> Inits; 9662 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9663 &ArgumentChanged)) 9664 return ExprError(); 9665 9666 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9667 Inits, 9668 E->getRParenLoc()); 9669 } 9670 9671 /// \brief Transform an address-of-label expression. 9672 /// 9673 /// By default, the transformation of an address-of-label expression always 9674 /// rebuilds the expression, so that the label identifier can be resolved to 9675 /// the corresponding label statement by semantic analysis. 9676 template<typename Derived> 9677 ExprResult 9678 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9679 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9680 E->getLabel()); 9681 if (!LD) 9682 return ExprError(); 9683 9684 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9685 cast<LabelDecl>(LD)); 9686 } 9687 9688 template<typename Derived> 9689 ExprResult 9690 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9691 SemaRef.ActOnStartStmtExpr(); 9692 StmtResult SubStmt 9693 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9694 if (SubStmt.isInvalid()) { 9695 SemaRef.ActOnStmtExprError(); 9696 return ExprError(); 9697 } 9698 9699 if (!getDerived().AlwaysRebuild() && 9700 SubStmt.get() == E->getSubStmt()) { 9701 // Calling this an 'error' is unintuitive, but it does the right thing. 9702 SemaRef.ActOnStmtExprError(); 9703 return SemaRef.MaybeBindToTemporary(E); 9704 } 9705 9706 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9707 SubStmt.get(), 9708 E->getRParenLoc()); 9709 } 9710 9711 template<typename Derived> 9712 ExprResult 9713 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9714 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9715 if (Cond.isInvalid()) 9716 return ExprError(); 9717 9718 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9719 if (LHS.isInvalid()) 9720 return ExprError(); 9721 9722 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9723 if (RHS.isInvalid()) 9724 return ExprError(); 9725 9726 if (!getDerived().AlwaysRebuild() && 9727 Cond.get() == E->getCond() && 9728 LHS.get() == E->getLHS() && 9729 RHS.get() == E->getRHS()) 9730 return E; 9731 9732 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9733 Cond.get(), LHS.get(), RHS.get(), 9734 E->getRParenLoc()); 9735 } 9736 9737 template<typename Derived> 9738 ExprResult 9739 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9740 return E; 9741 } 9742 9743 template<typename Derived> 9744 ExprResult 9745 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9746 switch (E->getOperator()) { 9747 case OO_New: 9748 case OO_Delete: 9749 case OO_Array_New: 9750 case OO_Array_Delete: 9751 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9752 9753 case OO_Call: { 9754 // This is a call to an object's operator(). 9755 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9756 9757 // Transform the object itself. 9758 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9759 if (Object.isInvalid()) 9760 return ExprError(); 9761 9762 // FIXME: Poor location information 9763 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9764 static_cast<Expr *>(Object.get())->getLocEnd()); 9765 9766 // Transform the call arguments. 9767 SmallVector<Expr*, 8> Args; 9768 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9769 Args)) 9770 return ExprError(); 9771 9772 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 9773 Args, 9774 E->getLocEnd()); 9775 } 9776 9777 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9778 case OO_##Name: 9779 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9780 #include "clang/Basic/OperatorKinds.def" 9781 case OO_Subscript: 9782 // Handled below. 9783 break; 9784 9785 case OO_Conditional: 9786 llvm_unreachable("conditional operator is not actually overloadable"); 9787 9788 case OO_None: 9789 case NUM_OVERLOADED_OPERATORS: 9790 llvm_unreachable("not an overloaded operator?"); 9791 } 9792 9793 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9794 if (Callee.isInvalid()) 9795 return ExprError(); 9796 9797 ExprResult First; 9798 if (E->getOperator() == OO_Amp) 9799 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9800 else 9801 First = getDerived().TransformExpr(E->getArg(0)); 9802 if (First.isInvalid()) 9803 return ExprError(); 9804 9805 ExprResult Second; 9806 if (E->getNumArgs() == 2) { 9807 Second = getDerived().TransformExpr(E->getArg(1)); 9808 if (Second.isInvalid()) 9809 return ExprError(); 9810 } 9811 9812 if (!getDerived().AlwaysRebuild() && 9813 Callee.get() == E->getCallee() && 9814 First.get() == E->getArg(0) && 9815 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9816 return SemaRef.MaybeBindToTemporary(E); 9817 9818 Sema::FPContractStateRAII FPContractState(getSema()); 9819 getSema().FPFeatures = E->getFPFeatures(); 9820 9821 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9822 E->getOperatorLoc(), 9823 Callee.get(), 9824 First.get(), 9825 Second.get()); 9826 } 9827 9828 template<typename Derived> 9829 ExprResult 9830 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9831 return getDerived().TransformCallExpr(E); 9832 } 9833 9834 template<typename Derived> 9835 ExprResult 9836 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9837 // Transform the callee. 9838 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9839 if (Callee.isInvalid()) 9840 return ExprError(); 9841 9842 // Transform exec config. 9843 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9844 if (EC.isInvalid()) 9845 return ExprError(); 9846 9847 // Transform arguments. 9848 bool ArgChanged = false; 9849 SmallVector<Expr*, 8> Args; 9850 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9851 &ArgChanged)) 9852 return ExprError(); 9853 9854 if (!getDerived().AlwaysRebuild() && 9855 Callee.get() == E->getCallee() && 9856 !ArgChanged) 9857 return SemaRef.MaybeBindToTemporary(E); 9858 9859 // FIXME: Wrong source location information for the '('. 9860 SourceLocation FakeLParenLoc 9861 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9862 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9863 Args, 9864 E->getRParenLoc(), EC.get()); 9865 } 9866 9867 template<typename Derived> 9868 ExprResult 9869 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9870 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9871 if (!Type) 9872 return ExprError(); 9873 9874 ExprResult SubExpr 9875 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9876 if (SubExpr.isInvalid()) 9877 return ExprError(); 9878 9879 if (!getDerived().AlwaysRebuild() && 9880 Type == E->getTypeInfoAsWritten() && 9881 SubExpr.get() == E->getSubExpr()) 9882 return E; 9883 return getDerived().RebuildCXXNamedCastExpr( 9884 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9885 Type, E->getAngleBrackets().getEnd(), 9886 // FIXME. this should be '(' location 9887 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9888 } 9889 9890 template<typename Derived> 9891 ExprResult 9892 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9893 return getDerived().TransformCXXNamedCastExpr(E); 9894 } 9895 9896 template<typename Derived> 9897 ExprResult 9898 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9899 return getDerived().TransformCXXNamedCastExpr(E); 9900 } 9901 9902 template<typename Derived> 9903 ExprResult 9904 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9905 CXXReinterpretCastExpr *E) { 9906 return getDerived().TransformCXXNamedCastExpr(E); 9907 } 9908 9909 template<typename Derived> 9910 ExprResult 9911 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9912 return getDerived().TransformCXXNamedCastExpr(E); 9913 } 9914 9915 template<typename Derived> 9916 ExprResult 9917 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9918 CXXFunctionalCastExpr *E) { 9919 TypeSourceInfo *Type = 9920 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 9921 if (!Type) 9922 return ExprError(); 9923 9924 ExprResult SubExpr 9925 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9926 if (SubExpr.isInvalid()) 9927 return ExprError(); 9928 9929 if (!getDerived().AlwaysRebuild() && 9930 Type == E->getTypeInfoAsWritten() && 9931 SubExpr.get() == E->getSubExpr()) 9932 return E; 9933 9934 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9935 E->getLParenLoc(), 9936 SubExpr.get(), 9937 E->getRParenLoc(), 9938 E->isListInitialization()); 9939 } 9940 9941 template<typename Derived> 9942 ExprResult 9943 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9944 if (E->isTypeOperand()) { 9945 TypeSourceInfo *TInfo 9946 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9947 if (!TInfo) 9948 return ExprError(); 9949 9950 if (!getDerived().AlwaysRebuild() && 9951 TInfo == E->getTypeOperandSourceInfo()) 9952 return E; 9953 9954 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9955 E->getLocStart(), 9956 TInfo, 9957 E->getLocEnd()); 9958 } 9959 9960 // We don't know whether the subexpression is potentially evaluated until 9961 // after we perform semantic analysis. We speculatively assume it is 9962 // unevaluated; it will get fixed later if the subexpression is in fact 9963 // potentially evaluated. 9964 EnterExpressionEvaluationContext Unevaluated( 9965 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9966 Sema::ReuseLambdaContextDecl); 9967 9968 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9969 if (SubExpr.isInvalid()) 9970 return ExprError(); 9971 9972 if (!getDerived().AlwaysRebuild() && 9973 SubExpr.get() == E->getExprOperand()) 9974 return E; 9975 9976 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9977 E->getLocStart(), 9978 SubExpr.get(), 9979 E->getLocEnd()); 9980 } 9981 9982 template<typename Derived> 9983 ExprResult 9984 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 9985 if (E->isTypeOperand()) { 9986 TypeSourceInfo *TInfo 9987 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9988 if (!TInfo) 9989 return ExprError(); 9990 9991 if (!getDerived().AlwaysRebuild() && 9992 TInfo == E->getTypeOperandSourceInfo()) 9993 return E; 9994 9995 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9996 E->getLocStart(), 9997 TInfo, 9998 E->getLocEnd()); 9999 } 10000 10001 EnterExpressionEvaluationContext Unevaluated( 10002 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10003 10004 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10005 if (SubExpr.isInvalid()) 10006 return ExprError(); 10007 10008 if (!getDerived().AlwaysRebuild() && 10009 SubExpr.get() == E->getExprOperand()) 10010 return E; 10011 10012 return getDerived().RebuildCXXUuidofExpr(E->getType(), 10013 E->getLocStart(), 10014 SubExpr.get(), 10015 E->getLocEnd()); 10016 } 10017 10018 template<typename Derived> 10019 ExprResult 10020 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10021 return E; 10022 } 10023 10024 template<typename Derived> 10025 ExprResult 10026 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10027 CXXNullPtrLiteralExpr *E) { 10028 return E; 10029 } 10030 10031 template<typename Derived> 10032 ExprResult 10033 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10034 QualType T = getSema().getCurrentThisType(); 10035 10036 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10037 // Make sure that we capture 'this'. 10038 getSema().CheckCXXThisCapture(E->getLocStart()); 10039 return E; 10040 } 10041 10042 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 10043 } 10044 10045 template<typename Derived> 10046 ExprResult 10047 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10048 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10049 if (SubExpr.isInvalid()) 10050 return ExprError(); 10051 10052 if (!getDerived().AlwaysRebuild() && 10053 SubExpr.get() == E->getSubExpr()) 10054 return E; 10055 10056 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10057 E->isThrownVariableInScope()); 10058 } 10059 10060 template<typename Derived> 10061 ExprResult 10062 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10063 ParmVarDecl *Param 10064 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 10065 E->getParam())); 10066 if (!Param) 10067 return ExprError(); 10068 10069 if (!getDerived().AlwaysRebuild() && 10070 Param == E->getParam()) 10071 return E; 10072 10073 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10074 } 10075 10076 template<typename Derived> 10077 ExprResult 10078 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10079 FieldDecl *Field 10080 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 10081 E->getField())); 10082 if (!Field) 10083 return ExprError(); 10084 10085 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 10086 return E; 10087 10088 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10089 } 10090 10091 template<typename Derived> 10092 ExprResult 10093 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10094 CXXScalarValueInitExpr *E) { 10095 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10096 if (!T) 10097 return ExprError(); 10098 10099 if (!getDerived().AlwaysRebuild() && 10100 T == E->getTypeSourceInfo()) 10101 return E; 10102 10103 return getDerived().RebuildCXXScalarValueInitExpr(T, 10104 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10105 E->getRParenLoc()); 10106 } 10107 10108 template<typename Derived> 10109 ExprResult 10110 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10111 // Transform the type that we're allocating 10112 TypeSourceInfo *AllocTypeInfo = 10113 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10114 if (!AllocTypeInfo) 10115 return ExprError(); 10116 10117 // Transform the size of the array we're allocating (if any). 10118 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 10119 if (ArraySize.isInvalid()) 10120 return ExprError(); 10121 10122 // Transform the placement arguments (if any). 10123 bool ArgumentChanged = false; 10124 SmallVector<Expr*, 8> PlacementArgs; 10125 if (getDerived().TransformExprs(E->getPlacementArgs(), 10126 E->getNumPlacementArgs(), true, 10127 PlacementArgs, &ArgumentChanged)) 10128 return ExprError(); 10129 10130 // Transform the initializer (if any). 10131 Expr *OldInit = E->getInitializer(); 10132 ExprResult NewInit; 10133 if (OldInit) 10134 NewInit = getDerived().TransformInitializer(OldInit, true); 10135 if (NewInit.isInvalid()) 10136 return ExprError(); 10137 10138 // Transform new operator and delete operator. 10139 FunctionDecl *OperatorNew = nullptr; 10140 if (E->getOperatorNew()) { 10141 OperatorNew = cast_or_null<FunctionDecl>( 10142 getDerived().TransformDecl(E->getLocStart(), 10143 E->getOperatorNew())); 10144 if (!OperatorNew) 10145 return ExprError(); 10146 } 10147 10148 FunctionDecl *OperatorDelete = nullptr; 10149 if (E->getOperatorDelete()) { 10150 OperatorDelete = cast_or_null<FunctionDecl>( 10151 getDerived().TransformDecl(E->getLocStart(), 10152 E->getOperatorDelete())); 10153 if (!OperatorDelete) 10154 return ExprError(); 10155 } 10156 10157 if (!getDerived().AlwaysRebuild() && 10158 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10159 ArraySize.get() == E->getArraySize() && 10160 NewInit.get() == OldInit && 10161 OperatorNew == E->getOperatorNew() && 10162 OperatorDelete == E->getOperatorDelete() && 10163 !ArgumentChanged) { 10164 // Mark any declarations we need as referenced. 10165 // FIXME: instantiation-specific. 10166 if (OperatorNew) 10167 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 10168 if (OperatorDelete) 10169 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10170 10171 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10172 QualType ElementType 10173 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10174 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10175 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10176 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10177 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 10178 } 10179 } 10180 } 10181 10182 return E; 10183 } 10184 10185 QualType AllocType = AllocTypeInfo->getType(); 10186 if (!ArraySize.get()) { 10187 // If no array size was specified, but the new expression was 10188 // instantiated with an array type (e.g., "new T" where T is 10189 // instantiated with "int[4]"), extract the outer bound from the 10190 // array type as our array size. We do this with constant and 10191 // dependently-sized array types. 10192 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10193 if (!ArrayT) { 10194 // Do nothing 10195 } else if (const ConstantArrayType *ConsArrayT 10196 = dyn_cast<ConstantArrayType>(ArrayT)) { 10197 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10198 SemaRef.Context.getSizeType(), 10199 /*FIXME:*/ E->getLocStart()); 10200 AllocType = ConsArrayT->getElementType(); 10201 } else if (const DependentSizedArrayType *DepArrayT 10202 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10203 if (DepArrayT->getSizeExpr()) { 10204 ArraySize = DepArrayT->getSizeExpr(); 10205 AllocType = DepArrayT->getElementType(); 10206 } 10207 } 10208 } 10209 10210 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 10211 E->isGlobalNew(), 10212 /*FIXME:*/E->getLocStart(), 10213 PlacementArgs, 10214 /*FIXME:*/E->getLocStart(), 10215 E->getTypeIdParens(), 10216 AllocType, 10217 AllocTypeInfo, 10218 ArraySize.get(), 10219 E->getDirectInitRange(), 10220 NewInit.get()); 10221 } 10222 10223 template<typename Derived> 10224 ExprResult 10225 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10226 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10227 if (Operand.isInvalid()) 10228 return ExprError(); 10229 10230 // Transform the delete operator, if known. 10231 FunctionDecl *OperatorDelete = nullptr; 10232 if (E->getOperatorDelete()) { 10233 OperatorDelete = cast_or_null<FunctionDecl>( 10234 getDerived().TransformDecl(E->getLocStart(), 10235 E->getOperatorDelete())); 10236 if (!OperatorDelete) 10237 return ExprError(); 10238 } 10239 10240 if (!getDerived().AlwaysRebuild() && 10241 Operand.get() == E->getArgument() && 10242 OperatorDelete == E->getOperatorDelete()) { 10243 // Mark any declarations we need as referenced. 10244 // FIXME: instantiation-specific. 10245 if (OperatorDelete) 10246 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10247 10248 if (!E->getArgument()->isTypeDependent()) { 10249 QualType Destroyed = SemaRef.Context.getBaseElementType( 10250 E->getDestroyedType()); 10251 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10252 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10253 SemaRef.MarkFunctionReferenced(E->getLocStart(), 10254 SemaRef.LookupDestructor(Record)); 10255 } 10256 } 10257 10258 return E; 10259 } 10260 10261 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 10262 E->isGlobalDelete(), 10263 E->isArrayForm(), 10264 Operand.get()); 10265 } 10266 10267 template<typename Derived> 10268 ExprResult 10269 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10270 CXXPseudoDestructorExpr *E) { 10271 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10272 if (Base.isInvalid()) 10273 return ExprError(); 10274 10275 ParsedType ObjectTypePtr; 10276 bool MayBePseudoDestructor = false; 10277 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10278 E->getOperatorLoc(), 10279 E->isArrow()? tok::arrow : tok::period, 10280 ObjectTypePtr, 10281 MayBePseudoDestructor); 10282 if (Base.isInvalid()) 10283 return ExprError(); 10284 10285 QualType ObjectType = ObjectTypePtr.get(); 10286 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10287 if (QualifierLoc) { 10288 QualifierLoc 10289 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10290 if (!QualifierLoc) 10291 return ExprError(); 10292 } 10293 CXXScopeSpec SS; 10294 SS.Adopt(QualifierLoc); 10295 10296 PseudoDestructorTypeStorage Destroyed; 10297 if (E->getDestroyedTypeInfo()) { 10298 TypeSourceInfo *DestroyedTypeInfo 10299 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10300 ObjectType, nullptr, SS); 10301 if (!DestroyedTypeInfo) 10302 return ExprError(); 10303 Destroyed = DestroyedTypeInfo; 10304 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10305 // We aren't likely to be able to resolve the identifier down to a type 10306 // now anyway, so just retain the identifier. 10307 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10308 E->getDestroyedTypeLoc()); 10309 } else { 10310 // Look for a destructor known with the given name. 10311 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10312 *E->getDestroyedTypeIdentifier(), 10313 E->getDestroyedTypeLoc(), 10314 /*Scope=*/nullptr, 10315 SS, ObjectTypePtr, 10316 false); 10317 if (!T) 10318 return ExprError(); 10319 10320 Destroyed 10321 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10322 E->getDestroyedTypeLoc()); 10323 } 10324 10325 TypeSourceInfo *ScopeTypeInfo = nullptr; 10326 if (E->getScopeTypeInfo()) { 10327 CXXScopeSpec EmptySS; 10328 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10329 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10330 if (!ScopeTypeInfo) 10331 return ExprError(); 10332 } 10333 10334 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10335 E->getOperatorLoc(), 10336 E->isArrow(), 10337 SS, 10338 ScopeTypeInfo, 10339 E->getColonColonLoc(), 10340 E->getTildeLoc(), 10341 Destroyed); 10342 } 10343 10344 template <typename Derived> 10345 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10346 bool RequiresADL, 10347 LookupResult &R) { 10348 // Transform all the decls. 10349 bool AllEmptyPacks = true; 10350 for (auto *OldD : Old->decls()) { 10351 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10352 if (!InstD) { 10353 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10354 // This can happen because of dependent hiding. 10355 if (isa<UsingShadowDecl>(OldD)) 10356 continue; 10357 else { 10358 R.clear(); 10359 return true; 10360 } 10361 } 10362 10363 // Expand using pack declarations. 10364 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10365 ArrayRef<NamedDecl*> Decls = SingleDecl; 10366 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10367 Decls = UPD->expansions(); 10368 10369 // Expand using declarations. 10370 for (auto *D : Decls) { 10371 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10372 for (auto *SD : UD->shadows()) 10373 R.addDecl(SD); 10374 } else { 10375 R.addDecl(D); 10376 } 10377 } 10378 10379 AllEmptyPacks &= Decls.empty(); 10380 }; 10381 10382 // C++ [temp.res]/8.4.2: 10383 // The program is ill-formed, no diagnostic required, if [...] lookup for 10384 // a name in the template definition found a using-declaration, but the 10385 // lookup in the corresponding scope in the instantiation odoes not find 10386 // any declarations because the using-declaration was a pack expansion and 10387 // the corresponding pack is empty 10388 if (AllEmptyPacks && !RequiresADL) { 10389 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10390 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 10391 return true; 10392 } 10393 10394 // Resolve a kind, but don't do any further analysis. If it's 10395 // ambiguous, the callee needs to deal with it. 10396 R.resolveKind(); 10397 return false; 10398 } 10399 10400 template<typename Derived> 10401 ExprResult 10402 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10403 UnresolvedLookupExpr *Old) { 10404 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10405 Sema::LookupOrdinaryName); 10406 10407 // Transform the declaration set. 10408 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10409 return ExprError(); 10410 10411 // Rebuild the nested-name qualifier, if present. 10412 CXXScopeSpec SS; 10413 if (Old->getQualifierLoc()) { 10414 NestedNameSpecifierLoc QualifierLoc 10415 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10416 if (!QualifierLoc) 10417 return ExprError(); 10418 10419 SS.Adopt(QualifierLoc); 10420 } 10421 10422 if (Old->getNamingClass()) { 10423 CXXRecordDecl *NamingClass 10424 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10425 Old->getNameLoc(), 10426 Old->getNamingClass())); 10427 if (!NamingClass) { 10428 R.clear(); 10429 return ExprError(); 10430 } 10431 10432 R.setNamingClass(NamingClass); 10433 } 10434 10435 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10436 10437 // If we have neither explicit template arguments, nor the template keyword, 10438 // it's a normal declaration name or member reference. 10439 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10440 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10441 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10442 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10443 // give a good diagnostic. 10444 if (D && D->isCXXInstanceMember()) { 10445 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10446 /*TemplateArgs=*/nullptr, 10447 /*Scope=*/nullptr); 10448 } 10449 10450 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10451 } 10452 10453 // If we have template arguments, rebuild them, then rebuild the 10454 // templateid expression. 10455 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10456 if (Old->hasExplicitTemplateArgs() && 10457 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10458 Old->getNumTemplateArgs(), 10459 TransArgs)) { 10460 R.clear(); 10461 return ExprError(); 10462 } 10463 10464 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10465 Old->requiresADL(), &TransArgs); 10466 } 10467 10468 template<typename Derived> 10469 ExprResult 10470 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10471 bool ArgChanged = false; 10472 SmallVector<TypeSourceInfo *, 4> Args; 10473 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10474 TypeSourceInfo *From = E->getArg(I); 10475 TypeLoc FromTL = From->getTypeLoc(); 10476 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10477 TypeLocBuilder TLB; 10478 TLB.reserve(FromTL.getFullDataSize()); 10479 QualType To = getDerived().TransformType(TLB, FromTL); 10480 if (To.isNull()) 10481 return ExprError(); 10482 10483 if (To == From->getType()) 10484 Args.push_back(From); 10485 else { 10486 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10487 ArgChanged = true; 10488 } 10489 continue; 10490 } 10491 10492 ArgChanged = true; 10493 10494 // We have a pack expansion. Instantiate it. 10495 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10496 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10497 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10498 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10499 10500 // Determine whether the set of unexpanded parameter packs can and should 10501 // be expanded. 10502 bool Expand = true; 10503 bool RetainExpansion = false; 10504 Optional<unsigned> OrigNumExpansions = 10505 ExpansionTL.getTypePtr()->getNumExpansions(); 10506 Optional<unsigned> NumExpansions = OrigNumExpansions; 10507 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10508 PatternTL.getSourceRange(), 10509 Unexpanded, 10510 Expand, RetainExpansion, 10511 NumExpansions)) 10512 return ExprError(); 10513 10514 if (!Expand) { 10515 // The transform has determined that we should perform a simple 10516 // transformation on the pack expansion, producing another pack 10517 // expansion. 10518 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10519 10520 TypeLocBuilder TLB; 10521 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10522 10523 QualType To = getDerived().TransformType(TLB, PatternTL); 10524 if (To.isNull()) 10525 return ExprError(); 10526 10527 To = getDerived().RebuildPackExpansionType(To, 10528 PatternTL.getSourceRange(), 10529 ExpansionTL.getEllipsisLoc(), 10530 NumExpansions); 10531 if (To.isNull()) 10532 return ExprError(); 10533 10534 PackExpansionTypeLoc ToExpansionTL 10535 = TLB.push<PackExpansionTypeLoc>(To); 10536 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10537 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10538 continue; 10539 } 10540 10541 // Expand the pack expansion by substituting for each argument in the 10542 // pack(s). 10543 for (unsigned I = 0; I != *NumExpansions; ++I) { 10544 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10545 TypeLocBuilder TLB; 10546 TLB.reserve(PatternTL.getFullDataSize()); 10547 QualType To = getDerived().TransformType(TLB, PatternTL); 10548 if (To.isNull()) 10549 return ExprError(); 10550 10551 if (To->containsUnexpandedParameterPack()) { 10552 To = getDerived().RebuildPackExpansionType(To, 10553 PatternTL.getSourceRange(), 10554 ExpansionTL.getEllipsisLoc(), 10555 NumExpansions); 10556 if (To.isNull()) 10557 return ExprError(); 10558 10559 PackExpansionTypeLoc ToExpansionTL 10560 = TLB.push<PackExpansionTypeLoc>(To); 10561 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10562 } 10563 10564 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10565 } 10566 10567 if (!RetainExpansion) 10568 continue; 10569 10570 // If we're supposed to retain a pack expansion, do so by temporarily 10571 // forgetting the partially-substituted parameter pack. 10572 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10573 10574 TypeLocBuilder TLB; 10575 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10576 10577 QualType To = getDerived().TransformType(TLB, PatternTL); 10578 if (To.isNull()) 10579 return ExprError(); 10580 10581 To = getDerived().RebuildPackExpansionType(To, 10582 PatternTL.getSourceRange(), 10583 ExpansionTL.getEllipsisLoc(), 10584 NumExpansions); 10585 if (To.isNull()) 10586 return ExprError(); 10587 10588 PackExpansionTypeLoc ToExpansionTL 10589 = TLB.push<PackExpansionTypeLoc>(To); 10590 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10591 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10592 } 10593 10594 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10595 return E; 10596 10597 return getDerived().RebuildTypeTrait(E->getTrait(), 10598 E->getLocStart(), 10599 Args, 10600 E->getLocEnd()); 10601 } 10602 10603 template<typename Derived> 10604 ExprResult 10605 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10606 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10607 if (!T) 10608 return ExprError(); 10609 10610 if (!getDerived().AlwaysRebuild() && 10611 T == E->getQueriedTypeSourceInfo()) 10612 return E; 10613 10614 ExprResult SubExpr; 10615 { 10616 EnterExpressionEvaluationContext Unevaluated( 10617 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10618 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10619 if (SubExpr.isInvalid()) 10620 return ExprError(); 10621 10622 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10623 return E; 10624 } 10625 10626 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 10627 E->getLocStart(), 10628 T, 10629 SubExpr.get(), 10630 E->getLocEnd()); 10631 } 10632 10633 template<typename Derived> 10634 ExprResult 10635 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10636 ExprResult SubExpr; 10637 { 10638 EnterExpressionEvaluationContext Unevaluated( 10639 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10640 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10641 if (SubExpr.isInvalid()) 10642 return ExprError(); 10643 10644 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10645 return E; 10646 } 10647 10648 return getDerived().RebuildExpressionTrait( 10649 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 10650 } 10651 10652 template <typename Derived> 10653 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10654 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10655 TypeSourceInfo **RecoveryTSI) { 10656 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10657 DRE, AddrTaken, RecoveryTSI); 10658 10659 // Propagate both errors and recovered types, which return ExprEmpty. 10660 if (!NewDRE.isUsable()) 10661 return NewDRE; 10662 10663 // We got an expr, wrap it up in parens. 10664 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10665 return PE; 10666 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10667 PE->getRParen()); 10668 } 10669 10670 template <typename Derived> 10671 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10672 DependentScopeDeclRefExpr *E) { 10673 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10674 nullptr); 10675 } 10676 10677 template<typename Derived> 10678 ExprResult 10679 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10680 DependentScopeDeclRefExpr *E, 10681 bool IsAddressOfOperand, 10682 TypeSourceInfo **RecoveryTSI) { 10683 assert(E->getQualifierLoc()); 10684 NestedNameSpecifierLoc QualifierLoc 10685 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10686 if (!QualifierLoc) 10687 return ExprError(); 10688 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10689 10690 // TODO: If this is a conversion-function-id, verify that the 10691 // destination type name (if present) resolves the same way after 10692 // instantiation as it did in the local scope. 10693 10694 DeclarationNameInfo NameInfo 10695 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10696 if (!NameInfo.getName()) 10697 return ExprError(); 10698 10699 if (!E->hasExplicitTemplateArgs()) { 10700 if (!getDerived().AlwaysRebuild() && 10701 QualifierLoc == E->getQualifierLoc() && 10702 // Note: it is sufficient to compare the Name component of NameInfo: 10703 // if name has not changed, DNLoc has not changed either. 10704 NameInfo.getName() == E->getDeclName()) 10705 return E; 10706 10707 return getDerived().RebuildDependentScopeDeclRefExpr( 10708 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10709 IsAddressOfOperand, RecoveryTSI); 10710 } 10711 10712 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10713 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10714 E->getNumTemplateArgs(), 10715 TransArgs)) 10716 return ExprError(); 10717 10718 return getDerived().RebuildDependentScopeDeclRefExpr( 10719 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10720 RecoveryTSI); 10721 } 10722 10723 template<typename Derived> 10724 ExprResult 10725 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10726 // CXXConstructExprs other than for list-initialization and 10727 // CXXTemporaryObjectExpr are always implicit, so when we have 10728 // a 1-argument construction we just transform that argument. 10729 if ((E->getNumArgs() == 1 || 10730 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10731 (!getDerived().DropCallArgument(E->getArg(0))) && 10732 !E->isListInitialization()) 10733 return getDerived().TransformExpr(E->getArg(0)); 10734 10735 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 10736 10737 QualType T = getDerived().TransformType(E->getType()); 10738 if (T.isNull()) 10739 return ExprError(); 10740 10741 CXXConstructorDecl *Constructor 10742 = cast_or_null<CXXConstructorDecl>( 10743 getDerived().TransformDecl(E->getLocStart(), 10744 E->getConstructor())); 10745 if (!Constructor) 10746 return ExprError(); 10747 10748 bool ArgumentChanged = false; 10749 SmallVector<Expr*, 8> Args; 10750 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10751 &ArgumentChanged)) 10752 return ExprError(); 10753 10754 if (!getDerived().AlwaysRebuild() && 10755 T == E->getType() && 10756 Constructor == E->getConstructor() && 10757 !ArgumentChanged) { 10758 // Mark the constructor as referenced. 10759 // FIXME: Instantiation-specific 10760 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10761 return E; 10762 } 10763 10764 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 10765 Constructor, 10766 E->isElidable(), Args, 10767 E->hadMultipleCandidates(), 10768 E->isListInitialization(), 10769 E->isStdInitListInitialization(), 10770 E->requiresZeroInitialization(), 10771 E->getConstructionKind(), 10772 E->getParenOrBraceRange()); 10773 } 10774 10775 template<typename Derived> 10776 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10777 CXXInheritedCtorInitExpr *E) { 10778 QualType T = getDerived().TransformType(E->getType()); 10779 if (T.isNull()) 10780 return ExprError(); 10781 10782 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10783 getDerived().TransformDecl(E->getLocStart(), E->getConstructor())); 10784 if (!Constructor) 10785 return ExprError(); 10786 10787 if (!getDerived().AlwaysRebuild() && 10788 T == E->getType() && 10789 Constructor == E->getConstructor()) { 10790 // Mark the constructor as referenced. 10791 // FIXME: Instantiation-specific 10792 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10793 return E; 10794 } 10795 10796 return getDerived().RebuildCXXInheritedCtorInitExpr( 10797 T, E->getLocation(), Constructor, 10798 E->constructsVBase(), E->inheritedFromVBase()); 10799 } 10800 10801 /// \brief Transform a C++ temporary-binding expression. 10802 /// 10803 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10804 /// transform the subexpression and return that. 10805 template<typename Derived> 10806 ExprResult 10807 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10808 return getDerived().TransformExpr(E->getSubExpr()); 10809 } 10810 10811 /// \brief Transform a C++ expression that contains cleanups that should 10812 /// be run after the expression is evaluated. 10813 /// 10814 /// Since ExprWithCleanups nodes are implicitly generated, we 10815 /// just transform the subexpression and return that. 10816 template<typename Derived> 10817 ExprResult 10818 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10819 return getDerived().TransformExpr(E->getSubExpr()); 10820 } 10821 10822 template<typename Derived> 10823 ExprResult 10824 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10825 CXXTemporaryObjectExpr *E) { 10826 TypeSourceInfo *T = 10827 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10828 if (!T) 10829 return ExprError(); 10830 10831 CXXConstructorDecl *Constructor 10832 = cast_or_null<CXXConstructorDecl>( 10833 getDerived().TransformDecl(E->getLocStart(), 10834 E->getConstructor())); 10835 if (!Constructor) 10836 return ExprError(); 10837 10838 bool ArgumentChanged = false; 10839 SmallVector<Expr*, 8> Args; 10840 Args.reserve(E->getNumArgs()); 10841 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10842 &ArgumentChanged)) 10843 return ExprError(); 10844 10845 if (!getDerived().AlwaysRebuild() && 10846 T == E->getTypeSourceInfo() && 10847 Constructor == E->getConstructor() && 10848 !ArgumentChanged) { 10849 // FIXME: Instantiation-specific 10850 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10851 return SemaRef.MaybeBindToTemporary(E); 10852 } 10853 10854 // FIXME: We should just pass E->isListInitialization(), but we're not 10855 // prepared to handle list-initialization without a child InitListExpr. 10856 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 10857 return getDerived().RebuildCXXTemporaryObjectExpr( 10858 T, LParenLoc, Args, E->getLocEnd(), 10859 /*ListInitialization=*/LParenLoc.isInvalid()); 10860 } 10861 10862 template<typename Derived> 10863 ExprResult 10864 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10865 // Transform any init-capture expressions before entering the scope of the 10866 // lambda body, because they are not semantically within that scope. 10867 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10868 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10869 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10870 E->explicit_capture_begin()); 10871 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10872 CEnd = E->capture_end(); 10873 C != CEnd; ++C) { 10874 if (!E->isInitCapture(C)) 10875 continue; 10876 EnterExpressionEvaluationContext EEEC( 10877 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10878 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10879 C->getCapturedVar()->getInit(), 10880 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10881 10882 if (NewExprInitResult.isInvalid()) 10883 return ExprError(); 10884 Expr *NewExprInit = NewExprInitResult.get(); 10885 10886 VarDecl *OldVD = C->getCapturedVar(); 10887 QualType NewInitCaptureType = 10888 getSema().buildLambdaInitCaptureInitialization( 10889 C->getLocation(), OldVD->getType()->isReferenceType(), 10890 OldVD->getIdentifier(), 10891 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10892 NewExprInitResult = NewExprInit; 10893 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10894 std::make_pair(NewExprInitResult, NewInitCaptureType); 10895 } 10896 10897 // Transform the template parameters, and add them to the current 10898 // instantiation scope. The null case is handled correctly. 10899 auto TPL = getDerived().TransformTemplateParameterList( 10900 E->getTemplateParameterList()); 10901 10902 // Transform the type of the original lambda's call operator. 10903 // The transformation MUST be done in the CurrentInstantiationScope since 10904 // it introduces a mapping of the original to the newly created 10905 // transformed parameters. 10906 TypeSourceInfo *NewCallOpTSI = nullptr; 10907 { 10908 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10909 FunctionProtoTypeLoc OldCallOpFPTL = 10910 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10911 10912 TypeLocBuilder NewCallOpTLBuilder; 10913 SmallVector<QualType, 4> ExceptionStorage; 10914 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10915 QualType NewCallOpType = TransformFunctionProtoType( 10916 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10917 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10918 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10919 ExceptionStorage, Changed); 10920 }); 10921 if (NewCallOpType.isNull()) 10922 return ExprError(); 10923 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10924 NewCallOpType); 10925 } 10926 10927 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10928 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10929 LSI->GLTemplateParameterList = TPL; 10930 10931 // Create the local class that will describe the lambda. 10932 CXXRecordDecl *Class 10933 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10934 NewCallOpTSI, 10935 /*KnownDependent=*/false, 10936 E->getCaptureDefault()); 10937 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10938 10939 // Build the call operator. 10940 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10941 Class, E->getIntroducerRange(), NewCallOpTSI, 10942 E->getCallOperator()->getLocEnd(), 10943 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10944 E->getCallOperator()->isConstexpr()); 10945 10946 LSI->CallOperator = NewCallOperator; 10947 10948 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 10949 I != NumParams; ++I) { 10950 auto *P = NewCallOperator->getParamDecl(I); 10951 if (P->hasUninstantiatedDefaultArg()) { 10952 EnterExpressionEvaluationContext Eval( 10953 getSema(), 10954 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 10955 ExprResult R = getDerived().TransformExpr( 10956 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 10957 P->setDefaultArg(R.get()); 10958 } 10959 } 10960 10961 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10962 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10963 10964 // Introduce the context of the call operator. 10965 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10966 /*NewThisContext*/false); 10967 10968 // Enter the scope of the lambda. 10969 getSema().buildLambdaScope(LSI, NewCallOperator, 10970 E->getIntroducerRange(), 10971 E->getCaptureDefault(), 10972 E->getCaptureDefaultLoc(), 10973 E->hasExplicitParameters(), 10974 E->hasExplicitResultType(), 10975 E->isMutable()); 10976 10977 bool Invalid = false; 10978 10979 // Transform captures. 10980 bool FinishedExplicitCaptures = false; 10981 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10982 CEnd = E->capture_end(); 10983 C != CEnd; ++C) { 10984 // When we hit the first implicit capture, tell Sema that we've finished 10985 // the list of explicit captures. 10986 if (!FinishedExplicitCaptures && C->isImplicit()) { 10987 getSema().finishLambdaExplicitCaptures(LSI); 10988 FinishedExplicitCaptures = true; 10989 } 10990 10991 // Capturing 'this' is trivial. 10992 if (C->capturesThis()) { 10993 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 10994 /*BuildAndDiagnose*/ true, nullptr, 10995 C->getCaptureKind() == LCK_StarThis); 10996 continue; 10997 } 10998 // Captured expression will be recaptured during captured variables 10999 // rebuilding. 11000 if (C->capturesVLAType()) 11001 continue; 11002 11003 // Rebuild init-captures, including the implied field declaration. 11004 if (E->isInitCapture(C)) { 11005 InitCaptureInfoTy InitExprTypePair = 11006 InitCaptureExprsAndTypes[C - E->capture_begin()]; 11007 ExprResult Init = InitExprTypePair.first; 11008 QualType InitQualType = InitExprTypePair.second; 11009 if (Init.isInvalid() || InitQualType.isNull()) { 11010 Invalid = true; 11011 continue; 11012 } 11013 VarDecl *OldVD = C->getCapturedVar(); 11014 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11015 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 11016 OldVD->getInitStyle(), Init.get()); 11017 if (!NewVD) 11018 Invalid = true; 11019 else { 11020 getDerived().transformedLocalDecl(OldVD, NewVD); 11021 } 11022 getSema().buildInitCaptureField(LSI, NewVD); 11023 continue; 11024 } 11025 11026 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11027 11028 // Determine the capture kind for Sema. 11029 Sema::TryCaptureKind Kind 11030 = C->isImplicit()? Sema::TryCapture_Implicit 11031 : C->getCaptureKind() == LCK_ByCopy 11032 ? Sema::TryCapture_ExplicitByVal 11033 : Sema::TryCapture_ExplicitByRef; 11034 SourceLocation EllipsisLoc; 11035 if (C->isPackExpansion()) { 11036 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11037 bool ShouldExpand = false; 11038 bool RetainExpansion = false; 11039 Optional<unsigned> NumExpansions; 11040 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11041 C->getLocation(), 11042 Unexpanded, 11043 ShouldExpand, RetainExpansion, 11044 NumExpansions)) { 11045 Invalid = true; 11046 continue; 11047 } 11048 11049 if (ShouldExpand) { 11050 // The transform has determined that we should perform an expansion; 11051 // transform and capture each of the arguments. 11052 // expansion of the pattern. Do so. 11053 VarDecl *Pack = C->getCapturedVar(); 11054 for (unsigned I = 0; I != *NumExpansions; ++I) { 11055 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11056 VarDecl *CapturedVar 11057 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11058 Pack)); 11059 if (!CapturedVar) { 11060 Invalid = true; 11061 continue; 11062 } 11063 11064 // Capture the transformed variable. 11065 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11066 } 11067 11068 // FIXME: Retain a pack expansion if RetainExpansion is true. 11069 11070 continue; 11071 } 11072 11073 EllipsisLoc = C->getEllipsisLoc(); 11074 } 11075 11076 // Transform the captured variable. 11077 VarDecl *CapturedVar 11078 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11079 C->getCapturedVar())); 11080 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11081 Invalid = true; 11082 continue; 11083 } 11084 11085 // Capture the transformed variable. 11086 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11087 EllipsisLoc); 11088 } 11089 if (!FinishedExplicitCaptures) 11090 getSema().finishLambdaExplicitCaptures(LSI); 11091 11092 // Enter a new evaluation context to insulate the lambda from any 11093 // cleanups from the enclosing full-expression. 11094 getSema().PushExpressionEvaluationContext( 11095 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11096 11097 // Instantiate the body of the lambda expression. 11098 StmtResult Body = 11099 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 11100 11101 // ActOnLambda* will pop the function scope for us. 11102 FuncScopeCleanup.disable(); 11103 11104 if (Body.isInvalid()) { 11105 SavedContext.pop(); 11106 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 11107 /*IsInstantiation=*/true); 11108 return ExprError(); 11109 } 11110 11111 // Copy the LSI before ActOnFinishFunctionBody removes it. 11112 // FIXME: This is dumb. Store the lambda information somewhere that outlives 11113 // the call operator. 11114 auto LSICopy = *LSI; 11115 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 11116 /*IsInstantiation*/ true); 11117 SavedContext.pop(); 11118 11119 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 11120 &LSICopy); 11121 } 11122 11123 template<typename Derived> 11124 ExprResult 11125 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 11126 CXXUnresolvedConstructExpr *E) { 11127 TypeSourceInfo *T = 11128 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11129 if (!T) 11130 return ExprError(); 11131 11132 bool ArgumentChanged = false; 11133 SmallVector<Expr*, 8> Args; 11134 Args.reserve(E->arg_size()); 11135 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 11136 &ArgumentChanged)) 11137 return ExprError(); 11138 11139 if (!getDerived().AlwaysRebuild() && 11140 T == E->getTypeSourceInfo() && 11141 !ArgumentChanged) 11142 return E; 11143 11144 // FIXME: we're faking the locations of the commas 11145 return getDerived().RebuildCXXUnresolvedConstructExpr( 11146 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 11147 } 11148 11149 template<typename Derived> 11150 ExprResult 11151 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 11152 CXXDependentScopeMemberExpr *E) { 11153 // Transform the base of the expression. 11154 ExprResult Base((Expr*) nullptr); 11155 Expr *OldBase; 11156 QualType BaseType; 11157 QualType ObjectType; 11158 if (!E->isImplicitAccess()) { 11159 OldBase = E->getBase(); 11160 Base = getDerived().TransformExpr(OldBase); 11161 if (Base.isInvalid()) 11162 return ExprError(); 11163 11164 // Start the member reference and compute the object's type. 11165 ParsedType ObjectTy; 11166 bool MayBePseudoDestructor = false; 11167 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11168 E->getOperatorLoc(), 11169 E->isArrow()? tok::arrow : tok::period, 11170 ObjectTy, 11171 MayBePseudoDestructor); 11172 if (Base.isInvalid()) 11173 return ExprError(); 11174 11175 ObjectType = ObjectTy.get(); 11176 BaseType = ((Expr*) Base.get())->getType(); 11177 } else { 11178 OldBase = nullptr; 11179 BaseType = getDerived().TransformType(E->getBaseType()); 11180 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11181 } 11182 11183 // Transform the first part of the nested-name-specifier that qualifies 11184 // the member name. 11185 NamedDecl *FirstQualifierInScope 11186 = getDerived().TransformFirstQualifierInScope( 11187 E->getFirstQualifierFoundInScope(), 11188 E->getQualifierLoc().getBeginLoc()); 11189 11190 NestedNameSpecifierLoc QualifierLoc; 11191 if (E->getQualifier()) { 11192 QualifierLoc 11193 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11194 ObjectType, 11195 FirstQualifierInScope); 11196 if (!QualifierLoc) 11197 return ExprError(); 11198 } 11199 11200 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11201 11202 // TODO: If this is a conversion-function-id, verify that the 11203 // destination type name (if present) resolves the same way after 11204 // instantiation as it did in the local scope. 11205 11206 DeclarationNameInfo NameInfo 11207 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11208 if (!NameInfo.getName()) 11209 return ExprError(); 11210 11211 if (!E->hasExplicitTemplateArgs()) { 11212 // This is a reference to a member without an explicitly-specified 11213 // template argument list. Optimize for this common case. 11214 if (!getDerived().AlwaysRebuild() && 11215 Base.get() == OldBase && 11216 BaseType == E->getBaseType() && 11217 QualifierLoc == E->getQualifierLoc() && 11218 NameInfo.getName() == E->getMember() && 11219 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11220 return E; 11221 11222 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11223 BaseType, 11224 E->isArrow(), 11225 E->getOperatorLoc(), 11226 QualifierLoc, 11227 TemplateKWLoc, 11228 FirstQualifierInScope, 11229 NameInfo, 11230 /*TemplateArgs*/nullptr); 11231 } 11232 11233 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11234 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11235 E->getNumTemplateArgs(), 11236 TransArgs)) 11237 return ExprError(); 11238 11239 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11240 BaseType, 11241 E->isArrow(), 11242 E->getOperatorLoc(), 11243 QualifierLoc, 11244 TemplateKWLoc, 11245 FirstQualifierInScope, 11246 NameInfo, 11247 &TransArgs); 11248 } 11249 11250 template<typename Derived> 11251 ExprResult 11252 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11253 // Transform the base of the expression. 11254 ExprResult Base((Expr*) nullptr); 11255 QualType BaseType; 11256 if (!Old->isImplicitAccess()) { 11257 Base = getDerived().TransformExpr(Old->getBase()); 11258 if (Base.isInvalid()) 11259 return ExprError(); 11260 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11261 Old->isArrow()); 11262 if (Base.isInvalid()) 11263 return ExprError(); 11264 BaseType = Base.get()->getType(); 11265 } else { 11266 BaseType = getDerived().TransformType(Old->getBaseType()); 11267 } 11268 11269 NestedNameSpecifierLoc QualifierLoc; 11270 if (Old->getQualifierLoc()) { 11271 QualifierLoc 11272 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11273 if (!QualifierLoc) 11274 return ExprError(); 11275 } 11276 11277 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11278 11279 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11280 Sema::LookupOrdinaryName); 11281 11282 // Transform the declaration set. 11283 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11284 return ExprError(); 11285 11286 // Determine the naming class. 11287 if (Old->getNamingClass()) { 11288 CXXRecordDecl *NamingClass 11289 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11290 Old->getMemberLoc(), 11291 Old->getNamingClass())); 11292 if (!NamingClass) 11293 return ExprError(); 11294 11295 R.setNamingClass(NamingClass); 11296 } 11297 11298 TemplateArgumentListInfo TransArgs; 11299 if (Old->hasExplicitTemplateArgs()) { 11300 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11301 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11302 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11303 Old->getNumTemplateArgs(), 11304 TransArgs)) 11305 return ExprError(); 11306 } 11307 11308 // FIXME: to do this check properly, we will need to preserve the 11309 // first-qualifier-in-scope here, just in case we had a dependent 11310 // base (and therefore couldn't do the check) and a 11311 // nested-name-qualifier (and therefore could do the lookup). 11312 NamedDecl *FirstQualifierInScope = nullptr; 11313 11314 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11315 BaseType, 11316 Old->getOperatorLoc(), 11317 Old->isArrow(), 11318 QualifierLoc, 11319 TemplateKWLoc, 11320 FirstQualifierInScope, 11321 R, 11322 (Old->hasExplicitTemplateArgs() 11323 ? &TransArgs : nullptr)); 11324 } 11325 11326 template<typename Derived> 11327 ExprResult 11328 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11329 EnterExpressionEvaluationContext Unevaluated( 11330 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11331 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11332 if (SubExpr.isInvalid()) 11333 return ExprError(); 11334 11335 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11336 return E; 11337 11338 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11339 } 11340 11341 template<typename Derived> 11342 ExprResult 11343 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11344 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11345 if (Pattern.isInvalid()) 11346 return ExprError(); 11347 11348 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11349 return E; 11350 11351 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11352 E->getNumExpansions()); 11353 } 11354 11355 template<typename Derived> 11356 ExprResult 11357 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11358 // If E is not value-dependent, then nothing will change when we transform it. 11359 // Note: This is an instantiation-centric view. 11360 if (!E->isValueDependent()) 11361 return E; 11362 11363 EnterExpressionEvaluationContext Unevaluated( 11364 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11365 11366 ArrayRef<TemplateArgument> PackArgs; 11367 TemplateArgument ArgStorage; 11368 11369 // Find the argument list to transform. 11370 if (E->isPartiallySubstituted()) { 11371 PackArgs = E->getPartialArguments(); 11372 } else if (E->isValueDependent()) { 11373 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11374 bool ShouldExpand = false; 11375 bool RetainExpansion = false; 11376 Optional<unsigned> NumExpansions; 11377 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11378 Unexpanded, 11379 ShouldExpand, RetainExpansion, 11380 NumExpansions)) 11381 return ExprError(); 11382 11383 // If we need to expand the pack, build a template argument from it and 11384 // expand that. 11385 if (ShouldExpand) { 11386 auto *Pack = E->getPack(); 11387 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11388 ArgStorage = getSema().Context.getPackExpansionType( 11389 getSema().Context.getTypeDeclType(TTPD), None); 11390 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11391 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11392 } else { 11393 auto *VD = cast<ValueDecl>(Pack); 11394 ExprResult DRE = getSema().BuildDeclRefExpr( 11395 VD, VD->getType().getNonLValueExprType(getSema().Context), 11396 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 11397 E->getPackLoc()); 11398 if (DRE.isInvalid()) 11399 return ExprError(); 11400 ArgStorage = new (getSema().Context) PackExpansionExpr( 11401 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11402 } 11403 PackArgs = ArgStorage; 11404 } 11405 } 11406 11407 // If we're not expanding the pack, just transform the decl. 11408 if (!PackArgs.size()) { 11409 auto *Pack = cast_or_null<NamedDecl>( 11410 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11411 if (!Pack) 11412 return ExprError(); 11413 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11414 E->getPackLoc(), 11415 E->getRParenLoc(), None, None); 11416 } 11417 11418 // Try to compute the result without performing a partial substitution. 11419 Optional<unsigned> Result = 0; 11420 for (const TemplateArgument &Arg : PackArgs) { 11421 if (!Arg.isPackExpansion()) { 11422 Result = *Result + 1; 11423 continue; 11424 } 11425 11426 TemplateArgumentLoc ArgLoc; 11427 InventTemplateArgumentLoc(Arg, ArgLoc); 11428 11429 // Find the pattern of the pack expansion. 11430 SourceLocation Ellipsis; 11431 Optional<unsigned> OrigNumExpansions; 11432 TemplateArgumentLoc Pattern = 11433 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11434 OrigNumExpansions); 11435 11436 // Substitute under the pack expansion. Do not expand the pack (yet). 11437 TemplateArgumentLoc OutPattern; 11438 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11439 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11440 /*Uneval*/ true)) 11441 return true; 11442 11443 // See if we can determine the number of arguments from the result. 11444 Optional<unsigned> NumExpansions = 11445 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11446 if (!NumExpansions) { 11447 // No: we must be in an alias template expansion, and we're going to need 11448 // to actually expand the packs. 11449 Result = None; 11450 break; 11451 } 11452 11453 Result = *Result + *NumExpansions; 11454 } 11455 11456 // Common case: we could determine the number of expansions without 11457 // substituting. 11458 if (Result) 11459 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11460 E->getPackLoc(), 11461 E->getRParenLoc(), *Result, None); 11462 11463 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11464 E->getPackLoc()); 11465 { 11466 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11467 typedef TemplateArgumentLocInventIterator< 11468 Derived, const TemplateArgument*> PackLocIterator; 11469 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11470 PackLocIterator(*this, PackArgs.end()), 11471 TransformedPackArgs, /*Uneval*/true)) 11472 return ExprError(); 11473 } 11474 11475 // Check whether we managed to fully-expand the pack. 11476 // FIXME: Is it possible for us to do so and not hit the early exit path? 11477 SmallVector<TemplateArgument, 8> Args; 11478 bool PartialSubstitution = false; 11479 for (auto &Loc : TransformedPackArgs.arguments()) { 11480 Args.push_back(Loc.getArgument()); 11481 if (Loc.getArgument().isPackExpansion()) 11482 PartialSubstitution = true; 11483 } 11484 11485 if (PartialSubstitution) 11486 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11487 E->getPackLoc(), 11488 E->getRParenLoc(), None, Args); 11489 11490 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11491 E->getPackLoc(), E->getRParenLoc(), 11492 Args.size(), None); 11493 } 11494 11495 template<typename Derived> 11496 ExprResult 11497 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11498 SubstNonTypeTemplateParmPackExpr *E) { 11499 // Default behavior is to do nothing with this transformation. 11500 return E; 11501 } 11502 11503 template<typename Derived> 11504 ExprResult 11505 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11506 SubstNonTypeTemplateParmExpr *E) { 11507 // Default behavior is to do nothing with this transformation. 11508 return E; 11509 } 11510 11511 template<typename Derived> 11512 ExprResult 11513 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11514 // Default behavior is to do nothing with this transformation. 11515 return E; 11516 } 11517 11518 template<typename Derived> 11519 ExprResult 11520 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11521 MaterializeTemporaryExpr *E) { 11522 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11523 } 11524 11525 template<typename Derived> 11526 ExprResult 11527 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11528 Expr *Pattern = E->getPattern(); 11529 11530 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11531 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11532 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11533 11534 // Determine whether the set of unexpanded parameter packs can and should 11535 // be expanded. 11536 bool Expand = true; 11537 bool RetainExpansion = false; 11538 Optional<unsigned> NumExpansions; 11539 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11540 Pattern->getSourceRange(), 11541 Unexpanded, 11542 Expand, RetainExpansion, 11543 NumExpansions)) 11544 return true; 11545 11546 if (!Expand) { 11547 // Do not expand any packs here, just transform and rebuild a fold 11548 // expression. 11549 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11550 11551 ExprResult LHS = 11552 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11553 if (LHS.isInvalid()) 11554 return true; 11555 11556 ExprResult RHS = 11557 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11558 if (RHS.isInvalid()) 11559 return true; 11560 11561 if (!getDerived().AlwaysRebuild() && 11562 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11563 return E; 11564 11565 return getDerived().RebuildCXXFoldExpr( 11566 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11567 RHS.get(), E->getLocEnd()); 11568 } 11569 11570 // The transform has determined that we should perform an elementwise 11571 // expansion of the pattern. Do so. 11572 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11573 if (Result.isInvalid()) 11574 return true; 11575 bool LeftFold = E->isLeftFold(); 11576 11577 // If we're retaining an expansion for a right fold, it is the innermost 11578 // component and takes the init (if any). 11579 if (!LeftFold && RetainExpansion) { 11580 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11581 11582 ExprResult Out = getDerived().TransformExpr(Pattern); 11583 if (Out.isInvalid()) 11584 return true; 11585 11586 Result = getDerived().RebuildCXXFoldExpr( 11587 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11588 Result.get(), E->getLocEnd()); 11589 if (Result.isInvalid()) 11590 return true; 11591 } 11592 11593 for (unsigned I = 0; I != *NumExpansions; ++I) { 11594 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11595 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11596 ExprResult Out = getDerived().TransformExpr(Pattern); 11597 if (Out.isInvalid()) 11598 return true; 11599 11600 if (Out.get()->containsUnexpandedParameterPack()) { 11601 // We still have a pack; retain a pack expansion for this slice. 11602 Result = getDerived().RebuildCXXFoldExpr( 11603 E->getLocStart(), 11604 LeftFold ? Result.get() : Out.get(), 11605 E->getOperator(), E->getEllipsisLoc(), 11606 LeftFold ? Out.get() : Result.get(), 11607 E->getLocEnd()); 11608 } else if (Result.isUsable()) { 11609 // We've got down to a single element; build a binary operator. 11610 Result = getDerived().RebuildBinaryOperator( 11611 E->getEllipsisLoc(), E->getOperator(), 11612 LeftFold ? Result.get() : Out.get(), 11613 LeftFold ? Out.get() : Result.get()); 11614 } else 11615 Result = Out; 11616 11617 if (Result.isInvalid()) 11618 return true; 11619 } 11620 11621 // If we're retaining an expansion for a left fold, it is the outermost 11622 // component and takes the complete expansion so far as its init (if any). 11623 if (LeftFold && RetainExpansion) { 11624 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11625 11626 ExprResult Out = getDerived().TransformExpr(Pattern); 11627 if (Out.isInvalid()) 11628 return true; 11629 11630 Result = getDerived().RebuildCXXFoldExpr( 11631 E->getLocStart(), Result.get(), 11632 E->getOperator(), E->getEllipsisLoc(), 11633 Out.get(), E->getLocEnd()); 11634 if (Result.isInvalid()) 11635 return true; 11636 } 11637 11638 // If we had no init and an empty pack, and we're not retaining an expansion, 11639 // then produce a fallback value or error. 11640 if (Result.isUnset()) 11641 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11642 E->getOperator()); 11643 11644 return Result; 11645 } 11646 11647 template<typename Derived> 11648 ExprResult 11649 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11650 CXXStdInitializerListExpr *E) { 11651 return getDerived().TransformExpr(E->getSubExpr()); 11652 } 11653 11654 template<typename Derived> 11655 ExprResult 11656 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11657 return SemaRef.MaybeBindToTemporary(E); 11658 } 11659 11660 template<typename Derived> 11661 ExprResult 11662 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11663 return E; 11664 } 11665 11666 template<typename Derived> 11667 ExprResult 11668 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11669 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11670 if (SubExpr.isInvalid()) 11671 return ExprError(); 11672 11673 if (!getDerived().AlwaysRebuild() && 11674 SubExpr.get() == E->getSubExpr()) 11675 return E; 11676 11677 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11678 } 11679 11680 template<typename Derived> 11681 ExprResult 11682 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11683 // Transform each of the elements. 11684 SmallVector<Expr *, 8> Elements; 11685 bool ArgChanged = false; 11686 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11687 /*IsCall=*/false, Elements, &ArgChanged)) 11688 return ExprError(); 11689 11690 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11691 return SemaRef.MaybeBindToTemporary(E); 11692 11693 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11694 Elements.data(), 11695 Elements.size()); 11696 } 11697 11698 template<typename Derived> 11699 ExprResult 11700 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11701 ObjCDictionaryLiteral *E) { 11702 // Transform each of the elements. 11703 SmallVector<ObjCDictionaryElement, 8> Elements; 11704 bool ArgChanged = false; 11705 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11706 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11707 11708 if (OrigElement.isPackExpansion()) { 11709 // This key/value element is a pack expansion. 11710 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11711 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11712 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11713 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11714 11715 // Determine whether the set of unexpanded parameter packs can 11716 // and should be expanded. 11717 bool Expand = true; 11718 bool RetainExpansion = false; 11719 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11720 Optional<unsigned> NumExpansions = OrigNumExpansions; 11721 SourceRange PatternRange(OrigElement.Key->getLocStart(), 11722 OrigElement.Value->getLocEnd()); 11723 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11724 PatternRange, 11725 Unexpanded, 11726 Expand, RetainExpansion, 11727 NumExpansions)) 11728 return ExprError(); 11729 11730 if (!Expand) { 11731 // The transform has determined that we should perform a simple 11732 // transformation on the pack expansion, producing another pack 11733 // expansion. 11734 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11735 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11736 if (Key.isInvalid()) 11737 return ExprError(); 11738 11739 if (Key.get() != OrigElement.Key) 11740 ArgChanged = true; 11741 11742 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11743 if (Value.isInvalid()) 11744 return ExprError(); 11745 11746 if (Value.get() != OrigElement.Value) 11747 ArgChanged = true; 11748 11749 ObjCDictionaryElement Expansion = { 11750 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11751 }; 11752 Elements.push_back(Expansion); 11753 continue; 11754 } 11755 11756 // Record right away that the argument was changed. This needs 11757 // to happen even if the array expands to nothing. 11758 ArgChanged = true; 11759 11760 // The transform has determined that we should perform an elementwise 11761 // expansion of the pattern. Do so. 11762 for (unsigned I = 0; I != *NumExpansions; ++I) { 11763 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11764 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11765 if (Key.isInvalid()) 11766 return ExprError(); 11767 11768 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11769 if (Value.isInvalid()) 11770 return ExprError(); 11771 11772 ObjCDictionaryElement Element = { 11773 Key.get(), Value.get(), SourceLocation(), NumExpansions 11774 }; 11775 11776 // If any unexpanded parameter packs remain, we still have a 11777 // pack expansion. 11778 // FIXME: Can this really happen? 11779 if (Key.get()->containsUnexpandedParameterPack() || 11780 Value.get()->containsUnexpandedParameterPack()) 11781 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11782 11783 Elements.push_back(Element); 11784 } 11785 11786 // FIXME: Retain a pack expansion if RetainExpansion is true. 11787 11788 // We've finished with this pack expansion. 11789 continue; 11790 } 11791 11792 // Transform and check key. 11793 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11794 if (Key.isInvalid()) 11795 return ExprError(); 11796 11797 if (Key.get() != OrigElement.Key) 11798 ArgChanged = true; 11799 11800 // Transform and check value. 11801 ExprResult Value 11802 = getDerived().TransformExpr(OrigElement.Value); 11803 if (Value.isInvalid()) 11804 return ExprError(); 11805 11806 if (Value.get() != OrigElement.Value) 11807 ArgChanged = true; 11808 11809 ObjCDictionaryElement Element = { 11810 Key.get(), Value.get(), SourceLocation(), None 11811 }; 11812 Elements.push_back(Element); 11813 } 11814 11815 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11816 return SemaRef.MaybeBindToTemporary(E); 11817 11818 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11819 Elements); 11820 } 11821 11822 template<typename Derived> 11823 ExprResult 11824 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11825 TypeSourceInfo *EncodedTypeInfo 11826 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11827 if (!EncodedTypeInfo) 11828 return ExprError(); 11829 11830 if (!getDerived().AlwaysRebuild() && 11831 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11832 return E; 11833 11834 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11835 EncodedTypeInfo, 11836 E->getRParenLoc()); 11837 } 11838 11839 template<typename Derived> 11840 ExprResult TreeTransform<Derived>:: 11841 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11842 // This is a kind of implicit conversion, and it needs to get dropped 11843 // and recomputed for the same general reasons that ImplicitCastExprs 11844 // do, as well a more specific one: this expression is only valid when 11845 // it appears *immediately* as an argument expression. 11846 return getDerived().TransformExpr(E->getSubExpr()); 11847 } 11848 11849 template<typename Derived> 11850 ExprResult TreeTransform<Derived>:: 11851 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11852 TypeSourceInfo *TSInfo 11853 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11854 if (!TSInfo) 11855 return ExprError(); 11856 11857 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11858 if (Result.isInvalid()) 11859 return ExprError(); 11860 11861 if (!getDerived().AlwaysRebuild() && 11862 TSInfo == E->getTypeInfoAsWritten() && 11863 Result.get() == E->getSubExpr()) 11864 return E; 11865 11866 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11867 E->getBridgeKeywordLoc(), TSInfo, 11868 Result.get()); 11869 } 11870 11871 template <typename Derived> 11872 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11873 ObjCAvailabilityCheckExpr *E) { 11874 return E; 11875 } 11876 11877 template<typename Derived> 11878 ExprResult 11879 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11880 // Transform arguments. 11881 bool ArgChanged = false; 11882 SmallVector<Expr*, 8> Args; 11883 Args.reserve(E->getNumArgs()); 11884 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11885 &ArgChanged)) 11886 return ExprError(); 11887 11888 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11889 // Class message: transform the receiver type. 11890 TypeSourceInfo *ReceiverTypeInfo 11891 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11892 if (!ReceiverTypeInfo) 11893 return ExprError(); 11894 11895 // If nothing changed, just retain the existing message send. 11896 if (!getDerived().AlwaysRebuild() && 11897 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11898 return SemaRef.MaybeBindToTemporary(E); 11899 11900 // Build a new class message send. 11901 SmallVector<SourceLocation, 16> SelLocs; 11902 E->getSelectorLocs(SelLocs); 11903 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11904 E->getSelector(), 11905 SelLocs, 11906 E->getMethodDecl(), 11907 E->getLeftLoc(), 11908 Args, 11909 E->getRightLoc()); 11910 } 11911 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11912 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11913 if (!E->getMethodDecl()) 11914 return ExprError(); 11915 11916 // Build a new class message send to 'super'. 11917 SmallVector<SourceLocation, 16> SelLocs; 11918 E->getSelectorLocs(SelLocs); 11919 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11920 E->getSelector(), 11921 SelLocs, 11922 E->getReceiverType(), 11923 E->getMethodDecl(), 11924 E->getLeftLoc(), 11925 Args, 11926 E->getRightLoc()); 11927 } 11928 11929 // Instance message: transform the receiver 11930 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 11931 "Only class and instance messages may be instantiated"); 11932 ExprResult Receiver 11933 = getDerived().TransformExpr(E->getInstanceReceiver()); 11934 if (Receiver.isInvalid()) 11935 return ExprError(); 11936 11937 // If nothing changed, just retain the existing message send. 11938 if (!getDerived().AlwaysRebuild() && 11939 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11940 return SemaRef.MaybeBindToTemporary(E); 11941 11942 // Build a new instance message send. 11943 SmallVector<SourceLocation, 16> SelLocs; 11944 E->getSelectorLocs(SelLocs); 11945 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11946 E->getSelector(), 11947 SelLocs, 11948 E->getMethodDecl(), 11949 E->getLeftLoc(), 11950 Args, 11951 E->getRightLoc()); 11952 } 11953 11954 template<typename Derived> 11955 ExprResult 11956 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11957 return E; 11958 } 11959 11960 template<typename Derived> 11961 ExprResult 11962 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11963 return E; 11964 } 11965 11966 template<typename Derived> 11967 ExprResult 11968 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11969 // Transform the base expression. 11970 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11971 if (Base.isInvalid()) 11972 return ExprError(); 11973 11974 // We don't need to transform the ivar; it will never change. 11975 11976 // If nothing changed, just retain the existing expression. 11977 if (!getDerived().AlwaysRebuild() && 11978 Base.get() == E->getBase()) 11979 return E; 11980 11981 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11982 E->getLocation(), 11983 E->isArrow(), E->isFreeIvar()); 11984 } 11985 11986 template<typename Derived> 11987 ExprResult 11988 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11989 // 'super' and types never change. Property never changes. Just 11990 // retain the existing expression. 11991 if (!E->isObjectReceiver()) 11992 return E; 11993 11994 // Transform the base expression. 11995 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11996 if (Base.isInvalid()) 11997 return ExprError(); 11998 11999 // We don't need to transform the property; it will never change. 12000 12001 // If nothing changed, just retain the existing expression. 12002 if (!getDerived().AlwaysRebuild() && 12003 Base.get() == E->getBase()) 12004 return E; 12005 12006 if (E->isExplicitProperty()) 12007 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12008 E->getExplicitProperty(), 12009 E->getLocation()); 12010 12011 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12012 SemaRef.Context.PseudoObjectTy, 12013 E->getImplicitPropertyGetter(), 12014 E->getImplicitPropertySetter(), 12015 E->getLocation()); 12016 } 12017 12018 template<typename Derived> 12019 ExprResult 12020 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12021 // Transform the base expression. 12022 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12023 if (Base.isInvalid()) 12024 return ExprError(); 12025 12026 // Transform the key expression. 12027 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12028 if (Key.isInvalid()) 12029 return ExprError(); 12030 12031 // If nothing changed, just retain the existing expression. 12032 if (!getDerived().AlwaysRebuild() && 12033 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12034 return E; 12035 12036 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12037 Base.get(), Key.get(), 12038 E->getAtIndexMethodDecl(), 12039 E->setAtIndexMethodDecl()); 12040 } 12041 12042 template<typename Derived> 12043 ExprResult 12044 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12045 // Transform the base expression. 12046 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12047 if (Base.isInvalid()) 12048 return ExprError(); 12049 12050 // If nothing changed, just retain the existing expression. 12051 if (!getDerived().AlwaysRebuild() && 12052 Base.get() == E->getBase()) 12053 return E; 12054 12055 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12056 E->getOpLoc(), 12057 E->isArrow()); 12058 } 12059 12060 template<typename Derived> 12061 ExprResult 12062 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 12063 bool ArgumentChanged = false; 12064 SmallVector<Expr*, 8> SubExprs; 12065 SubExprs.reserve(E->getNumSubExprs()); 12066 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12067 SubExprs, &ArgumentChanged)) 12068 return ExprError(); 12069 12070 if (!getDerived().AlwaysRebuild() && 12071 !ArgumentChanged) 12072 return E; 12073 12074 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 12075 SubExprs, 12076 E->getRParenLoc()); 12077 } 12078 12079 template<typename Derived> 12080 ExprResult 12081 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 12082 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 12083 if (SrcExpr.isInvalid()) 12084 return ExprError(); 12085 12086 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 12087 if (!Type) 12088 return ExprError(); 12089 12090 if (!getDerived().AlwaysRebuild() && 12091 Type == E->getTypeSourceInfo() && 12092 SrcExpr.get() == E->getSrcExpr()) 12093 return E; 12094 12095 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 12096 SrcExpr.get(), Type, 12097 E->getRParenLoc()); 12098 } 12099 12100 template<typename Derived> 12101 ExprResult 12102 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 12103 BlockDecl *oldBlock = E->getBlockDecl(); 12104 12105 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 12106 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 12107 12108 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 12109 blockScope->TheDecl->setBlockMissingReturnType( 12110 oldBlock->blockMissingReturnType()); 12111 12112 SmallVector<ParmVarDecl*, 4> params; 12113 SmallVector<QualType, 4> paramTypes; 12114 12115 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 12116 12117 // Parameter substitution. 12118 Sema::ExtParameterInfoBuilder extParamInfos; 12119 if (getDerived().TransformFunctionTypeParams( 12120 E->getCaretLocation(), oldBlock->parameters(), nullptr, 12121 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 12122 extParamInfos)) { 12123 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12124 return ExprError(); 12125 } 12126 12127 QualType exprResultType = 12128 getDerived().TransformType(exprFunctionType->getReturnType()); 12129 12130 auto epi = exprFunctionType->getExtProtoInfo(); 12131 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 12132 12133 QualType functionType = 12134 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 12135 blockScope->FunctionType = functionType; 12136 12137 // Set the parameters on the block decl. 12138 if (!params.empty()) 12139 blockScope->TheDecl->setParams(params); 12140 12141 if (!oldBlock->blockMissingReturnType()) { 12142 blockScope->HasImplicitReturnType = false; 12143 blockScope->ReturnType = exprResultType; 12144 } 12145 12146 // Transform the body 12147 StmtResult body = getDerived().TransformStmt(E->getBody()); 12148 if (body.isInvalid()) { 12149 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 12150 return ExprError(); 12151 } 12152 12153 #ifndef NDEBUG 12154 // In builds with assertions, make sure that we captured everything we 12155 // captured before. 12156 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 12157 for (const auto &I : oldBlock->captures()) { 12158 VarDecl *oldCapture = I.getVariable(); 12159 12160 // Ignore parameter packs. 12161 if (isa<ParmVarDecl>(oldCapture) && 12162 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12163 continue; 12164 12165 VarDecl *newCapture = 12166 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12167 oldCapture)); 12168 assert(blockScope->CaptureMap.count(newCapture)); 12169 } 12170 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12171 } 12172 #endif 12173 12174 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12175 /*Scope=*/nullptr); 12176 } 12177 12178 template<typename Derived> 12179 ExprResult 12180 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12181 llvm_unreachable("Cannot transform asType expressions yet"); 12182 } 12183 12184 template<typename Derived> 12185 ExprResult 12186 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12187 QualType RetTy = getDerived().TransformType(E->getType()); 12188 bool ArgumentChanged = false; 12189 SmallVector<Expr*, 8> SubExprs; 12190 SubExprs.reserve(E->getNumSubExprs()); 12191 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12192 SubExprs, &ArgumentChanged)) 12193 return ExprError(); 12194 12195 if (!getDerived().AlwaysRebuild() && 12196 !ArgumentChanged) 12197 return E; 12198 12199 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12200 RetTy, E->getOp(), E->getRParenLoc()); 12201 } 12202 12203 //===----------------------------------------------------------------------===// 12204 // Type reconstruction 12205 //===----------------------------------------------------------------------===// 12206 12207 template<typename Derived> 12208 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12209 SourceLocation Star) { 12210 return SemaRef.BuildPointerType(PointeeType, Star, 12211 getDerived().getBaseEntity()); 12212 } 12213 12214 template<typename Derived> 12215 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12216 SourceLocation Star) { 12217 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12218 getDerived().getBaseEntity()); 12219 } 12220 12221 template<typename Derived> 12222 QualType 12223 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12224 bool WrittenAsLValue, 12225 SourceLocation Sigil) { 12226 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12227 Sigil, getDerived().getBaseEntity()); 12228 } 12229 12230 template<typename Derived> 12231 QualType 12232 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12233 QualType ClassType, 12234 SourceLocation Sigil) { 12235 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12236 getDerived().getBaseEntity()); 12237 } 12238 12239 template<typename Derived> 12240 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12241 const ObjCTypeParamDecl *Decl, 12242 SourceLocation ProtocolLAngleLoc, 12243 ArrayRef<ObjCProtocolDecl *> Protocols, 12244 ArrayRef<SourceLocation> ProtocolLocs, 12245 SourceLocation ProtocolRAngleLoc) { 12246 return SemaRef.BuildObjCTypeParamType(Decl, 12247 ProtocolLAngleLoc, Protocols, 12248 ProtocolLocs, ProtocolRAngleLoc, 12249 /*FailOnError=*/true); 12250 } 12251 12252 template<typename Derived> 12253 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12254 QualType BaseType, 12255 SourceLocation Loc, 12256 SourceLocation TypeArgsLAngleLoc, 12257 ArrayRef<TypeSourceInfo *> TypeArgs, 12258 SourceLocation TypeArgsRAngleLoc, 12259 SourceLocation ProtocolLAngleLoc, 12260 ArrayRef<ObjCProtocolDecl *> Protocols, 12261 ArrayRef<SourceLocation> ProtocolLocs, 12262 SourceLocation ProtocolRAngleLoc) { 12263 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12264 TypeArgs, TypeArgsRAngleLoc, 12265 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12266 ProtocolRAngleLoc, 12267 /*FailOnError=*/true); 12268 } 12269 12270 template<typename Derived> 12271 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12272 QualType PointeeType, 12273 SourceLocation Star) { 12274 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12275 } 12276 12277 template<typename Derived> 12278 QualType 12279 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12280 ArrayType::ArraySizeModifier SizeMod, 12281 const llvm::APInt *Size, 12282 Expr *SizeExpr, 12283 unsigned IndexTypeQuals, 12284 SourceRange BracketsRange) { 12285 if (SizeExpr || !Size) 12286 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12287 IndexTypeQuals, BracketsRange, 12288 getDerived().getBaseEntity()); 12289 12290 QualType Types[] = { 12291 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12292 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12293 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12294 }; 12295 const unsigned NumTypes = llvm::array_lengthof(Types); 12296 QualType SizeType; 12297 for (unsigned I = 0; I != NumTypes; ++I) 12298 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12299 SizeType = Types[I]; 12300 break; 12301 } 12302 12303 // Note that we can return a VariableArrayType here in the case where 12304 // the element type was a dependent VariableArrayType. 12305 IntegerLiteral *ArraySize 12306 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12307 /*FIXME*/BracketsRange.getBegin()); 12308 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12309 IndexTypeQuals, BracketsRange, 12310 getDerived().getBaseEntity()); 12311 } 12312 12313 template<typename Derived> 12314 QualType 12315 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12316 ArrayType::ArraySizeModifier SizeMod, 12317 const llvm::APInt &Size, 12318 unsigned IndexTypeQuals, 12319 SourceRange BracketsRange) { 12320 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12321 IndexTypeQuals, BracketsRange); 12322 } 12323 12324 template<typename Derived> 12325 QualType 12326 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12327 ArrayType::ArraySizeModifier SizeMod, 12328 unsigned IndexTypeQuals, 12329 SourceRange BracketsRange) { 12330 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12331 IndexTypeQuals, BracketsRange); 12332 } 12333 12334 template<typename Derived> 12335 QualType 12336 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12337 ArrayType::ArraySizeModifier SizeMod, 12338 Expr *SizeExpr, 12339 unsigned IndexTypeQuals, 12340 SourceRange BracketsRange) { 12341 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12342 SizeExpr, 12343 IndexTypeQuals, BracketsRange); 12344 } 12345 12346 template<typename Derived> 12347 QualType 12348 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12349 ArrayType::ArraySizeModifier SizeMod, 12350 Expr *SizeExpr, 12351 unsigned IndexTypeQuals, 12352 SourceRange BracketsRange) { 12353 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12354 SizeExpr, 12355 IndexTypeQuals, BracketsRange); 12356 } 12357 12358 template <typename Derived> 12359 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 12360 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 12361 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 12362 AttributeLoc); 12363 } 12364 12365 template <typename Derived> 12366 QualType 12367 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12368 unsigned NumElements, 12369 VectorType::VectorKind VecKind) { 12370 // FIXME: semantic checking! 12371 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12372 } 12373 12374 template<typename Derived> 12375 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12376 unsigned NumElements, 12377 SourceLocation AttributeLoc) { 12378 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12379 NumElements, true); 12380 IntegerLiteral *VectorSize 12381 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12382 AttributeLoc); 12383 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12384 } 12385 12386 template<typename Derived> 12387 QualType 12388 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12389 Expr *SizeExpr, 12390 SourceLocation AttributeLoc) { 12391 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12392 } 12393 12394 template<typename Derived> 12395 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12396 QualType T, 12397 MutableArrayRef<QualType> ParamTypes, 12398 const FunctionProtoType::ExtProtoInfo &EPI) { 12399 return SemaRef.BuildFunctionType(T, ParamTypes, 12400 getDerived().getBaseLocation(), 12401 getDerived().getBaseEntity(), 12402 EPI); 12403 } 12404 12405 template<typename Derived> 12406 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12407 return SemaRef.Context.getFunctionNoProtoType(T); 12408 } 12409 12410 template<typename Derived> 12411 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12412 Decl *D) { 12413 assert(D && "no decl found"); 12414 if (D->isInvalidDecl()) return QualType(); 12415 12416 // FIXME: Doesn't account for ObjCInterfaceDecl! 12417 TypeDecl *Ty; 12418 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12419 // A valid resolved using typename pack expansion decl can have multiple 12420 // UsingDecls, but they must each have exactly one type, and it must be 12421 // the same type in every case. But we must have at least one expansion! 12422 if (UPD->expansions().empty()) { 12423 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12424 << UPD->isCXXClassMember() << UPD; 12425 return QualType(); 12426 } 12427 12428 // We might still have some unresolved types. Try to pick a resolved type 12429 // if we can. The final instantiation will check that the remaining 12430 // unresolved types instantiate to the type we pick. 12431 QualType FallbackT; 12432 QualType T; 12433 for (auto *E : UPD->expansions()) { 12434 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12435 if (ThisT.isNull()) 12436 continue; 12437 else if (ThisT->getAs<UnresolvedUsingType>()) 12438 FallbackT = ThisT; 12439 else if (T.isNull()) 12440 T = ThisT; 12441 else 12442 assert(getSema().Context.hasSameType(ThisT, T) && 12443 "mismatched resolved types in using pack expansion"); 12444 } 12445 return T.isNull() ? FallbackT : T; 12446 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12447 assert(Using->hasTypename() && 12448 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12449 12450 // A valid resolved using typename decl points to exactly one type decl. 12451 assert(++Using->shadow_begin() == Using->shadow_end()); 12452 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12453 } else { 12454 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12455 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12456 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12457 } 12458 12459 return SemaRef.Context.getTypeDeclType(Ty); 12460 } 12461 12462 template<typename Derived> 12463 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12464 SourceLocation Loc) { 12465 return SemaRef.BuildTypeofExprType(E, Loc); 12466 } 12467 12468 template<typename Derived> 12469 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12470 return SemaRef.Context.getTypeOfType(Underlying); 12471 } 12472 12473 template<typename Derived> 12474 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12475 SourceLocation Loc) { 12476 return SemaRef.BuildDecltypeType(E, Loc); 12477 } 12478 12479 template<typename Derived> 12480 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12481 UnaryTransformType::UTTKind UKind, 12482 SourceLocation Loc) { 12483 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12484 } 12485 12486 template<typename Derived> 12487 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12488 TemplateName Template, 12489 SourceLocation TemplateNameLoc, 12490 TemplateArgumentListInfo &TemplateArgs) { 12491 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12492 } 12493 12494 template<typename Derived> 12495 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12496 SourceLocation KWLoc) { 12497 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12498 } 12499 12500 template<typename Derived> 12501 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12502 SourceLocation KWLoc, 12503 bool isReadPipe) { 12504 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12505 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12506 } 12507 12508 template<typename Derived> 12509 TemplateName 12510 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12511 bool TemplateKW, 12512 TemplateDecl *Template) { 12513 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12514 Template); 12515 } 12516 12517 template<typename Derived> 12518 TemplateName 12519 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12520 const IdentifierInfo &Name, 12521 SourceLocation NameLoc, 12522 QualType ObjectType, 12523 NamedDecl *FirstQualifierInScope, 12524 bool AllowInjectedClassName) { 12525 UnqualifiedId TemplateName; 12526 TemplateName.setIdentifier(&Name, NameLoc); 12527 Sema::TemplateTy Template; 12528 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12529 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12530 SS, TemplateKWLoc, TemplateName, 12531 ParsedType::make(ObjectType), 12532 /*EnteringContext=*/false, 12533 Template, AllowInjectedClassName); 12534 return Template.get(); 12535 } 12536 12537 template<typename Derived> 12538 TemplateName 12539 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12540 OverloadedOperatorKind Operator, 12541 SourceLocation NameLoc, 12542 QualType ObjectType, 12543 bool AllowInjectedClassName) { 12544 UnqualifiedId Name; 12545 // FIXME: Bogus location information. 12546 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12547 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12548 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12549 Sema::TemplateTy Template; 12550 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12551 SS, TemplateKWLoc, Name, 12552 ParsedType::make(ObjectType), 12553 /*EnteringContext=*/false, 12554 Template, AllowInjectedClassName); 12555 return Template.get(); 12556 } 12557 12558 template<typename Derived> 12559 ExprResult 12560 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12561 SourceLocation OpLoc, 12562 Expr *OrigCallee, 12563 Expr *First, 12564 Expr *Second) { 12565 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12566 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12567 12568 if (First->getObjectKind() == OK_ObjCProperty) { 12569 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12570 if (BinaryOperator::isAssignmentOp(Opc)) 12571 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12572 First, Second); 12573 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12574 if (Result.isInvalid()) 12575 return ExprError(); 12576 First = Result.get(); 12577 } 12578 12579 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12580 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12581 if (Result.isInvalid()) 12582 return ExprError(); 12583 Second = Result.get(); 12584 } 12585 12586 // Determine whether this should be a builtin operation. 12587 if (Op == OO_Subscript) { 12588 if (!First->getType()->isOverloadableType() && 12589 !Second->getType()->isOverloadableType()) 12590 return getSema().CreateBuiltinArraySubscriptExpr(First, 12591 Callee->getLocStart(), 12592 Second, OpLoc); 12593 } else if (Op == OO_Arrow) { 12594 // -> is never a builtin operation. 12595 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12596 } else if (Second == nullptr || isPostIncDec) { 12597 if (!First->getType()->isOverloadableType()) { 12598 // The argument is not of overloadable type, so try to create a 12599 // built-in unary operation. 12600 UnaryOperatorKind Opc 12601 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12602 12603 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12604 } 12605 } else { 12606 if (!First->getType()->isOverloadableType() && 12607 !Second->getType()->isOverloadableType()) { 12608 // Neither of the arguments is an overloadable type, so try to 12609 // create a built-in binary operation. 12610 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12611 ExprResult Result 12612 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12613 if (Result.isInvalid()) 12614 return ExprError(); 12615 12616 return Result; 12617 } 12618 } 12619 12620 // Compute the transformed set of functions (and function templates) to be 12621 // used during overload resolution. 12622 UnresolvedSet<16> Functions; 12623 bool RequiresADL; 12624 12625 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12626 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12627 // If the overload could not be resolved in the template definition 12628 // (because we had a dependent argument), ADL is performed as part of 12629 // template instantiation. 12630 RequiresADL = ULE->requiresADL(); 12631 } else { 12632 // If we've resolved this to a particular non-member function, just call 12633 // that function. If we resolved it to a member function, 12634 // CreateOverloaded* will find that function for us. 12635 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12636 if (!isa<CXXMethodDecl>(ND)) 12637 Functions.addDecl(ND); 12638 RequiresADL = false; 12639 } 12640 12641 // Add any functions found via argument-dependent lookup. 12642 Expr *Args[2] = { First, Second }; 12643 unsigned NumArgs = 1 + (Second != nullptr); 12644 12645 // Create the overloaded operator invocation for unary operators. 12646 if (NumArgs == 1 || isPostIncDec) { 12647 UnaryOperatorKind Opc 12648 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12649 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 12650 RequiresADL); 12651 } 12652 12653 if (Op == OO_Subscript) { 12654 SourceLocation LBrace; 12655 SourceLocation RBrace; 12656 12657 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12658 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12659 LBrace = SourceLocation::getFromRawEncoding( 12660 NameLoc.CXXOperatorName.BeginOpNameLoc); 12661 RBrace = SourceLocation::getFromRawEncoding( 12662 NameLoc.CXXOperatorName.EndOpNameLoc); 12663 } else { 12664 LBrace = Callee->getLocStart(); 12665 RBrace = OpLoc; 12666 } 12667 12668 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12669 First, Second); 12670 } 12671 12672 // Create the overloaded operator invocation for binary operators. 12673 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12674 ExprResult Result = SemaRef.CreateOverloadedBinOp( 12675 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 12676 if (Result.isInvalid()) 12677 return ExprError(); 12678 12679 return Result; 12680 } 12681 12682 template<typename Derived> 12683 ExprResult 12684 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12685 SourceLocation OperatorLoc, 12686 bool isArrow, 12687 CXXScopeSpec &SS, 12688 TypeSourceInfo *ScopeType, 12689 SourceLocation CCLoc, 12690 SourceLocation TildeLoc, 12691 PseudoDestructorTypeStorage Destroyed) { 12692 QualType BaseType = Base->getType(); 12693 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12694 (!isArrow && !BaseType->getAs<RecordType>()) || 12695 (isArrow && BaseType->getAs<PointerType>() && 12696 !BaseType->getAs<PointerType>()->getPointeeType() 12697 ->template getAs<RecordType>())){ 12698 // This pseudo-destructor expression is still a pseudo-destructor. 12699 return SemaRef.BuildPseudoDestructorExpr( 12700 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12701 CCLoc, TildeLoc, Destroyed); 12702 } 12703 12704 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12705 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12706 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12707 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12708 NameInfo.setNamedTypeInfo(DestroyedType); 12709 12710 // The scope type is now known to be a valid nested name specifier 12711 // component. Tack it on to the end of the nested name specifier. 12712 if (ScopeType) { 12713 if (!ScopeType->getType()->getAs<TagType>()) { 12714 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12715 diag::err_expected_class_or_namespace) 12716 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12717 return ExprError(); 12718 } 12719 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12720 CCLoc); 12721 } 12722 12723 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12724 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12725 OperatorLoc, isArrow, 12726 SS, TemplateKWLoc, 12727 /*FIXME: FirstQualifier*/ nullptr, 12728 NameInfo, 12729 /*TemplateArgs*/ nullptr, 12730 /*S*/nullptr); 12731 } 12732 12733 template<typename Derived> 12734 StmtResult 12735 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12736 SourceLocation Loc = S->getLocStart(); 12737 CapturedDecl *CD = S->getCapturedDecl(); 12738 unsigned NumParams = CD->getNumParams(); 12739 unsigned ContextParamPos = CD->getContextParamPosition(); 12740 SmallVector<Sema::CapturedParamNameType, 4> Params; 12741 for (unsigned I = 0; I < NumParams; ++I) { 12742 if (I != ContextParamPos) { 12743 Params.push_back( 12744 std::make_pair( 12745 CD->getParam(I)->getName(), 12746 getDerived().TransformType(CD->getParam(I)->getType()))); 12747 } else { 12748 Params.push_back(std::make_pair(StringRef(), QualType())); 12749 } 12750 } 12751 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12752 S->getCapturedRegionKind(), Params); 12753 StmtResult Body; 12754 { 12755 Sema::CompoundScopeRAII CompoundScope(getSema()); 12756 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12757 } 12758 12759 if (Body.isInvalid()) { 12760 getSema().ActOnCapturedRegionError(); 12761 return StmtError(); 12762 } 12763 12764 return getSema().ActOnCapturedRegionEnd(Body.get()); 12765 } 12766 12767 } // end namespace clang 12768 12769 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12770