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