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