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