1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Sema/Designator.h" 32 #include "clang/Sema/Lookup.h" 33 #include "clang/Sema/Ownership.h" 34 #include "clang/Sema/ParsedTemplate.h" 35 #include "clang/Sema/ScopeInfo.h" 36 #include "clang/Sema/SemaDiagnostic.h" 37 #include "clang/Sema/SemaInternal.h" 38 #include "llvm/ADT/ArrayRef.h" 39 #include "llvm/Support/ErrorHandling.h" 40 #include <algorithm> 41 42 using namespace llvm::omp; 43 44 namespace clang { 45 using namespace sema; 46 47 /// A semantic tree transformation that allows one to transform one 48 /// abstract syntax tree into another. 49 /// 50 /// A new tree transformation is defined by creating a new subclass \c X of 51 /// \c TreeTransform<X> and then overriding certain operations to provide 52 /// behavior specific to that transformation. For example, template 53 /// instantiation is implemented as a tree transformation where the 54 /// transformation of TemplateTypeParmType nodes involves substituting the 55 /// template arguments for their corresponding template parameters; a similar 56 /// transformation is performed for non-type template parameters and 57 /// template template parameters. 58 /// 59 /// This tree-transformation template uses static polymorphism to allow 60 /// subclasses to customize any of its operations. Thus, a subclass can 61 /// override any of the transformation or rebuild operators by providing an 62 /// operation with the same signature as the default implementation. The 63 /// overriding function should not be virtual. 64 /// 65 /// Semantic tree transformations are split into two stages, either of which 66 /// can be replaced by a subclass. The "transform" step transforms an AST node 67 /// or the parts of an AST node using the various transformation functions, 68 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 69 /// node of the appropriate kind from the pieces. The default transformation 70 /// routines recursively transform the operands to composite AST nodes (e.g., 71 /// the pointee type of a PointerType node) and, if any of those operand nodes 72 /// were changed by the transformation, invokes the rebuild operation to create 73 /// a new AST node. 74 /// 75 /// Subclasses can customize the transformation at various levels. The 76 /// most coarse-grained transformations involve replacing TransformType(), 77 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 78 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 79 /// new implementations. 80 /// 81 /// For more fine-grained transformations, subclasses can replace any of the 82 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 83 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 84 /// replacing TransformTemplateTypeParmType() allows template instantiation 85 /// to substitute template arguments for their corresponding template 86 /// parameters. Additionally, subclasses can override the \c RebuildXXX 87 /// functions to control how AST nodes are rebuilt when their operands change. 88 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 89 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 90 /// be able to use more efficient rebuild steps. 91 /// 92 /// There are a handful of other functions that can be overridden, allowing one 93 /// to avoid traversing nodes that don't need any transformation 94 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 95 /// operands have not changed (\c AlwaysRebuild()), and customize the 96 /// default locations and entity names used for type-checking 97 /// (\c getBaseLocation(), \c getBaseEntity()). 98 template<typename Derived> 99 class TreeTransform { 100 /// Private RAII object that helps us forget and then re-remember 101 /// the template argument corresponding to a partially-substituted parameter 102 /// pack. 103 class ForgetPartiallySubstitutedPackRAII { 104 Derived &Self; 105 TemplateArgument Old; 106 107 public: 108 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 109 Old = Self.ForgetPartiallySubstitutedPack(); 110 } 111 112 ~ForgetPartiallySubstitutedPackRAII() { 113 Self.RememberPartiallySubstitutedPack(Old); 114 } 115 }; 116 117 protected: 118 Sema &SemaRef; 119 120 /// The set of local declarations that have been transformed, for 121 /// cases where we are forced to build new declarations within the transformer 122 /// rather than in the subclass (e.g., lambda closure types). 123 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 124 125 public: 126 /// Initializes a new tree transformer. 127 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 128 129 /// Retrieves a reference to the derived class. 130 Derived &getDerived() { return static_cast<Derived&>(*this); } 131 132 /// Retrieves a reference to the derived class. 133 const Derived &getDerived() const { 134 return static_cast<const Derived&>(*this); 135 } 136 137 static inline ExprResult Owned(Expr *E) { return E; } 138 static inline StmtResult Owned(Stmt *S) { return S; } 139 140 /// Retrieves a reference to the semantic analysis object used for 141 /// this tree transform. 142 Sema &getSema() const { return SemaRef; } 143 144 /// Whether the transformation should always rebuild AST nodes, even 145 /// if none of the children have changed. 146 /// 147 /// Subclasses may override this function to specify when the transformation 148 /// should rebuild all AST nodes. 149 /// 150 /// We must always rebuild all AST nodes when performing variadic template 151 /// pack expansion, in order to avoid violating the AST invariant that each 152 /// statement node appears at most once in its containing declaration. 153 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 154 155 /// Whether the transformation is forming an expression or statement that 156 /// replaces the original. In this case, we'll reuse mangling numbers from 157 /// existing lambdas. 158 bool ReplacingOriginal() { return false; } 159 160 /// Returns the location of the entity being transformed, if that 161 /// information was not available elsewhere in the AST. 162 /// 163 /// By default, returns no source-location information. Subclasses can 164 /// provide an alternative implementation that provides better location 165 /// information. 166 SourceLocation getBaseLocation() { return SourceLocation(); } 167 168 /// Returns the name of the entity being transformed, if that 169 /// information was not available elsewhere in the AST. 170 /// 171 /// By default, returns an empty name. Subclasses can provide an alternative 172 /// implementation with a more precise name. 173 DeclarationName getBaseEntity() { return DeclarationName(); } 174 175 /// Sets the "base" location and entity when that 176 /// information is known based on another transformation. 177 /// 178 /// By default, the source location and entity are ignored. Subclasses can 179 /// override this function to provide a customized implementation. 180 void setBase(SourceLocation Loc, DeclarationName Entity) { } 181 182 /// RAII object that temporarily sets the base location and entity 183 /// used for reporting diagnostics in types. 184 class TemporaryBase { 185 TreeTransform &Self; 186 SourceLocation OldLocation; 187 DeclarationName OldEntity; 188 189 public: 190 TemporaryBase(TreeTransform &Self, SourceLocation Location, 191 DeclarationName Entity) : Self(Self) { 192 OldLocation = Self.getDerived().getBaseLocation(); 193 OldEntity = Self.getDerived().getBaseEntity(); 194 195 if (Location.isValid()) 196 Self.getDerived().setBase(Location, Entity); 197 } 198 199 ~TemporaryBase() { 200 Self.getDerived().setBase(OldLocation, OldEntity); 201 } 202 }; 203 204 /// Determine whether the given type \p T has already been 205 /// transformed. 206 /// 207 /// Subclasses can provide an alternative implementation of this routine 208 /// to short-circuit evaluation when it is known that a given type will 209 /// not change. For example, template instantiation need not traverse 210 /// non-dependent types. 211 bool AlreadyTransformed(QualType T) { 212 return T.isNull(); 213 } 214 215 /// Determine whether the given call argument should be dropped, e.g., 216 /// because it is a default argument. 217 /// 218 /// Subclasses can provide an alternative implementation of this routine to 219 /// determine which kinds of call arguments get dropped. By default, 220 /// CXXDefaultArgument nodes are dropped (prior to transformation). 221 bool DropCallArgument(Expr *E) { 222 return E->isDefaultArgument(); 223 } 224 225 /// Determine whether we should expand a pack expansion with the 226 /// given set of parameter packs into separate arguments by repeatedly 227 /// transforming the pattern. 228 /// 229 /// By default, the transformer never tries to expand pack expansions. 230 /// Subclasses can override this routine to provide different behavior. 231 /// 232 /// \param EllipsisLoc The location of the ellipsis that identifies the 233 /// pack expansion. 234 /// 235 /// \param PatternRange The source range that covers the entire pattern of 236 /// the pack expansion. 237 /// 238 /// \param Unexpanded The set of unexpanded parameter packs within the 239 /// pattern. 240 /// 241 /// \param ShouldExpand Will be set to \c true if the transformer should 242 /// expand the corresponding pack expansions into separate arguments. When 243 /// set, \c NumExpansions must also be set. 244 /// 245 /// \param RetainExpansion Whether the caller should add an unexpanded 246 /// pack expansion after all of the expanded arguments. This is used 247 /// when extending explicitly-specified template argument packs per 248 /// C++0x [temp.arg.explicit]p9. 249 /// 250 /// \param NumExpansions The number of separate arguments that will be in 251 /// the expanded form of the corresponding pack expansion. This is both an 252 /// input and an output parameter, which can be set by the caller if the 253 /// number of expansions is known a priori (e.g., due to a prior substitution) 254 /// and will be set by the callee when the number of expansions is known. 255 /// The callee must set this value when \c ShouldExpand is \c true; it may 256 /// set this value in other cases. 257 /// 258 /// \returns true if an error occurred (e.g., because the parameter packs 259 /// are to be instantiated with arguments of different lengths), false 260 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 261 /// must be set. 262 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 263 SourceRange PatternRange, 264 ArrayRef<UnexpandedParameterPack> Unexpanded, 265 bool &ShouldExpand, 266 bool &RetainExpansion, 267 Optional<unsigned> &NumExpansions) { 268 ShouldExpand = false; 269 return false; 270 } 271 272 /// "Forget" about the partially-substituted pack template argument, 273 /// when performing an instantiation that must preserve the parameter pack 274 /// use. 275 /// 276 /// This routine is meant to be overridden by the template instantiator. 277 TemplateArgument ForgetPartiallySubstitutedPack() { 278 return TemplateArgument(); 279 } 280 281 /// "Remember" the partially-substituted pack template argument 282 /// after performing an instantiation that must preserve the parameter pack 283 /// use. 284 /// 285 /// This routine is meant to be overridden by the template instantiator. 286 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 287 288 /// Note to the derived class when a function parameter pack is 289 /// being expanded. 290 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 291 292 /// Transforms the given type into another type. 293 /// 294 /// By default, this routine transforms a type by creating a 295 /// TypeSourceInfo for it and delegating to the appropriate 296 /// function. This is expensive, but we don't mind, because 297 /// this method is deprecated anyway; all users should be 298 /// switched to storing TypeSourceInfos. 299 /// 300 /// \returns the transformed type. 301 QualType TransformType(QualType T); 302 303 /// Transforms the given type-with-location into a new 304 /// type-with-location. 305 /// 306 /// By default, this routine transforms a type by delegating to the 307 /// appropriate TransformXXXType to build a new type. Subclasses 308 /// may override this function (to take over all type 309 /// transformations) or some set of the TransformXXXType functions 310 /// to alter the transformation. 311 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 312 313 /// Transform the given type-with-location into a new 314 /// type, collecting location information in the given builder 315 /// as necessary. 316 /// 317 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 318 319 /// Transform a type that is permitted to produce a 320 /// DeducedTemplateSpecializationType. 321 /// 322 /// This is used in the (relatively rare) contexts where it is acceptable 323 /// for transformation to produce a class template type with deduced 324 /// template arguments. 325 /// @{ 326 QualType TransformTypeWithDeducedTST(QualType T); 327 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 328 /// @} 329 330 /// The reason why the value of a statement is not discarded, if any. 331 enum StmtDiscardKind { 332 SDK_Discarded, 333 SDK_NotDiscarded, 334 SDK_StmtExprResult, 335 }; 336 337 /// Transform the given statement. 338 /// 339 /// By default, this routine transforms a statement by delegating to the 340 /// appropriate TransformXXXStmt function to transform a specific kind of 341 /// statement or the TransformExpr() function to transform an expression. 342 /// Subclasses may override this function to transform statements using some 343 /// other mechanism. 344 /// 345 /// \returns the transformed statement. 346 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 347 348 /// Transform the given statement. 349 /// 350 /// By default, this routine transforms a statement by delegating to the 351 /// appropriate TransformOMPXXXClause function to transform a specific kind 352 /// of clause. Subclasses may override this function to transform statements 353 /// using some other mechanism. 354 /// 355 /// \returns the transformed OpenMP clause. 356 OMPClause *TransformOMPClause(OMPClause *S); 357 358 /// Transform the given attribute. 359 /// 360 /// By default, this routine transforms a statement by delegating to the 361 /// appropriate TransformXXXAttr function to transform a specific kind 362 /// of attribute. Subclasses may override this function to transform 363 /// attributed statements using some other mechanism. 364 /// 365 /// \returns the transformed attribute 366 const Attr *TransformAttr(const Attr *S); 367 368 /// Transform the specified attribute. 369 /// 370 /// Subclasses should override the transformation of attributes with a pragma 371 /// spelling to transform expressions stored within the attribute. 372 /// 373 /// \returns the transformed attribute. 374 #define ATTR(X) 375 #define PRAGMA_SPELLING_ATTR(X) \ 376 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 377 #include "clang/Basic/AttrList.inc" 378 379 /// Transform the given expression. 380 /// 381 /// By default, this routine transforms an expression by delegating to the 382 /// appropriate TransformXXXExpr function to build a new expression. 383 /// Subclasses may override this function to transform expressions using some 384 /// other mechanism. 385 /// 386 /// \returns the transformed expression. 387 ExprResult TransformExpr(Expr *E); 388 389 /// Transform the given initializer. 390 /// 391 /// By default, this routine transforms an initializer by stripping off the 392 /// semantic nodes added by initialization, then passing the result to 393 /// TransformExpr or TransformExprs. 394 /// 395 /// \returns the transformed initializer. 396 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 397 398 /// Transform the given list of expressions. 399 /// 400 /// This routine transforms a list of expressions by invoking 401 /// \c TransformExpr() for each subexpression. However, it also provides 402 /// support for variadic templates by expanding any pack expansions (if the 403 /// derived class permits such expansion) along the way. When pack expansions 404 /// are present, the number of outputs may not equal the number of inputs. 405 /// 406 /// \param Inputs The set of expressions to be transformed. 407 /// 408 /// \param NumInputs The number of expressions in \c Inputs. 409 /// 410 /// \param IsCall If \c true, then this transform is being performed on 411 /// function-call arguments, and any arguments that should be dropped, will 412 /// be. 413 /// 414 /// \param Outputs The transformed input expressions will be added to this 415 /// vector. 416 /// 417 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 418 /// due to transformation. 419 /// 420 /// \returns true if an error occurred, false otherwise. 421 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 422 SmallVectorImpl<Expr *> &Outputs, 423 bool *ArgChanged = nullptr); 424 425 /// Transform the given declaration, which is referenced from a type 426 /// or expression. 427 /// 428 /// By default, acts as the identity function on declarations, unless the 429 /// transformer has had to transform the declaration itself. Subclasses 430 /// may override this function to provide alternate behavior. 431 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 432 llvm::DenseMap<Decl *, Decl *>::iterator Known 433 = TransformedLocalDecls.find(D); 434 if (Known != TransformedLocalDecls.end()) 435 return Known->second; 436 437 return D; 438 } 439 440 /// Transform the specified condition. 441 /// 442 /// By default, this transforms the variable and expression and rebuilds 443 /// the condition. 444 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 445 Expr *Expr, 446 Sema::ConditionKind Kind); 447 448 /// Transform the attributes associated with the given declaration and 449 /// place them on the new declaration. 450 /// 451 /// By default, this operation does nothing. Subclasses may override this 452 /// behavior to transform attributes. 453 void transformAttrs(Decl *Old, Decl *New) { } 454 455 /// Note that a local declaration has been transformed by this 456 /// transformer. 457 /// 458 /// Local declarations are typically transformed via a call to 459 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 460 /// the transformer itself has to transform the declarations. This routine 461 /// can be overridden by a subclass that keeps track of such mappings. 462 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 463 assert(New.size() == 1 && 464 "must override transformedLocalDecl if performing pack expansion"); 465 TransformedLocalDecls[Old] = New.front(); 466 } 467 468 /// Transform the definition of the given declaration. 469 /// 470 /// By default, invokes TransformDecl() to transform the declaration. 471 /// Subclasses may override this function to provide alternate behavior. 472 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 473 return getDerived().TransformDecl(Loc, D); 474 } 475 476 /// Transform the given declaration, which was the first part of a 477 /// nested-name-specifier in a member access expression. 478 /// 479 /// This specific declaration transformation only applies to the first 480 /// identifier in a nested-name-specifier of a member access expression, e.g., 481 /// the \c T in \c x->T::member 482 /// 483 /// By default, invokes TransformDecl() to transform the declaration. 484 /// Subclasses may override this function to provide alternate behavior. 485 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 486 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 487 } 488 489 /// Transform the set of declarations in an OverloadExpr. 490 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 491 LookupResult &R); 492 493 /// Transform the given nested-name-specifier with source-location 494 /// information. 495 /// 496 /// By default, transforms all of the types and declarations within the 497 /// nested-name-specifier. Subclasses may override this function to provide 498 /// alternate behavior. 499 NestedNameSpecifierLoc 500 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 501 QualType ObjectType = QualType(), 502 NamedDecl *FirstQualifierInScope = nullptr); 503 504 /// Transform the given declaration name. 505 /// 506 /// By default, transforms the types of conversion function, constructor, 507 /// and destructor names and then (if needed) rebuilds the declaration name. 508 /// Identifiers and selectors are returned unmodified. Sublcasses may 509 /// override this function to provide alternate behavior. 510 DeclarationNameInfo 511 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 512 513 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 514 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 515 concepts::TypeRequirement * 516 TransformTypeRequirement(concepts::TypeRequirement *Req); 517 concepts::ExprRequirement * 518 TransformExprRequirement(concepts::ExprRequirement *Req); 519 concepts::NestedRequirement * 520 TransformNestedRequirement(concepts::NestedRequirement *Req); 521 522 /// Transform the given template name. 523 /// 524 /// \param SS The nested-name-specifier that qualifies the template 525 /// name. This nested-name-specifier must already have been transformed. 526 /// 527 /// \param Name The template name to transform. 528 /// 529 /// \param NameLoc The source location of the template name. 530 /// 531 /// \param ObjectType If we're translating a template name within a member 532 /// access expression, this is the type of the object whose member template 533 /// is being referenced. 534 /// 535 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 536 /// also refers to a name within the current (lexical) scope, this is the 537 /// declaration it refers to. 538 /// 539 /// By default, transforms the template name by transforming the declarations 540 /// and nested-name-specifiers that occur within the template name. 541 /// Subclasses may override this function to provide alternate behavior. 542 TemplateName 543 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 544 SourceLocation NameLoc, 545 QualType ObjectType = QualType(), 546 NamedDecl *FirstQualifierInScope = nullptr, 547 bool AllowInjectedClassName = false); 548 549 /// Transform the given template argument. 550 /// 551 /// By default, this operation transforms the type, expression, or 552 /// declaration stored within the template argument and constructs a 553 /// new template argument from the transformed result. Subclasses may 554 /// override this function to provide alternate behavior. 555 /// 556 /// Returns true if there was an error. 557 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 558 TemplateArgumentLoc &Output, 559 bool Uneval = false); 560 561 /// Transform the given set of template arguments. 562 /// 563 /// By default, this operation transforms all of the template arguments 564 /// in the input set using \c TransformTemplateArgument(), and appends 565 /// the transformed arguments to the output list. 566 /// 567 /// Note that this overload of \c TransformTemplateArguments() is merely 568 /// a convenience function. Subclasses that wish to override this behavior 569 /// should override the iterator-based member template version. 570 /// 571 /// \param Inputs The set of template arguments to be transformed. 572 /// 573 /// \param NumInputs The number of template arguments in \p Inputs. 574 /// 575 /// \param Outputs The set of transformed template arguments output by this 576 /// routine. 577 /// 578 /// Returns true if an error occurred. 579 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 580 unsigned NumInputs, 581 TemplateArgumentListInfo &Outputs, 582 bool Uneval = false) { 583 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 584 Uneval); 585 } 586 587 /// Transform the given set of template arguments. 588 /// 589 /// By default, this operation transforms all of the template arguments 590 /// in the input set using \c TransformTemplateArgument(), and appends 591 /// the transformed arguments to the output list. 592 /// 593 /// \param First An iterator to the first template argument. 594 /// 595 /// \param Last An iterator one step past the last template argument. 596 /// 597 /// \param Outputs The set of transformed template arguments output by this 598 /// routine. 599 /// 600 /// Returns true if an error occurred. 601 template<typename InputIterator> 602 bool TransformTemplateArguments(InputIterator First, 603 InputIterator Last, 604 TemplateArgumentListInfo &Outputs, 605 bool Uneval = false); 606 607 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 608 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 609 TemplateArgumentLoc &ArgLoc); 610 611 /// Fakes up a TypeSourceInfo for a type. 612 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 613 return SemaRef.Context.getTrivialTypeSourceInfo(T, 614 getDerived().getBaseLocation()); 615 } 616 617 #define ABSTRACT_TYPELOC(CLASS, PARENT) 618 #define TYPELOC(CLASS, PARENT) \ 619 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 620 #include "clang/AST/TypeLocNodes.def" 621 622 template<typename Fn> 623 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 624 FunctionProtoTypeLoc TL, 625 CXXRecordDecl *ThisContext, 626 Qualifiers ThisTypeQuals, 627 Fn TransformExceptionSpec); 628 629 bool TransformExceptionSpec(SourceLocation Loc, 630 FunctionProtoType::ExceptionSpecInfo &ESI, 631 SmallVectorImpl<QualType> &Exceptions, 632 bool &Changed); 633 634 StmtResult TransformSEHHandler(Stmt *Handler); 635 636 QualType 637 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 638 TemplateSpecializationTypeLoc TL, 639 TemplateName Template); 640 641 QualType 642 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 643 DependentTemplateSpecializationTypeLoc TL, 644 TemplateName Template, 645 CXXScopeSpec &SS); 646 647 QualType TransformDependentTemplateSpecializationType( 648 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 649 NestedNameSpecifierLoc QualifierLoc); 650 651 /// Transforms the parameters of a function type into the 652 /// given vectors. 653 /// 654 /// The result vectors should be kept in sync; null entries in the 655 /// variables vector are acceptable. 656 /// 657 /// Return true on error. 658 bool TransformFunctionTypeParams( 659 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 660 const QualType *ParamTypes, 661 const FunctionProtoType::ExtParameterInfo *ParamInfos, 662 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 663 Sema::ExtParameterInfoBuilder &PInfos); 664 665 /// Transforms a single function-type parameter. Return null 666 /// on error. 667 /// 668 /// \param indexAdjustment - A number to add to the parameter's 669 /// scope index; can be negative 670 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 671 int indexAdjustment, 672 Optional<unsigned> NumExpansions, 673 bool ExpectParameterPack); 674 675 /// Transform the body of a lambda-expression. 676 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 677 /// Alternative implementation of TransformLambdaBody that skips transforming 678 /// the body. 679 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 680 681 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 682 683 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 684 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 685 686 TemplateParameterList *TransformTemplateParameterList( 687 TemplateParameterList *TPL) { 688 return TPL; 689 } 690 691 ExprResult TransformAddressOfOperand(Expr *E); 692 693 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 694 bool IsAddressOfOperand, 695 TypeSourceInfo **RecoveryTSI); 696 697 ExprResult TransformParenDependentScopeDeclRefExpr( 698 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 699 TypeSourceInfo **RecoveryTSI); 700 701 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 702 703 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 704 // amount of stack usage with clang. 705 #define STMT(Node, Parent) \ 706 LLVM_ATTRIBUTE_NOINLINE \ 707 StmtResult Transform##Node(Node *S); 708 #define VALUESTMT(Node, Parent) \ 709 LLVM_ATTRIBUTE_NOINLINE \ 710 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 711 #define EXPR(Node, Parent) \ 712 LLVM_ATTRIBUTE_NOINLINE \ 713 ExprResult Transform##Node(Node *E); 714 #define ABSTRACT_STMT(Stmt) 715 #include "clang/AST/StmtNodes.inc" 716 717 #define OPENMP_CLAUSE(Name, Class) \ 718 LLVM_ATTRIBUTE_NOINLINE \ 719 OMPClause *Transform ## Class(Class *S); 720 #include "clang/Basic/OpenMPKinds.def" 721 722 /// Build a new qualified type given its unqualified type and type location. 723 /// 724 /// By default, this routine adds type qualifiers only to types that can 725 /// have qualifiers, and silently suppresses those qualifiers that are not 726 /// permitted. Subclasses may override this routine to provide different 727 /// behavior. 728 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 729 730 /// Build a new pointer type given its pointee type. 731 /// 732 /// By default, performs semantic analysis when building the pointer type. 733 /// Subclasses may override this routine to provide different behavior. 734 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 735 736 /// Build a new block pointer type given its pointee type. 737 /// 738 /// By default, performs semantic analysis when building the block pointer 739 /// type. Subclasses may override this routine to provide different behavior. 740 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 741 742 /// Build a new reference type given the type it references. 743 /// 744 /// By default, performs semantic analysis when building the 745 /// reference type. Subclasses may override this routine to provide 746 /// different behavior. 747 /// 748 /// \param LValue whether the type was written with an lvalue sigil 749 /// or an rvalue sigil. 750 QualType RebuildReferenceType(QualType ReferentType, 751 bool LValue, 752 SourceLocation Sigil); 753 754 /// Build a new member pointer type given the pointee type and the 755 /// class type it refers into. 756 /// 757 /// By default, performs semantic analysis when building the member pointer 758 /// type. Subclasses may override this routine to provide different behavior. 759 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 760 SourceLocation Sigil); 761 762 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 763 SourceLocation ProtocolLAngleLoc, 764 ArrayRef<ObjCProtocolDecl *> Protocols, 765 ArrayRef<SourceLocation> ProtocolLocs, 766 SourceLocation ProtocolRAngleLoc); 767 768 /// Build an Objective-C object type. 769 /// 770 /// By default, performs semantic analysis when building the object type. 771 /// Subclasses may override this routine to provide different behavior. 772 QualType RebuildObjCObjectType(QualType BaseType, 773 SourceLocation Loc, 774 SourceLocation TypeArgsLAngleLoc, 775 ArrayRef<TypeSourceInfo *> TypeArgs, 776 SourceLocation TypeArgsRAngleLoc, 777 SourceLocation ProtocolLAngleLoc, 778 ArrayRef<ObjCProtocolDecl *> Protocols, 779 ArrayRef<SourceLocation> ProtocolLocs, 780 SourceLocation ProtocolRAngleLoc); 781 782 /// Build a new Objective-C object pointer type given the pointee type. 783 /// 784 /// By default, directly builds the pointer type, with no additional semantic 785 /// analysis. 786 QualType RebuildObjCObjectPointerType(QualType PointeeType, 787 SourceLocation Star); 788 789 /// Build a new array type given the element type, size 790 /// modifier, size of the array (if known), size expression, and index type 791 /// qualifiers. 792 /// 793 /// By default, performs semantic analysis when building the array type. 794 /// Subclasses may override this routine to provide different behavior. 795 /// Also by default, all of the other Rebuild*Array 796 QualType RebuildArrayType(QualType ElementType, 797 ArrayType::ArraySizeModifier SizeMod, 798 const llvm::APInt *Size, 799 Expr *SizeExpr, 800 unsigned IndexTypeQuals, 801 SourceRange BracketsRange); 802 803 /// Build a new constant array type given the element type, size 804 /// modifier, (known) size of the array, and index type qualifiers. 805 /// 806 /// By default, performs semantic analysis when building the array type. 807 /// Subclasses may override this routine to provide different behavior. 808 QualType RebuildConstantArrayType(QualType ElementType, 809 ArrayType::ArraySizeModifier SizeMod, 810 const llvm::APInt &Size, 811 Expr *SizeExpr, 812 unsigned IndexTypeQuals, 813 SourceRange BracketsRange); 814 815 /// Build a new incomplete array type given the element type, size 816 /// modifier, and index type qualifiers. 817 /// 818 /// By default, performs semantic analysis when building the array type. 819 /// Subclasses may override this routine to provide different behavior. 820 QualType RebuildIncompleteArrayType(QualType ElementType, 821 ArrayType::ArraySizeModifier SizeMod, 822 unsigned IndexTypeQuals, 823 SourceRange BracketsRange); 824 825 /// Build a new variable-length array type given the element type, 826 /// size modifier, size expression, and index type qualifiers. 827 /// 828 /// By default, performs semantic analysis when building the array type. 829 /// Subclasses may override this routine to provide different behavior. 830 QualType RebuildVariableArrayType(QualType ElementType, 831 ArrayType::ArraySizeModifier SizeMod, 832 Expr *SizeExpr, 833 unsigned IndexTypeQuals, 834 SourceRange BracketsRange); 835 836 /// Build a new dependent-sized array type given the element type, 837 /// size modifier, size expression, and index type qualifiers. 838 /// 839 /// By default, performs semantic analysis when building the array type. 840 /// Subclasses may override this routine to provide different behavior. 841 QualType RebuildDependentSizedArrayType(QualType ElementType, 842 ArrayType::ArraySizeModifier SizeMod, 843 Expr *SizeExpr, 844 unsigned IndexTypeQuals, 845 SourceRange BracketsRange); 846 847 /// Build a new vector type given the element type and 848 /// number of elements. 849 /// 850 /// By default, performs semantic analysis when building the vector type. 851 /// Subclasses may override this routine to provide different behavior. 852 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 853 VectorType::VectorKind VecKind); 854 855 /// Build a new potentially dependently-sized extended vector type 856 /// given the element type and number of elements. 857 /// 858 /// By default, performs semantic analysis when building the vector type. 859 /// Subclasses may override this routine to provide different behavior. 860 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 861 SourceLocation AttributeLoc, 862 VectorType::VectorKind); 863 864 /// Build a new extended vector type given the element type and 865 /// number of elements. 866 /// 867 /// By default, performs semantic analysis when building the vector type. 868 /// Subclasses may override this routine to provide different behavior. 869 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 870 SourceLocation AttributeLoc); 871 872 /// Build a new potentially dependently-sized extended vector type 873 /// given the element type and number of elements. 874 /// 875 /// By default, performs semantic analysis when building the vector type. 876 /// Subclasses may override this routine to provide different behavior. 877 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 878 Expr *SizeExpr, 879 SourceLocation AttributeLoc); 880 881 /// Build a new DependentAddressSpaceType or return the pointee 882 /// type variable with the correct address space (retrieved from 883 /// AddrSpaceExpr) applied to it. The former will be returned in cases 884 /// where the address space remains dependent. 885 /// 886 /// By default, performs semantic analysis when building the type with address 887 /// space applied. Subclasses may override this routine to provide different 888 /// behavior. 889 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 890 Expr *AddrSpaceExpr, 891 SourceLocation AttributeLoc); 892 893 /// Build a new function type. 894 /// 895 /// By default, performs semantic analysis when building the function type. 896 /// Subclasses may override this routine to provide different behavior. 897 QualType RebuildFunctionProtoType(QualType T, 898 MutableArrayRef<QualType> ParamTypes, 899 const FunctionProtoType::ExtProtoInfo &EPI); 900 901 /// Build a new unprototyped function type. 902 QualType RebuildFunctionNoProtoType(QualType ResultType); 903 904 /// Rebuild an unresolved typename type, given the decl that 905 /// the UnresolvedUsingTypenameDecl was transformed to. 906 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 907 908 /// Build a new typedef type. 909 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 910 return SemaRef.Context.getTypeDeclType(Typedef); 911 } 912 913 /// Build a new MacroDefined type. 914 QualType RebuildMacroQualifiedType(QualType T, 915 const IdentifierInfo *MacroII) { 916 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 917 } 918 919 /// Build a new class/struct/union type. 920 QualType RebuildRecordType(RecordDecl *Record) { 921 return SemaRef.Context.getTypeDeclType(Record); 922 } 923 924 /// Build a new Enum type. 925 QualType RebuildEnumType(EnumDecl *Enum) { 926 return SemaRef.Context.getTypeDeclType(Enum); 927 } 928 929 /// Build a new typeof(expr) type. 930 /// 931 /// By default, performs semantic analysis when building the typeof type. 932 /// Subclasses may override this routine to provide different behavior. 933 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 934 935 /// Build a new typeof(type) type. 936 /// 937 /// By default, builds a new TypeOfType with the given underlying type. 938 QualType RebuildTypeOfType(QualType Underlying); 939 940 /// Build a new unary transform type. 941 QualType RebuildUnaryTransformType(QualType BaseType, 942 UnaryTransformType::UTTKind UKind, 943 SourceLocation Loc); 944 945 /// Build a new C++11 decltype type. 946 /// 947 /// By default, performs semantic analysis when building the decltype type. 948 /// Subclasses may override this routine to provide different behavior. 949 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 950 951 /// Build a new C++11 auto type. 952 /// 953 /// By default, builds a new AutoType with the given deduced type. 954 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 955 ConceptDecl *TypeConstraintConcept, 956 ArrayRef<TemplateArgument> TypeConstraintArgs) { 957 // Note, IsDependent is always false here: we implicitly convert an 'auto' 958 // which has been deduced to a dependent type into an undeduced 'auto', so 959 // that we'll retry deduction after the transformation. 960 return SemaRef.Context.getAutoType(Deduced, Keyword, 961 /*IsDependent*/ false, /*IsPack=*/false, 962 TypeConstraintConcept, 963 TypeConstraintArgs); 964 } 965 966 /// By default, builds a new DeducedTemplateSpecializationType with the given 967 /// deduced type. 968 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 969 QualType Deduced) { 970 return SemaRef.Context.getDeducedTemplateSpecializationType( 971 Template, Deduced, /*IsDependent*/ false); 972 } 973 974 /// Build a new template specialization type. 975 /// 976 /// By default, performs semantic analysis when building the template 977 /// specialization type. Subclasses may override this routine to provide 978 /// different behavior. 979 QualType RebuildTemplateSpecializationType(TemplateName Template, 980 SourceLocation TemplateLoc, 981 TemplateArgumentListInfo &Args); 982 983 /// Build a new parenthesized type. 984 /// 985 /// By default, builds a new ParenType type from the inner type. 986 /// Subclasses may override this routine to provide different behavior. 987 QualType RebuildParenType(QualType InnerType) { 988 return SemaRef.BuildParenType(InnerType); 989 } 990 991 /// Build a new qualified name type. 992 /// 993 /// By default, builds a new ElaboratedType type from the keyword, 994 /// the nested-name-specifier and the named type. 995 /// Subclasses may override this routine to provide different behavior. 996 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 997 ElaboratedTypeKeyword Keyword, 998 NestedNameSpecifierLoc QualifierLoc, 999 QualType Named) { 1000 return SemaRef.Context.getElaboratedType(Keyword, 1001 QualifierLoc.getNestedNameSpecifier(), 1002 Named); 1003 } 1004 1005 /// Build a new typename type that refers to a template-id. 1006 /// 1007 /// By default, builds a new DependentNameType type from the 1008 /// nested-name-specifier and the given type. Subclasses may override 1009 /// this routine to provide different behavior. 1010 QualType RebuildDependentTemplateSpecializationType( 1011 ElaboratedTypeKeyword Keyword, 1012 NestedNameSpecifierLoc QualifierLoc, 1013 SourceLocation TemplateKWLoc, 1014 const IdentifierInfo *Name, 1015 SourceLocation NameLoc, 1016 TemplateArgumentListInfo &Args, 1017 bool AllowInjectedClassName) { 1018 // Rebuild the template name. 1019 // TODO: avoid TemplateName abstraction 1020 CXXScopeSpec SS; 1021 SS.Adopt(QualifierLoc); 1022 TemplateName InstName = getDerived().RebuildTemplateName( 1023 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1024 AllowInjectedClassName); 1025 1026 if (InstName.isNull()) 1027 return QualType(); 1028 1029 // If it's still dependent, make a dependent specialization. 1030 if (InstName.getAsDependentTemplateName()) 1031 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1032 QualifierLoc.getNestedNameSpecifier(), 1033 Name, 1034 Args); 1035 1036 // Otherwise, make an elaborated type wrapping a non-dependent 1037 // specialization. 1038 QualType T = 1039 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1040 if (T.isNull()) return QualType(); 1041 1042 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1043 return T; 1044 1045 return SemaRef.Context.getElaboratedType(Keyword, 1046 QualifierLoc.getNestedNameSpecifier(), 1047 T); 1048 } 1049 1050 /// Build a new typename type that refers to an identifier. 1051 /// 1052 /// By default, performs semantic analysis when building the typename type 1053 /// (or elaborated type). Subclasses may override this routine to provide 1054 /// different behavior. 1055 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1056 SourceLocation KeywordLoc, 1057 NestedNameSpecifierLoc QualifierLoc, 1058 const IdentifierInfo *Id, 1059 SourceLocation IdLoc, 1060 bool DeducedTSTContext) { 1061 CXXScopeSpec SS; 1062 SS.Adopt(QualifierLoc); 1063 1064 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1065 // If the name is still dependent, just build a new dependent name type. 1066 if (!SemaRef.computeDeclContext(SS)) 1067 return SemaRef.Context.getDependentNameType(Keyword, 1068 QualifierLoc.getNestedNameSpecifier(), 1069 Id); 1070 } 1071 1072 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1073 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1074 *Id, IdLoc, DeducedTSTContext); 1075 } 1076 1077 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1078 1079 // We had a dependent elaborated-type-specifier that has been transformed 1080 // into a non-dependent elaborated-type-specifier. Find the tag we're 1081 // referring to. 1082 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1083 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1084 if (!DC) 1085 return QualType(); 1086 1087 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1088 return QualType(); 1089 1090 TagDecl *Tag = nullptr; 1091 SemaRef.LookupQualifiedName(Result, DC); 1092 switch (Result.getResultKind()) { 1093 case LookupResult::NotFound: 1094 case LookupResult::NotFoundInCurrentInstantiation: 1095 break; 1096 1097 case LookupResult::Found: 1098 Tag = Result.getAsSingle<TagDecl>(); 1099 break; 1100 1101 case LookupResult::FoundOverloaded: 1102 case LookupResult::FoundUnresolvedValue: 1103 llvm_unreachable("Tag lookup cannot find non-tags"); 1104 1105 case LookupResult::Ambiguous: 1106 // Let the LookupResult structure handle ambiguities. 1107 return QualType(); 1108 } 1109 1110 if (!Tag) { 1111 // Check where the name exists but isn't a tag type and use that to emit 1112 // better diagnostics. 1113 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1114 SemaRef.LookupQualifiedName(Result, DC); 1115 switch (Result.getResultKind()) { 1116 case LookupResult::Found: 1117 case LookupResult::FoundOverloaded: 1118 case LookupResult::FoundUnresolvedValue: { 1119 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1120 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1121 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1122 << NTK << Kind; 1123 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1124 break; 1125 } 1126 default: 1127 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1128 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1129 break; 1130 } 1131 return QualType(); 1132 } 1133 1134 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1135 IdLoc, Id)) { 1136 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1137 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1138 return QualType(); 1139 } 1140 1141 // Build the elaborated-type-specifier type. 1142 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1143 return SemaRef.Context.getElaboratedType(Keyword, 1144 QualifierLoc.getNestedNameSpecifier(), 1145 T); 1146 } 1147 1148 /// Build a new pack expansion type. 1149 /// 1150 /// By default, builds a new PackExpansionType type from the given pattern. 1151 /// Subclasses may override this routine to provide different behavior. 1152 QualType RebuildPackExpansionType(QualType Pattern, 1153 SourceRange PatternRange, 1154 SourceLocation EllipsisLoc, 1155 Optional<unsigned> NumExpansions) { 1156 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1157 NumExpansions); 1158 } 1159 1160 /// Build a new atomic type given its value type. 1161 /// 1162 /// By default, performs semantic analysis when building the atomic type. 1163 /// Subclasses may override this routine to provide different behavior. 1164 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1165 1166 /// Build a new pipe type given its value type. 1167 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1168 bool isReadPipe); 1169 1170 /// Build a new template name given a nested name specifier, a flag 1171 /// indicating whether the "template" keyword was provided, and the template 1172 /// that the template name refers to. 1173 /// 1174 /// By default, builds the new template name directly. Subclasses may override 1175 /// this routine to provide different behavior. 1176 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1177 bool TemplateKW, 1178 TemplateDecl *Template); 1179 1180 /// Build a new template name given a nested name specifier and the 1181 /// name that is referred to as a template. 1182 /// 1183 /// By default, performs semantic analysis to determine whether the name can 1184 /// be resolved to a specific template, then builds the appropriate kind of 1185 /// template name. Subclasses may override this routine to provide different 1186 /// behavior. 1187 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1188 SourceLocation TemplateKWLoc, 1189 const IdentifierInfo &Name, 1190 SourceLocation NameLoc, QualType ObjectType, 1191 NamedDecl *FirstQualifierInScope, 1192 bool AllowInjectedClassName); 1193 1194 /// Build a new template name given a nested name specifier and the 1195 /// overloaded operator name that is referred to as a template. 1196 /// 1197 /// By default, performs semantic analysis to determine whether the name can 1198 /// be resolved to a specific template, then builds the appropriate kind of 1199 /// template name. Subclasses may override this routine to provide different 1200 /// behavior. 1201 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1202 SourceLocation TemplateKWLoc, 1203 OverloadedOperatorKind Operator, 1204 SourceLocation NameLoc, QualType ObjectType, 1205 bool AllowInjectedClassName); 1206 1207 /// Build a new template name given a template template parameter pack 1208 /// and the 1209 /// 1210 /// By default, performs semantic analysis to determine whether the name can 1211 /// be resolved to a specific template, then builds the appropriate kind of 1212 /// template name. Subclasses may override this routine to provide different 1213 /// behavior. 1214 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1215 const TemplateArgument &ArgPack) { 1216 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1217 } 1218 1219 /// Build a new compound statement. 1220 /// 1221 /// By default, performs semantic analysis to build the new statement. 1222 /// Subclasses may override this routine to provide different behavior. 1223 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1224 MultiStmtArg Statements, 1225 SourceLocation RBraceLoc, 1226 bool IsStmtExpr) { 1227 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1228 IsStmtExpr); 1229 } 1230 1231 /// Build a new case statement. 1232 /// 1233 /// By default, performs semantic analysis to build the new statement. 1234 /// Subclasses may override this routine to provide different behavior. 1235 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1236 Expr *LHS, 1237 SourceLocation EllipsisLoc, 1238 Expr *RHS, 1239 SourceLocation ColonLoc) { 1240 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1241 ColonLoc); 1242 } 1243 1244 /// Attach the body to a new case statement. 1245 /// 1246 /// By default, performs semantic analysis to build the new statement. 1247 /// Subclasses may override this routine to provide different behavior. 1248 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1249 getSema().ActOnCaseStmtBody(S, Body); 1250 return S; 1251 } 1252 1253 /// Build a new default statement. 1254 /// 1255 /// By default, performs semantic analysis to build the new statement. 1256 /// Subclasses may override this routine to provide different behavior. 1257 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1258 SourceLocation ColonLoc, 1259 Stmt *SubStmt) { 1260 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1261 /*CurScope=*/nullptr); 1262 } 1263 1264 /// Build a new label statement. 1265 /// 1266 /// By default, performs semantic analysis to build the new statement. 1267 /// Subclasses may override this routine to provide different behavior. 1268 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1269 SourceLocation ColonLoc, Stmt *SubStmt) { 1270 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1271 } 1272 1273 /// Build a new label statement. 1274 /// 1275 /// By default, performs semantic analysis to build the new statement. 1276 /// Subclasses may override this routine to provide different behavior. 1277 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1278 ArrayRef<const Attr*> Attrs, 1279 Stmt *SubStmt) { 1280 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1281 } 1282 1283 /// Build a new "if" statement. 1284 /// 1285 /// By default, performs semantic analysis to build the new statement. 1286 /// Subclasses may override this routine to provide different behavior. 1287 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1288 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1289 SourceLocation ElseLoc, Stmt *Else) { 1290 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1291 ElseLoc, Else); 1292 } 1293 1294 /// Start building a new switch statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1299 Sema::ConditionResult Cond) { 1300 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1301 } 1302 1303 /// Attach the body to the switch statement. 1304 /// 1305 /// By default, performs semantic analysis to build the new statement. 1306 /// Subclasses may override this routine to provide different behavior. 1307 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1308 Stmt *Switch, Stmt *Body) { 1309 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1310 } 1311 1312 /// Build a new while 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 RebuildWhileStmt(SourceLocation WhileLoc, 1317 Sema::ConditionResult Cond, Stmt *Body) { 1318 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1319 } 1320 1321 /// Build a new do-while statement. 1322 /// 1323 /// By default, performs semantic analysis to build the new statement. 1324 /// Subclasses may override this routine to provide different behavior. 1325 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1326 SourceLocation WhileLoc, SourceLocation LParenLoc, 1327 Expr *Cond, SourceLocation RParenLoc) { 1328 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1329 Cond, RParenLoc); 1330 } 1331 1332 /// Build a new for statement. 1333 /// 1334 /// By default, performs semantic analysis to build the new statement. 1335 /// Subclasses may override this routine to provide different behavior. 1336 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1337 Stmt *Init, Sema::ConditionResult Cond, 1338 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1339 Stmt *Body) { 1340 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1341 Inc, RParenLoc, Body); 1342 } 1343 1344 /// Build a new goto statement. 1345 /// 1346 /// By default, performs semantic analysis to build the new statement. 1347 /// Subclasses may override this routine to provide different behavior. 1348 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1349 LabelDecl *Label) { 1350 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1351 } 1352 1353 /// Build a new indirect goto statement. 1354 /// 1355 /// By default, performs semantic analysis to build the new statement. 1356 /// Subclasses may override this routine to provide different behavior. 1357 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1358 SourceLocation StarLoc, 1359 Expr *Target) { 1360 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1361 } 1362 1363 /// Build a new return statement. 1364 /// 1365 /// By default, performs semantic analysis to build the new statement. 1366 /// Subclasses may override this routine to provide different behavior. 1367 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1368 return getSema().BuildReturnStmt(ReturnLoc, Result); 1369 } 1370 1371 /// Build a new declaration statement. 1372 /// 1373 /// By default, performs semantic analysis to build the new statement. 1374 /// Subclasses may override this routine to provide different behavior. 1375 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1376 SourceLocation StartLoc, SourceLocation EndLoc) { 1377 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1378 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1379 } 1380 1381 /// Build a new inline asm statement. 1382 /// 1383 /// By default, performs semantic analysis to build the new statement. 1384 /// Subclasses may override this routine to provide different behavior. 1385 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1386 bool IsVolatile, unsigned NumOutputs, 1387 unsigned NumInputs, IdentifierInfo **Names, 1388 MultiExprArg Constraints, MultiExprArg Exprs, 1389 Expr *AsmString, MultiExprArg Clobbers, 1390 unsigned NumLabels, 1391 SourceLocation RParenLoc) { 1392 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1393 NumInputs, Names, Constraints, Exprs, 1394 AsmString, Clobbers, NumLabels, RParenLoc); 1395 } 1396 1397 /// Build a new MS style inline asm statement. 1398 /// 1399 /// By default, performs semantic analysis to build the new statement. 1400 /// Subclasses may override this routine to provide different behavior. 1401 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1402 ArrayRef<Token> AsmToks, 1403 StringRef AsmString, 1404 unsigned NumOutputs, unsigned NumInputs, 1405 ArrayRef<StringRef> Constraints, 1406 ArrayRef<StringRef> Clobbers, 1407 ArrayRef<Expr*> Exprs, 1408 SourceLocation EndLoc) { 1409 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1410 NumOutputs, NumInputs, 1411 Constraints, Clobbers, Exprs, EndLoc); 1412 } 1413 1414 /// Build a new co_return statement. 1415 /// 1416 /// By default, performs semantic analysis to build the new statement. 1417 /// Subclasses may override this routine to provide different behavior. 1418 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1419 bool IsImplicit) { 1420 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1421 } 1422 1423 /// Build a new co_await expression. 1424 /// 1425 /// By default, performs semantic analysis to build the new expression. 1426 /// Subclasses may override this routine to provide different behavior. 1427 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1428 bool IsImplicit) { 1429 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1430 } 1431 1432 /// Build a new co_await expression. 1433 /// 1434 /// By default, performs semantic analysis to build the new expression. 1435 /// Subclasses may override this routine to provide different behavior. 1436 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1437 Expr *Result, 1438 UnresolvedLookupExpr *Lookup) { 1439 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1440 } 1441 1442 /// Build a new co_yield expression. 1443 /// 1444 /// By default, performs semantic analysis to build the new expression. 1445 /// Subclasses may override this routine to provide different behavior. 1446 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1447 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1448 } 1449 1450 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1451 return getSema().BuildCoroutineBodyStmt(Args); 1452 } 1453 1454 /// Build a new Objective-C \@try statement. 1455 /// 1456 /// By default, performs semantic analysis to build the new statement. 1457 /// Subclasses may override this routine to provide different behavior. 1458 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1459 Stmt *TryBody, 1460 MultiStmtArg CatchStmts, 1461 Stmt *Finally) { 1462 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1463 Finally); 1464 } 1465 1466 /// Rebuild an Objective-C exception declaration. 1467 /// 1468 /// By default, performs semantic analysis to build the new declaration. 1469 /// Subclasses may override this routine to provide different behavior. 1470 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1471 TypeSourceInfo *TInfo, QualType T) { 1472 return getSema().BuildObjCExceptionDecl(TInfo, T, 1473 ExceptionDecl->getInnerLocStart(), 1474 ExceptionDecl->getLocation(), 1475 ExceptionDecl->getIdentifier()); 1476 } 1477 1478 /// Build a new Objective-C \@catch statement. 1479 /// 1480 /// By default, performs semantic analysis to build the new statement. 1481 /// Subclasses may override this routine to provide different behavior. 1482 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1483 SourceLocation RParenLoc, 1484 VarDecl *Var, 1485 Stmt *Body) { 1486 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1487 Var, Body); 1488 } 1489 1490 /// Build a new Objective-C \@finally statement. 1491 /// 1492 /// By default, performs semantic analysis to build the new statement. 1493 /// Subclasses may override this routine to provide different behavior. 1494 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1495 Stmt *Body) { 1496 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1497 } 1498 1499 /// Build a new Objective-C \@throw statement. 1500 /// 1501 /// By default, performs semantic analysis to build the new statement. 1502 /// Subclasses may override this routine to provide different behavior. 1503 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1504 Expr *Operand) { 1505 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1506 } 1507 1508 /// Build a new OpenMP executable directive. 1509 /// 1510 /// By default, performs semantic analysis to build the new statement. 1511 /// Subclasses may override this routine to provide different behavior. 1512 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1513 DeclarationNameInfo DirName, 1514 OpenMPDirectiveKind CancelRegion, 1515 ArrayRef<OMPClause *> Clauses, 1516 Stmt *AStmt, SourceLocation StartLoc, 1517 SourceLocation EndLoc) { 1518 return getSema().ActOnOpenMPExecutableDirective( 1519 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1520 } 1521 1522 /// Build a new OpenMP 'if' clause. 1523 /// 1524 /// By default, performs semantic analysis to build the new OpenMP clause. 1525 /// Subclasses may override this routine to provide different behavior. 1526 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1527 Expr *Condition, SourceLocation StartLoc, 1528 SourceLocation LParenLoc, 1529 SourceLocation NameModifierLoc, 1530 SourceLocation ColonLoc, 1531 SourceLocation EndLoc) { 1532 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1533 LParenLoc, NameModifierLoc, ColonLoc, 1534 EndLoc); 1535 } 1536 1537 /// Build a new OpenMP 'final' clause. 1538 /// 1539 /// By default, performs semantic analysis to build the new OpenMP clause. 1540 /// Subclasses may override this routine to provide different behavior. 1541 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1542 SourceLocation LParenLoc, 1543 SourceLocation EndLoc) { 1544 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1545 EndLoc); 1546 } 1547 1548 /// Build a new OpenMP 'num_threads' clause. 1549 /// 1550 /// By default, performs semantic analysis to build the new OpenMP clause. 1551 /// Subclasses may override this routine to provide different behavior. 1552 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1553 SourceLocation StartLoc, 1554 SourceLocation LParenLoc, 1555 SourceLocation EndLoc) { 1556 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1557 LParenLoc, EndLoc); 1558 } 1559 1560 /// Build a new OpenMP 'safelen' clause. 1561 /// 1562 /// By default, performs semantic analysis to build the new OpenMP clause. 1563 /// Subclasses may override this routine to provide different behavior. 1564 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1565 SourceLocation LParenLoc, 1566 SourceLocation EndLoc) { 1567 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1568 } 1569 1570 /// Build a new OpenMP 'simdlen' clause. 1571 /// 1572 /// By default, performs semantic analysis to build the new OpenMP clause. 1573 /// Subclasses may override this routine to provide different behavior. 1574 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1575 SourceLocation LParenLoc, 1576 SourceLocation EndLoc) { 1577 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1578 } 1579 1580 /// Build a new OpenMP 'allocator' clause. 1581 /// 1582 /// By default, performs semantic analysis to build the new OpenMP clause. 1583 /// Subclasses may override this routine to provide different behavior. 1584 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1585 SourceLocation LParenLoc, 1586 SourceLocation EndLoc) { 1587 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1588 } 1589 1590 /// Build a new OpenMP 'collapse' clause. 1591 /// 1592 /// By default, performs semantic analysis to build the new OpenMP clause. 1593 /// Subclasses may override this routine to provide different behavior. 1594 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1595 SourceLocation LParenLoc, 1596 SourceLocation EndLoc) { 1597 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1598 EndLoc); 1599 } 1600 1601 /// Build a new OpenMP 'default' 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 *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1606 SourceLocation KindKwLoc, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1611 StartLoc, LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'proc_bind' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1619 SourceLocation KindKwLoc, 1620 SourceLocation StartLoc, 1621 SourceLocation LParenLoc, 1622 SourceLocation EndLoc) { 1623 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1624 StartLoc, LParenLoc, EndLoc); 1625 } 1626 1627 /// Build a new OpenMP 'schedule' clause. 1628 /// 1629 /// By default, performs semantic analysis to build the new OpenMP clause. 1630 /// Subclasses may override this routine to provide different behavior. 1631 OMPClause *RebuildOMPScheduleClause( 1632 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1633 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1634 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1635 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1636 return getSema().ActOnOpenMPScheduleClause( 1637 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1638 CommaLoc, EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'ordered' clause. 1642 /// 1643 /// By default, performs semantic analysis to build the new OpenMP clause. 1644 /// Subclasses may override this routine to provide different behavior. 1645 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1646 SourceLocation EndLoc, 1647 SourceLocation LParenLoc, Expr *Num) { 1648 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1649 } 1650 1651 /// Build a new OpenMP 'private' clause. 1652 /// 1653 /// By default, performs semantic analysis to build the new OpenMP clause. 1654 /// Subclasses may override this routine to provide different behavior. 1655 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1656 SourceLocation StartLoc, 1657 SourceLocation LParenLoc, 1658 SourceLocation EndLoc) { 1659 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1660 EndLoc); 1661 } 1662 1663 /// Build a new OpenMP 'firstprivate' clause. 1664 /// 1665 /// By default, performs semantic analysis to build the new OpenMP clause. 1666 /// Subclasses may override this routine to provide different behavior. 1667 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1668 SourceLocation StartLoc, 1669 SourceLocation LParenLoc, 1670 SourceLocation EndLoc) { 1671 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1672 EndLoc); 1673 } 1674 1675 /// Build a new OpenMP 'lastprivate' clause. 1676 /// 1677 /// By default, performs semantic analysis to build the new OpenMP clause. 1678 /// Subclasses may override this routine to provide different behavior. 1679 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1680 OpenMPLastprivateModifier LPKind, 1681 SourceLocation LPKindLoc, 1682 SourceLocation ColonLoc, 1683 SourceLocation StartLoc, 1684 SourceLocation LParenLoc, 1685 SourceLocation EndLoc) { 1686 return getSema().ActOnOpenMPLastprivateClause( 1687 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1688 } 1689 1690 /// Build a new OpenMP 'shared' clause. 1691 /// 1692 /// By default, performs semantic analysis to build the new OpenMP clause. 1693 /// Subclasses may override this routine to provide different behavior. 1694 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1695 SourceLocation StartLoc, 1696 SourceLocation LParenLoc, 1697 SourceLocation EndLoc) { 1698 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1699 EndLoc); 1700 } 1701 1702 /// Build a new OpenMP 'reduction' clause. 1703 /// 1704 /// By default, performs semantic analysis to build the new statement. 1705 /// Subclasses may override this routine to provide different behavior. 1706 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1707 SourceLocation StartLoc, 1708 SourceLocation LParenLoc, 1709 SourceLocation ColonLoc, 1710 SourceLocation EndLoc, 1711 CXXScopeSpec &ReductionIdScopeSpec, 1712 const DeclarationNameInfo &ReductionId, 1713 ArrayRef<Expr *> UnresolvedReductions) { 1714 return getSema().ActOnOpenMPReductionClause( 1715 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1716 ReductionId, UnresolvedReductions); 1717 } 1718 1719 /// Build a new OpenMP 'task_reduction' clause. 1720 /// 1721 /// By default, performs semantic analysis to build the new statement. 1722 /// Subclasses may override this routine to provide different behavior. 1723 OMPClause *RebuildOMPTaskReductionClause( 1724 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1725 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1726 CXXScopeSpec &ReductionIdScopeSpec, 1727 const DeclarationNameInfo &ReductionId, 1728 ArrayRef<Expr *> UnresolvedReductions) { 1729 return getSema().ActOnOpenMPTaskReductionClause( 1730 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1731 ReductionId, UnresolvedReductions); 1732 } 1733 1734 /// Build a new OpenMP 'in_reduction' clause. 1735 /// 1736 /// By default, performs semantic analysis to build the new statement. 1737 /// Subclasses may override this routine to provide different behavior. 1738 OMPClause * 1739 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1740 SourceLocation LParenLoc, SourceLocation ColonLoc, 1741 SourceLocation EndLoc, 1742 CXXScopeSpec &ReductionIdScopeSpec, 1743 const DeclarationNameInfo &ReductionId, 1744 ArrayRef<Expr *> UnresolvedReductions) { 1745 return getSema().ActOnOpenMPInReductionClause( 1746 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1747 ReductionId, UnresolvedReductions); 1748 } 1749 1750 /// Build a new OpenMP 'linear' 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 *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1755 SourceLocation StartLoc, 1756 SourceLocation LParenLoc, 1757 OpenMPLinearClauseKind Modifier, 1758 SourceLocation ModifierLoc, 1759 SourceLocation ColonLoc, 1760 SourceLocation EndLoc) { 1761 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1762 Modifier, ModifierLoc, ColonLoc, 1763 EndLoc); 1764 } 1765 1766 /// Build a new OpenMP 'aligned' clause. 1767 /// 1768 /// By default, performs semantic analysis to build the new OpenMP clause. 1769 /// Subclasses may override this routine to provide different behavior. 1770 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1771 SourceLocation StartLoc, 1772 SourceLocation LParenLoc, 1773 SourceLocation ColonLoc, 1774 SourceLocation EndLoc) { 1775 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1776 LParenLoc, ColonLoc, EndLoc); 1777 } 1778 1779 /// Build a new OpenMP 'copyin' clause. 1780 /// 1781 /// By default, performs semantic analysis to build the new OpenMP clause. 1782 /// Subclasses may override this routine to provide different behavior. 1783 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1784 SourceLocation StartLoc, 1785 SourceLocation LParenLoc, 1786 SourceLocation EndLoc) { 1787 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1788 EndLoc); 1789 } 1790 1791 /// Build a new OpenMP 'copyprivate' clause. 1792 /// 1793 /// By default, performs semantic analysis to build the new OpenMP clause. 1794 /// Subclasses may override this routine to provide different behavior. 1795 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1796 SourceLocation StartLoc, 1797 SourceLocation LParenLoc, 1798 SourceLocation EndLoc) { 1799 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1800 EndLoc); 1801 } 1802 1803 /// Build a new OpenMP 'flush' pseudo clause. 1804 /// 1805 /// By default, performs semantic analysis to build the new OpenMP clause. 1806 /// Subclasses may override this routine to provide different behavior. 1807 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1808 SourceLocation StartLoc, 1809 SourceLocation LParenLoc, 1810 SourceLocation EndLoc) { 1811 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1812 EndLoc); 1813 } 1814 1815 /// Build a new OpenMP 'depend' pseudo clause. 1816 /// 1817 /// By default, performs semantic analysis to build the new OpenMP clause. 1818 /// Subclasses may override this routine to provide different behavior. 1819 OMPClause * 1820 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1821 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1822 SourceLocation StartLoc, SourceLocation LParenLoc, 1823 SourceLocation EndLoc) { 1824 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1825 StartLoc, LParenLoc, EndLoc); 1826 } 1827 1828 /// Build a new OpenMP 'device' clause. 1829 /// 1830 /// By default, performs semantic analysis to build the new statement. 1831 /// Subclasses may override this routine to provide different behavior. 1832 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1833 SourceLocation LParenLoc, 1834 SourceLocation EndLoc) { 1835 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1836 EndLoc); 1837 } 1838 1839 /// Build a new OpenMP 'map' clause. 1840 /// 1841 /// By default, performs semantic analysis to build the new OpenMP clause. 1842 /// Subclasses may override this routine to provide different behavior. 1843 OMPClause *RebuildOMPMapClause( 1844 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1845 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1846 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1847 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1848 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1849 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1850 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1851 MapperIdScopeSpec, MapperId, MapType, 1852 IsMapTypeImplicit, MapLoc, ColonLoc, 1853 VarList, Locs, UnresolvedMappers); 1854 } 1855 1856 /// Build a new OpenMP 'allocate' clause. 1857 /// 1858 /// By default, performs semantic analysis to build the new OpenMP clause. 1859 /// Subclasses may override this routine to provide different behavior. 1860 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1861 SourceLocation StartLoc, 1862 SourceLocation LParenLoc, 1863 SourceLocation ColonLoc, 1864 SourceLocation EndLoc) { 1865 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1866 LParenLoc, ColonLoc, EndLoc); 1867 } 1868 1869 /// Build a new OpenMP 'num_teams' clause. 1870 /// 1871 /// By default, performs semantic analysis to build the new statement. 1872 /// Subclasses may override this routine to provide different behavior. 1873 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1874 SourceLocation LParenLoc, 1875 SourceLocation EndLoc) { 1876 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1877 EndLoc); 1878 } 1879 1880 /// Build a new OpenMP 'thread_limit' clause. 1881 /// 1882 /// By default, performs semantic analysis to build the new statement. 1883 /// Subclasses may override this routine to provide different behavior. 1884 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1885 SourceLocation StartLoc, 1886 SourceLocation LParenLoc, 1887 SourceLocation EndLoc) { 1888 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1889 LParenLoc, EndLoc); 1890 } 1891 1892 /// Build a new OpenMP 'priority' clause. 1893 /// 1894 /// By default, performs semantic analysis to build the new statement. 1895 /// Subclasses may override this routine to provide different behavior. 1896 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1897 SourceLocation LParenLoc, 1898 SourceLocation EndLoc) { 1899 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1900 EndLoc); 1901 } 1902 1903 /// Build a new OpenMP 'grainsize' clause. 1904 /// 1905 /// By default, performs semantic analysis to build the new statement. 1906 /// Subclasses may override this routine to provide different behavior. 1907 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1908 SourceLocation LParenLoc, 1909 SourceLocation EndLoc) { 1910 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1911 EndLoc); 1912 } 1913 1914 /// Build a new OpenMP 'num_tasks' clause. 1915 /// 1916 /// By default, performs semantic analysis to build the new statement. 1917 /// Subclasses may override this routine to provide different behavior. 1918 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation EndLoc) { 1921 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1922 EndLoc); 1923 } 1924 1925 /// Build a new OpenMP 'hint' clause. 1926 /// 1927 /// By default, performs semantic analysis to build the new statement. 1928 /// Subclasses may override this routine to provide different behavior. 1929 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation EndLoc) { 1932 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1933 } 1934 1935 /// Build a new OpenMP 'dist_schedule' clause. 1936 /// 1937 /// By default, performs semantic analysis to build the new OpenMP clause. 1938 /// Subclasses may override this routine to provide different behavior. 1939 OMPClause * 1940 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1941 Expr *ChunkSize, SourceLocation StartLoc, 1942 SourceLocation LParenLoc, SourceLocation KindLoc, 1943 SourceLocation CommaLoc, SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPDistScheduleClause( 1945 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'to' clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new statement. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1953 CXXScopeSpec &MapperIdScopeSpec, 1954 DeclarationNameInfo &MapperId, 1955 const OMPVarListLocTy &Locs, 1956 ArrayRef<Expr *> UnresolvedMappers) { 1957 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 1958 Locs, UnresolvedMappers); 1959 } 1960 1961 /// Build a new OpenMP 'from' clause. 1962 /// 1963 /// By default, performs semantic analysis to build the new statement. 1964 /// Subclasses may override this routine to provide different behavior. 1965 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1966 CXXScopeSpec &MapperIdScopeSpec, 1967 DeclarationNameInfo &MapperId, 1968 const OMPVarListLocTy &Locs, 1969 ArrayRef<Expr *> UnresolvedMappers) { 1970 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 1971 Locs, UnresolvedMappers); 1972 } 1973 1974 /// Build a new OpenMP 'use_device_ptr' clause. 1975 /// 1976 /// By default, performs semantic analysis to build the new OpenMP clause. 1977 /// Subclasses may override this routine to provide different behavior. 1978 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1979 const OMPVarListLocTy &Locs) { 1980 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 1981 } 1982 1983 /// Build a new OpenMP 'is_device_ptr' clause. 1984 /// 1985 /// By default, performs semantic analysis to build the new OpenMP clause. 1986 /// Subclasses may override this routine to provide different behavior. 1987 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1988 const OMPVarListLocTy &Locs) { 1989 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 1990 } 1991 1992 /// Build a new OpenMP 'defaultmap' clause. 1993 /// 1994 /// By default, performs semantic analysis to build the new OpenMP clause. 1995 /// Subclasses may override this routine to provide different behavior. 1996 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 1997 OpenMPDefaultmapClauseKind Kind, 1998 SourceLocation StartLoc, 1999 SourceLocation LParenLoc, 2000 SourceLocation MLoc, 2001 SourceLocation KindLoc, 2002 SourceLocation EndLoc) { 2003 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2004 MLoc, KindLoc, EndLoc); 2005 } 2006 2007 /// Build a new OpenMP 'nontemporal' clause. 2008 /// 2009 /// By default, performs semantic analysis to build the new OpenMP clause. 2010 /// Subclasses may override this routine to provide different behavior. 2011 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2012 SourceLocation StartLoc, 2013 SourceLocation LParenLoc, 2014 SourceLocation EndLoc) { 2015 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2016 EndLoc); 2017 } 2018 2019 /// Rebuild the operand to an Objective-C \@synchronized statement. 2020 /// 2021 /// By default, performs semantic analysis to build the new statement. 2022 /// Subclasses may override this routine to provide different behavior. 2023 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2024 Expr *object) { 2025 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2026 } 2027 2028 /// Build a new Objective-C \@synchronized statement. 2029 /// 2030 /// By default, performs semantic analysis to build the new statement. 2031 /// Subclasses may override this routine to provide different behavior. 2032 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2033 Expr *Object, Stmt *Body) { 2034 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2035 } 2036 2037 /// Build a new Objective-C \@autoreleasepool statement. 2038 /// 2039 /// By default, performs semantic analysis to build the new statement. 2040 /// Subclasses may override this routine to provide different behavior. 2041 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2042 Stmt *Body) { 2043 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2044 } 2045 2046 /// Build a new Objective-C fast enumeration statement. 2047 /// 2048 /// By default, performs semantic analysis to build the new statement. 2049 /// Subclasses may override this routine to provide different behavior. 2050 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2051 Stmt *Element, 2052 Expr *Collection, 2053 SourceLocation RParenLoc, 2054 Stmt *Body) { 2055 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2056 Element, 2057 Collection, 2058 RParenLoc); 2059 if (ForEachStmt.isInvalid()) 2060 return StmtError(); 2061 2062 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2063 } 2064 2065 /// Build a new C++ exception declaration. 2066 /// 2067 /// By default, performs semantic analysis to build the new decaration. 2068 /// Subclasses may override this routine to provide different behavior. 2069 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2070 TypeSourceInfo *Declarator, 2071 SourceLocation StartLoc, 2072 SourceLocation IdLoc, 2073 IdentifierInfo *Id) { 2074 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2075 StartLoc, IdLoc, Id); 2076 if (Var) 2077 getSema().CurContext->addDecl(Var); 2078 return Var; 2079 } 2080 2081 /// Build a new C++ catch statement. 2082 /// 2083 /// By default, performs semantic analysis to build the new statement. 2084 /// Subclasses may override this routine to provide different behavior. 2085 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2086 VarDecl *ExceptionDecl, 2087 Stmt *Handler) { 2088 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2089 Handler)); 2090 } 2091 2092 /// Build a new C++ try statement. 2093 /// 2094 /// By default, performs semantic analysis to build the new statement. 2095 /// Subclasses may override this routine to provide different behavior. 2096 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2097 ArrayRef<Stmt *> Handlers) { 2098 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2099 } 2100 2101 /// Build a new C++0x range-based for statement. 2102 /// 2103 /// By default, performs semantic analysis to build the new statement. 2104 /// Subclasses may override this routine to provide different behavior. 2105 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2106 SourceLocation CoawaitLoc, Stmt *Init, 2107 SourceLocation ColonLoc, Stmt *Range, 2108 Stmt *Begin, Stmt *End, Expr *Cond, 2109 Expr *Inc, Stmt *LoopVar, 2110 SourceLocation RParenLoc) { 2111 // If we've just learned that the range is actually an Objective-C 2112 // collection, treat this as an Objective-C fast enumeration loop. 2113 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2114 if (RangeStmt->isSingleDecl()) { 2115 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2116 if (RangeVar->isInvalidDecl()) 2117 return StmtError(); 2118 2119 Expr *RangeExpr = RangeVar->getInit(); 2120 if (!RangeExpr->isTypeDependent() && 2121 RangeExpr->getType()->isObjCObjectPointerType()) { 2122 // FIXME: Support init-statements in Objective-C++20 ranged for 2123 // statement. 2124 if (Init) { 2125 return SemaRef.Diag(Init->getBeginLoc(), 2126 diag::err_objc_for_range_init_stmt) 2127 << Init->getSourceRange(); 2128 } 2129 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2130 RangeExpr, RParenLoc); 2131 } 2132 } 2133 } 2134 } 2135 2136 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2137 Range, Begin, End, Cond, Inc, LoopVar, 2138 RParenLoc, Sema::BFRK_Rebuild); 2139 } 2140 2141 /// Build a new C++0x range-based for statement. 2142 /// 2143 /// By default, performs semantic analysis to build the new statement. 2144 /// Subclasses may override this routine to provide different behavior. 2145 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2146 bool IsIfExists, 2147 NestedNameSpecifierLoc QualifierLoc, 2148 DeclarationNameInfo NameInfo, 2149 Stmt *Nested) { 2150 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2151 QualifierLoc, NameInfo, Nested); 2152 } 2153 2154 /// Attach body to a C++0x range-based for statement. 2155 /// 2156 /// By default, performs semantic analysis to finish the new statement. 2157 /// Subclasses may override this routine to provide different behavior. 2158 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2159 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2160 } 2161 2162 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2163 Stmt *TryBlock, Stmt *Handler) { 2164 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2165 } 2166 2167 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2168 Stmt *Block) { 2169 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2170 } 2171 2172 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2173 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2174 } 2175 2176 /// Build a new predefined expression. 2177 /// 2178 /// By default, performs semantic analysis to build the new expression. 2179 /// Subclasses may override this routine to provide different behavior. 2180 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2181 PredefinedExpr::IdentKind IK) { 2182 return getSema().BuildPredefinedExpr(Loc, IK); 2183 } 2184 2185 /// Build a new expression that references a declaration. 2186 /// 2187 /// By default, performs semantic analysis to build the new expression. 2188 /// Subclasses may override this routine to provide different behavior. 2189 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2190 LookupResult &R, 2191 bool RequiresADL) { 2192 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2193 } 2194 2195 2196 /// Build a new expression that references a declaration. 2197 /// 2198 /// By default, performs semantic analysis to build the new expression. 2199 /// Subclasses may override this routine to provide different behavior. 2200 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2201 ValueDecl *VD, 2202 const DeclarationNameInfo &NameInfo, 2203 NamedDecl *Found, 2204 TemplateArgumentListInfo *TemplateArgs) { 2205 CXXScopeSpec SS; 2206 SS.Adopt(QualifierLoc); 2207 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2208 TemplateArgs); 2209 } 2210 2211 /// Build a new expression in parentheses. 2212 /// 2213 /// By default, performs semantic analysis to build the new expression. 2214 /// Subclasses may override this routine to provide different behavior. 2215 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2216 SourceLocation RParen) { 2217 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2218 } 2219 2220 /// Build a new pseudo-destructor expression. 2221 /// 2222 /// By default, performs semantic analysis to build the new expression. 2223 /// Subclasses may override this routine to provide different behavior. 2224 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2225 SourceLocation OperatorLoc, 2226 bool isArrow, 2227 CXXScopeSpec &SS, 2228 TypeSourceInfo *ScopeType, 2229 SourceLocation CCLoc, 2230 SourceLocation TildeLoc, 2231 PseudoDestructorTypeStorage Destroyed); 2232 2233 /// Build a new unary operator expression. 2234 /// 2235 /// By default, performs semantic analysis to build the new expression. 2236 /// Subclasses may override this routine to provide different behavior. 2237 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2238 UnaryOperatorKind Opc, 2239 Expr *SubExpr) { 2240 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2241 } 2242 2243 /// Build a new builtin offsetof expression. 2244 /// 2245 /// By default, performs semantic analysis to build the new expression. 2246 /// Subclasses may override this routine to provide different behavior. 2247 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2248 TypeSourceInfo *Type, 2249 ArrayRef<Sema::OffsetOfComponent> Components, 2250 SourceLocation RParenLoc) { 2251 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2252 RParenLoc); 2253 } 2254 2255 /// Build a new sizeof, alignof or vec_step expression with a 2256 /// type argument. 2257 /// 2258 /// By default, performs semantic analysis to build the new expression. 2259 /// Subclasses may override this routine to provide different behavior. 2260 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2261 SourceLocation OpLoc, 2262 UnaryExprOrTypeTrait ExprKind, 2263 SourceRange R) { 2264 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2265 } 2266 2267 /// Build a new sizeof, alignof or vec step expression with an 2268 /// expression argument. 2269 /// 2270 /// By default, performs semantic analysis to build the new expression. 2271 /// Subclasses may override this routine to provide different behavior. 2272 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2273 UnaryExprOrTypeTrait ExprKind, 2274 SourceRange R) { 2275 ExprResult Result 2276 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2277 if (Result.isInvalid()) 2278 return ExprError(); 2279 2280 return Result; 2281 } 2282 2283 /// Build a new array subscript expression. 2284 /// 2285 /// By default, performs semantic analysis to build the new expression. 2286 /// Subclasses may override this routine to provide different behavior. 2287 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2288 SourceLocation LBracketLoc, 2289 Expr *RHS, 2290 SourceLocation RBracketLoc) { 2291 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2292 LBracketLoc, RHS, 2293 RBracketLoc); 2294 } 2295 2296 /// Build a new array section expression. 2297 /// 2298 /// By default, performs semantic analysis to build the new expression. 2299 /// Subclasses may override this routine to provide different behavior. 2300 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2301 Expr *LowerBound, 2302 SourceLocation ColonLoc, Expr *Length, 2303 SourceLocation RBracketLoc) { 2304 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2305 ColonLoc, Length, RBracketLoc); 2306 } 2307 2308 /// Build a new call expression. 2309 /// 2310 /// By default, performs semantic analysis to build the new expression. 2311 /// Subclasses may override this routine to provide different behavior. 2312 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2313 MultiExprArg Args, 2314 SourceLocation RParenLoc, 2315 Expr *ExecConfig = nullptr) { 2316 return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args, 2317 RParenLoc, ExecConfig); 2318 } 2319 2320 /// Build a new member access expression. 2321 /// 2322 /// By default, performs semantic analysis to build the new expression. 2323 /// Subclasses may override this routine to provide different behavior. 2324 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2325 bool isArrow, 2326 NestedNameSpecifierLoc QualifierLoc, 2327 SourceLocation TemplateKWLoc, 2328 const DeclarationNameInfo &MemberNameInfo, 2329 ValueDecl *Member, 2330 NamedDecl *FoundDecl, 2331 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2332 NamedDecl *FirstQualifierInScope) { 2333 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2334 isArrow); 2335 if (!Member->getDeclName()) { 2336 // We have a reference to an unnamed field. This is always the 2337 // base of an anonymous struct/union member access, i.e. the 2338 // field is always of record type. 2339 assert(Member->getType()->isRecordType() && 2340 "unnamed member not of record type?"); 2341 2342 BaseResult = 2343 getSema().PerformObjectMemberConversion(BaseResult.get(), 2344 QualifierLoc.getNestedNameSpecifier(), 2345 FoundDecl, Member); 2346 if (BaseResult.isInvalid()) 2347 return ExprError(); 2348 Base = BaseResult.get(); 2349 2350 CXXScopeSpec EmptySS; 2351 return getSema().BuildFieldReferenceExpr( 2352 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2353 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2354 } 2355 2356 CXXScopeSpec SS; 2357 SS.Adopt(QualifierLoc); 2358 2359 Base = BaseResult.get(); 2360 QualType BaseType = Base->getType(); 2361 2362 if (isArrow && !BaseType->isPointerType()) 2363 return ExprError(); 2364 2365 // FIXME: this involves duplicating earlier analysis in a lot of 2366 // cases; we should avoid this when possible. 2367 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2368 R.addDecl(FoundDecl); 2369 R.resolveKind(); 2370 2371 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2372 SS, TemplateKWLoc, 2373 FirstQualifierInScope, 2374 R, ExplicitTemplateArgs, 2375 /*S*/nullptr); 2376 } 2377 2378 /// Build a new binary operator expression. 2379 /// 2380 /// By default, performs semantic analysis to build the new expression. 2381 /// Subclasses may override this routine to provide different behavior. 2382 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2383 BinaryOperatorKind Opc, 2384 Expr *LHS, Expr *RHS) { 2385 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2386 } 2387 2388 /// Build a new rewritten operator expression. 2389 /// 2390 /// By default, performs semantic analysis to build the new expression. 2391 /// Subclasses may override this routine to provide different behavior. 2392 ExprResult RebuildCXXRewrittenBinaryOperator( 2393 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2394 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2395 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2396 RHS, /*RequiresADL*/false); 2397 } 2398 2399 /// Build a new conditional operator expression. 2400 /// 2401 /// By default, performs semantic analysis to build the new expression. 2402 /// Subclasses may override this routine to provide different behavior. 2403 ExprResult RebuildConditionalOperator(Expr *Cond, 2404 SourceLocation QuestionLoc, 2405 Expr *LHS, 2406 SourceLocation ColonLoc, 2407 Expr *RHS) { 2408 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2409 LHS, RHS); 2410 } 2411 2412 /// Build a new C-style cast expression. 2413 /// 2414 /// By default, performs semantic analysis to build the new expression. 2415 /// Subclasses may override this routine to provide different behavior. 2416 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2417 TypeSourceInfo *TInfo, 2418 SourceLocation RParenLoc, 2419 Expr *SubExpr) { 2420 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2421 SubExpr); 2422 } 2423 2424 /// Build a new compound literal expression. 2425 /// 2426 /// By default, performs semantic analysis to build the new expression. 2427 /// Subclasses may override this routine to provide different behavior. 2428 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2429 TypeSourceInfo *TInfo, 2430 SourceLocation RParenLoc, 2431 Expr *Init) { 2432 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2433 Init); 2434 } 2435 2436 /// Build a new extended vector element access expression. 2437 /// 2438 /// By default, performs semantic analysis to build the new expression. 2439 /// Subclasses may override this routine to provide different behavior. 2440 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2441 SourceLocation OpLoc, 2442 SourceLocation AccessorLoc, 2443 IdentifierInfo &Accessor) { 2444 2445 CXXScopeSpec SS; 2446 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2447 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2448 OpLoc, /*IsArrow*/ false, 2449 SS, SourceLocation(), 2450 /*FirstQualifierInScope*/ nullptr, 2451 NameInfo, 2452 /* TemplateArgs */ nullptr, 2453 /*S*/ nullptr); 2454 } 2455 2456 /// Build a new initializer list expression. 2457 /// 2458 /// By default, performs semantic analysis to build the new expression. 2459 /// Subclasses may override this routine to provide different behavior. 2460 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2461 MultiExprArg Inits, 2462 SourceLocation RBraceLoc) { 2463 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2464 } 2465 2466 /// Build a new designated initializer expression. 2467 /// 2468 /// By default, performs semantic analysis to build the new expression. 2469 /// Subclasses may override this routine to provide different behavior. 2470 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2471 MultiExprArg ArrayExprs, 2472 SourceLocation EqualOrColonLoc, 2473 bool GNUSyntax, 2474 Expr *Init) { 2475 ExprResult Result 2476 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2477 Init); 2478 if (Result.isInvalid()) 2479 return ExprError(); 2480 2481 return Result; 2482 } 2483 2484 /// Build a new value-initialized expression. 2485 /// 2486 /// By default, builds the implicit value initialization without performing 2487 /// any semantic analysis. Subclasses may override this routine to provide 2488 /// different behavior. 2489 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2490 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2491 } 2492 2493 /// Build a new \c va_arg expression. 2494 /// 2495 /// By default, performs semantic analysis to build the new expression. 2496 /// Subclasses may override this routine to provide different behavior. 2497 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2498 Expr *SubExpr, TypeSourceInfo *TInfo, 2499 SourceLocation RParenLoc) { 2500 return getSema().BuildVAArgExpr(BuiltinLoc, 2501 SubExpr, TInfo, 2502 RParenLoc); 2503 } 2504 2505 /// Build a new expression list in parentheses. 2506 /// 2507 /// By default, performs semantic analysis to build the new expression. 2508 /// Subclasses may override this routine to provide different behavior. 2509 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2510 MultiExprArg SubExprs, 2511 SourceLocation RParenLoc) { 2512 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2513 } 2514 2515 /// Build a new address-of-label expression. 2516 /// 2517 /// By default, performs semantic analysis, using the name of the label 2518 /// rather than attempting to map the label statement itself. 2519 /// Subclasses may override this routine to provide different behavior. 2520 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2521 SourceLocation LabelLoc, LabelDecl *Label) { 2522 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2523 } 2524 2525 /// Build a new GNU statement expression. 2526 /// 2527 /// By default, performs semantic analysis to build the new expression. 2528 /// Subclasses may override this routine to provide different behavior. 2529 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2530 SourceLocation RParenLoc) { 2531 return getSema().ActOnStmtExpr(nullptr, LParenLoc, SubStmt, RParenLoc); 2532 } 2533 2534 /// Build a new __builtin_choose_expr expression. 2535 /// 2536 /// By default, performs semantic analysis to build the new expression. 2537 /// Subclasses may override this routine to provide different behavior. 2538 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2539 Expr *Cond, Expr *LHS, Expr *RHS, 2540 SourceLocation RParenLoc) { 2541 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2542 Cond, LHS, RHS, 2543 RParenLoc); 2544 } 2545 2546 /// Build a new generic selection expression. 2547 /// 2548 /// By default, performs semantic analysis to build the new expression. 2549 /// Subclasses may override this routine to provide different behavior. 2550 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2551 SourceLocation DefaultLoc, 2552 SourceLocation RParenLoc, 2553 Expr *ControllingExpr, 2554 ArrayRef<TypeSourceInfo *> Types, 2555 ArrayRef<Expr *> Exprs) { 2556 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2557 ControllingExpr, Types, Exprs); 2558 } 2559 2560 /// Build a new overloaded operator call expression. 2561 /// 2562 /// By default, performs semantic analysis to build the new expression. 2563 /// The semantic analysis provides the behavior of template instantiation, 2564 /// copying with transformations that turn what looks like an overloaded 2565 /// operator call into a use of a builtin operator, performing 2566 /// argument-dependent lookup, etc. Subclasses may override this routine to 2567 /// provide different behavior. 2568 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2569 SourceLocation OpLoc, 2570 Expr *Callee, 2571 Expr *First, 2572 Expr *Second); 2573 2574 /// Build a new C++ "named" cast expression, such as static_cast or 2575 /// reinterpret_cast. 2576 /// 2577 /// By default, this routine dispatches to one of the more-specific routines 2578 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2579 /// Subclasses may override this routine to provide different behavior. 2580 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2581 Stmt::StmtClass Class, 2582 SourceLocation LAngleLoc, 2583 TypeSourceInfo *TInfo, 2584 SourceLocation RAngleLoc, 2585 SourceLocation LParenLoc, 2586 Expr *SubExpr, 2587 SourceLocation RParenLoc) { 2588 switch (Class) { 2589 case Stmt::CXXStaticCastExprClass: 2590 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2591 RAngleLoc, LParenLoc, 2592 SubExpr, RParenLoc); 2593 2594 case Stmt::CXXDynamicCastExprClass: 2595 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2596 RAngleLoc, LParenLoc, 2597 SubExpr, RParenLoc); 2598 2599 case Stmt::CXXReinterpretCastExprClass: 2600 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2601 RAngleLoc, LParenLoc, 2602 SubExpr, 2603 RParenLoc); 2604 2605 case Stmt::CXXConstCastExprClass: 2606 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2607 RAngleLoc, LParenLoc, 2608 SubExpr, RParenLoc); 2609 2610 default: 2611 llvm_unreachable("Invalid C++ named cast"); 2612 } 2613 } 2614 2615 /// Build a new C++ static_cast expression. 2616 /// 2617 /// By default, performs semantic analysis to build the new expression. 2618 /// Subclasses may override this routine to provide different behavior. 2619 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2620 SourceLocation LAngleLoc, 2621 TypeSourceInfo *TInfo, 2622 SourceLocation RAngleLoc, 2623 SourceLocation LParenLoc, 2624 Expr *SubExpr, 2625 SourceLocation RParenLoc) { 2626 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2627 TInfo, SubExpr, 2628 SourceRange(LAngleLoc, RAngleLoc), 2629 SourceRange(LParenLoc, RParenLoc)); 2630 } 2631 2632 /// Build a new C++ dynamic_cast expression. 2633 /// 2634 /// By default, performs semantic analysis to build the new expression. 2635 /// Subclasses may override this routine to provide different behavior. 2636 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2637 SourceLocation LAngleLoc, 2638 TypeSourceInfo *TInfo, 2639 SourceLocation RAngleLoc, 2640 SourceLocation LParenLoc, 2641 Expr *SubExpr, 2642 SourceLocation RParenLoc) { 2643 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2644 TInfo, SubExpr, 2645 SourceRange(LAngleLoc, RAngleLoc), 2646 SourceRange(LParenLoc, RParenLoc)); 2647 } 2648 2649 /// Build a new C++ reinterpret_cast 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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2654 SourceLocation LAngleLoc, 2655 TypeSourceInfo *TInfo, 2656 SourceLocation RAngleLoc, 2657 SourceLocation LParenLoc, 2658 Expr *SubExpr, 2659 SourceLocation RParenLoc) { 2660 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2661 TInfo, SubExpr, 2662 SourceRange(LAngleLoc, RAngleLoc), 2663 SourceRange(LParenLoc, RParenLoc)); 2664 } 2665 2666 /// Build a new C++ const_cast expression. 2667 /// 2668 /// By default, performs semantic analysis to build the new expression. 2669 /// Subclasses may override this routine to provide different behavior. 2670 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2671 SourceLocation LAngleLoc, 2672 TypeSourceInfo *TInfo, 2673 SourceLocation RAngleLoc, 2674 SourceLocation LParenLoc, 2675 Expr *SubExpr, 2676 SourceLocation RParenLoc) { 2677 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2678 TInfo, SubExpr, 2679 SourceRange(LAngleLoc, RAngleLoc), 2680 SourceRange(LParenLoc, RParenLoc)); 2681 } 2682 2683 /// Build a new C++ functional-style cast expression. 2684 /// 2685 /// By default, performs semantic analysis to build the new expression. 2686 /// Subclasses may override this routine to provide different behavior. 2687 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2688 SourceLocation LParenLoc, 2689 Expr *Sub, 2690 SourceLocation RParenLoc, 2691 bool ListInitialization) { 2692 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2693 MultiExprArg(&Sub, 1), RParenLoc, 2694 ListInitialization); 2695 } 2696 2697 /// Build a new C++ __builtin_bit_cast expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2702 TypeSourceInfo *TSI, Expr *Sub, 2703 SourceLocation RParenLoc) { 2704 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2705 } 2706 2707 /// Build a new C++ typeid(type) expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2712 SourceLocation TypeidLoc, 2713 TypeSourceInfo *Operand, 2714 SourceLocation RParenLoc) { 2715 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2716 RParenLoc); 2717 } 2718 2719 2720 /// Build a new C++ typeid(expr) expression. 2721 /// 2722 /// By default, performs semantic analysis to build the new expression. 2723 /// Subclasses may override this routine to provide different behavior. 2724 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2725 SourceLocation TypeidLoc, 2726 Expr *Operand, 2727 SourceLocation RParenLoc) { 2728 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2729 RParenLoc); 2730 } 2731 2732 /// Build a new C++ __uuidof(type) expression. 2733 /// 2734 /// By default, performs semantic analysis to build the new expression. 2735 /// Subclasses may override this routine to provide different behavior. 2736 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2737 SourceLocation TypeidLoc, 2738 TypeSourceInfo *Operand, 2739 SourceLocation RParenLoc) { 2740 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2741 RParenLoc); 2742 } 2743 2744 /// Build a new C++ __uuidof(expr) expression. 2745 /// 2746 /// By default, performs semantic analysis to build the new expression. 2747 /// Subclasses may override this routine to provide different behavior. 2748 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2749 SourceLocation TypeidLoc, 2750 Expr *Operand, 2751 SourceLocation RParenLoc) { 2752 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2753 RParenLoc); 2754 } 2755 2756 /// Build a new C++ "this" expression. 2757 /// 2758 /// By default, builds a new "this" expression without performing any 2759 /// semantic analysis. Subclasses may override this routine to provide 2760 /// different behavior. 2761 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2762 QualType ThisType, 2763 bool isImplicit) { 2764 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2765 } 2766 2767 /// Build a new C++ throw expression. 2768 /// 2769 /// By default, performs semantic analysis to build the new expression. 2770 /// Subclasses may override this routine to provide different behavior. 2771 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2772 bool IsThrownVariableInScope) { 2773 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2774 } 2775 2776 /// Build a new C++ default-argument expression. 2777 /// 2778 /// By default, builds a new default-argument expression, which does not 2779 /// require any semantic analysis. Subclasses may override this routine to 2780 /// provide different behavior. 2781 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2782 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2783 getSema().CurContext); 2784 } 2785 2786 /// Build a new C++11 default-initialization expression. 2787 /// 2788 /// By default, builds a new default field initialization expression, which 2789 /// does not require any semantic analysis. Subclasses may override this 2790 /// routine to provide different behavior. 2791 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2792 FieldDecl *Field) { 2793 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2794 getSema().CurContext); 2795 } 2796 2797 /// Build a new C++ zero-initialization expression. 2798 /// 2799 /// By default, performs semantic analysis to build the new expression. 2800 /// Subclasses may override this routine to provide different behavior. 2801 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2802 SourceLocation LParenLoc, 2803 SourceLocation RParenLoc) { 2804 return getSema().BuildCXXTypeConstructExpr( 2805 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2806 } 2807 2808 /// Build a new C++ "new" expression. 2809 /// 2810 /// By default, performs semantic analysis to build the new expression. 2811 /// Subclasses may override this routine to provide different behavior. 2812 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2813 bool UseGlobal, 2814 SourceLocation PlacementLParen, 2815 MultiExprArg PlacementArgs, 2816 SourceLocation PlacementRParen, 2817 SourceRange TypeIdParens, 2818 QualType AllocatedType, 2819 TypeSourceInfo *AllocatedTypeInfo, 2820 Optional<Expr *> ArraySize, 2821 SourceRange DirectInitRange, 2822 Expr *Initializer) { 2823 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2824 PlacementLParen, 2825 PlacementArgs, 2826 PlacementRParen, 2827 TypeIdParens, 2828 AllocatedType, 2829 AllocatedTypeInfo, 2830 ArraySize, 2831 DirectInitRange, 2832 Initializer); 2833 } 2834 2835 /// Build a new C++ "delete" expression. 2836 /// 2837 /// By default, performs semantic analysis to build the new expression. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2840 bool IsGlobalDelete, 2841 bool IsArrayForm, 2842 Expr *Operand) { 2843 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2844 Operand); 2845 } 2846 2847 /// Build a new type trait expression. 2848 /// 2849 /// By default, performs semantic analysis to build the new expression. 2850 /// Subclasses may override this routine to provide different behavior. 2851 ExprResult RebuildTypeTrait(TypeTrait Trait, 2852 SourceLocation StartLoc, 2853 ArrayRef<TypeSourceInfo *> Args, 2854 SourceLocation RParenLoc) { 2855 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2856 } 2857 2858 /// Build a new array type trait expression. 2859 /// 2860 /// By default, performs semantic analysis to build the new expression. 2861 /// Subclasses may override this routine to provide different behavior. 2862 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2863 SourceLocation StartLoc, 2864 TypeSourceInfo *TSInfo, 2865 Expr *DimExpr, 2866 SourceLocation RParenLoc) { 2867 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2868 } 2869 2870 /// Build a new expression trait expression. 2871 /// 2872 /// By default, performs semantic analysis to build the new expression. 2873 /// Subclasses may override this routine to provide different behavior. 2874 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2875 SourceLocation StartLoc, 2876 Expr *Queried, 2877 SourceLocation RParenLoc) { 2878 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2879 } 2880 2881 /// Build a new (previously unresolved) declaration reference 2882 /// expression. 2883 /// 2884 /// By default, performs semantic analysis to build the new expression. 2885 /// Subclasses may override this routine to provide different behavior. 2886 ExprResult RebuildDependentScopeDeclRefExpr( 2887 NestedNameSpecifierLoc QualifierLoc, 2888 SourceLocation TemplateKWLoc, 2889 const DeclarationNameInfo &NameInfo, 2890 const TemplateArgumentListInfo *TemplateArgs, 2891 bool IsAddressOfOperand, 2892 TypeSourceInfo **RecoveryTSI) { 2893 CXXScopeSpec SS; 2894 SS.Adopt(QualifierLoc); 2895 2896 if (TemplateArgs || TemplateKWLoc.isValid()) 2897 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2898 TemplateArgs); 2899 2900 return getSema().BuildQualifiedDeclarationNameExpr( 2901 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2902 } 2903 2904 /// Build a new template-id expression. 2905 /// 2906 /// By default, performs semantic analysis to build the new expression. 2907 /// Subclasses may override this routine to provide different behavior. 2908 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2909 SourceLocation TemplateKWLoc, 2910 LookupResult &R, 2911 bool RequiresADL, 2912 const TemplateArgumentListInfo *TemplateArgs) { 2913 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2914 TemplateArgs); 2915 } 2916 2917 /// Build a new object-construction expression. 2918 /// 2919 /// By default, performs semantic analysis to build the new expression. 2920 /// Subclasses may override this routine to provide different behavior. 2921 ExprResult RebuildCXXConstructExpr(QualType T, 2922 SourceLocation Loc, 2923 CXXConstructorDecl *Constructor, 2924 bool IsElidable, 2925 MultiExprArg Args, 2926 bool HadMultipleCandidates, 2927 bool ListInitialization, 2928 bool StdInitListInitialization, 2929 bool RequiresZeroInit, 2930 CXXConstructExpr::ConstructionKind ConstructKind, 2931 SourceRange ParenRange) { 2932 SmallVector<Expr*, 8> ConvertedArgs; 2933 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2934 ConvertedArgs)) 2935 return ExprError(); 2936 2937 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2938 IsElidable, 2939 ConvertedArgs, 2940 HadMultipleCandidates, 2941 ListInitialization, 2942 StdInitListInitialization, 2943 RequiresZeroInit, ConstructKind, 2944 ParenRange); 2945 } 2946 2947 /// Build a new implicit construction via inherited constructor 2948 /// expression. 2949 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2950 CXXConstructorDecl *Constructor, 2951 bool ConstructsVBase, 2952 bool InheritedFromVBase) { 2953 return new (getSema().Context) CXXInheritedCtorInitExpr( 2954 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2955 } 2956 2957 /// Build a new object-construction expression. 2958 /// 2959 /// By default, performs semantic analysis to build the new expression. 2960 /// Subclasses may override this routine to provide different behavior. 2961 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2962 SourceLocation LParenOrBraceLoc, 2963 MultiExprArg Args, 2964 SourceLocation RParenOrBraceLoc, 2965 bool ListInitialization) { 2966 return getSema().BuildCXXTypeConstructExpr( 2967 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 2968 } 2969 2970 /// Build a new object-construction expression. 2971 /// 2972 /// By default, performs semantic analysis to build the new expression. 2973 /// Subclasses may override this routine to provide different behavior. 2974 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2975 SourceLocation LParenLoc, 2976 MultiExprArg Args, 2977 SourceLocation RParenLoc, 2978 bool ListInitialization) { 2979 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 2980 RParenLoc, ListInitialization); 2981 } 2982 2983 /// Build a new member reference expression. 2984 /// 2985 /// By default, performs semantic analysis to build the new expression. 2986 /// Subclasses may override this routine to provide different behavior. 2987 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2988 QualType BaseType, 2989 bool IsArrow, 2990 SourceLocation OperatorLoc, 2991 NestedNameSpecifierLoc QualifierLoc, 2992 SourceLocation TemplateKWLoc, 2993 NamedDecl *FirstQualifierInScope, 2994 const DeclarationNameInfo &MemberNameInfo, 2995 const TemplateArgumentListInfo *TemplateArgs) { 2996 CXXScopeSpec SS; 2997 SS.Adopt(QualifierLoc); 2998 2999 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3000 OperatorLoc, IsArrow, 3001 SS, TemplateKWLoc, 3002 FirstQualifierInScope, 3003 MemberNameInfo, 3004 TemplateArgs, /*S*/nullptr); 3005 } 3006 3007 /// Build a new member reference expression. 3008 /// 3009 /// By default, performs semantic analysis to build the new expression. 3010 /// Subclasses may override this routine to provide different behavior. 3011 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3012 SourceLocation OperatorLoc, 3013 bool IsArrow, 3014 NestedNameSpecifierLoc QualifierLoc, 3015 SourceLocation TemplateKWLoc, 3016 NamedDecl *FirstQualifierInScope, 3017 LookupResult &R, 3018 const TemplateArgumentListInfo *TemplateArgs) { 3019 CXXScopeSpec SS; 3020 SS.Adopt(QualifierLoc); 3021 3022 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3023 OperatorLoc, IsArrow, 3024 SS, TemplateKWLoc, 3025 FirstQualifierInScope, 3026 R, TemplateArgs, /*S*/nullptr); 3027 } 3028 3029 /// Build a new noexcept 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 RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3034 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3035 } 3036 3037 /// Build a new expression to compute the length of a parameter pack. 3038 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3039 NamedDecl *Pack, 3040 SourceLocation PackLoc, 3041 SourceLocation RParenLoc, 3042 Optional<unsigned> Length, 3043 ArrayRef<TemplateArgument> PartialArgs) { 3044 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3045 RParenLoc, Length, PartialArgs); 3046 } 3047 3048 /// Build a new expression representing a call to a source location 3049 /// builtin. 3050 /// 3051 /// By default, performs semantic analysis to build the new expression. 3052 /// Subclasses may override this routine to provide different behavior. 3053 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3054 SourceLocation BuiltinLoc, 3055 SourceLocation RPLoc, 3056 DeclContext *ParentContext) { 3057 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3058 } 3059 3060 /// Build a new Objective-C boxed expression. 3061 /// 3062 /// By default, performs semantic analysis to build the new expression. 3063 /// Subclasses may override this routine to provide different behavior. 3064 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3065 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3066 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3067 TemplateArgumentListInfo *TALI) { 3068 CXXScopeSpec SS; 3069 SS.Adopt(NNS); 3070 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3071 ConceptNameInfo, 3072 FoundDecl, 3073 NamedConcept, TALI); 3074 if (Result.isInvalid()) 3075 return ExprError(); 3076 return Result; 3077 } 3078 3079 /// \brief Build a new requires expression. 3080 /// 3081 /// By default, performs semantic analysis to build the new expression. 3082 /// Subclasses may override this routine to provide different behavior. 3083 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3084 RequiresExprBodyDecl *Body, 3085 ArrayRef<ParmVarDecl *> LocalParameters, 3086 ArrayRef<concepts::Requirement *> Requirements, 3087 SourceLocation ClosingBraceLoc) { 3088 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3089 LocalParameters, Requirements, ClosingBraceLoc); 3090 } 3091 3092 concepts::TypeRequirement * 3093 RebuildTypeRequirement( 3094 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3095 return SemaRef.BuildTypeRequirement(SubstDiag); 3096 } 3097 3098 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3099 return SemaRef.BuildTypeRequirement(T); 3100 } 3101 3102 concepts::ExprRequirement * 3103 RebuildExprRequirement( 3104 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3105 SourceLocation NoexceptLoc, 3106 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3107 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3108 std::move(Ret)); 3109 } 3110 3111 concepts::ExprRequirement * 3112 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3113 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3114 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3115 std::move(Ret)); 3116 } 3117 3118 concepts::NestedRequirement * 3119 RebuildNestedRequirement( 3120 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3121 return SemaRef.BuildNestedRequirement(SubstDiag); 3122 } 3123 3124 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3125 return SemaRef.BuildNestedRequirement(Constraint); 3126 } 3127 3128 /// \brief Build a new Objective-C boxed expression. 3129 /// 3130 /// By default, performs semantic analysis to build the new expression. 3131 /// Subclasses may override this routine to provide different behavior. 3132 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3133 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3134 } 3135 3136 /// Build a new Objective-C array literal. 3137 /// 3138 /// By default, performs semantic analysis to build the new expression. 3139 /// Subclasses may override this routine to provide different behavior. 3140 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3141 Expr **Elements, unsigned NumElements) { 3142 return getSema().BuildObjCArrayLiteral(Range, 3143 MultiExprArg(Elements, NumElements)); 3144 } 3145 3146 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3147 Expr *Base, Expr *Key, 3148 ObjCMethodDecl *getterMethod, 3149 ObjCMethodDecl *setterMethod) { 3150 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3151 getterMethod, setterMethod); 3152 } 3153 3154 /// Build a new Objective-C dictionary literal. 3155 /// 3156 /// By default, performs semantic analysis to build the new expression. 3157 /// Subclasses may override this routine to provide different behavior. 3158 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3159 MutableArrayRef<ObjCDictionaryElement> Elements) { 3160 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3161 } 3162 3163 /// Build a new Objective-C \@encode expression. 3164 /// 3165 /// By default, performs semantic analysis to build the new expression. 3166 /// Subclasses may override this routine to provide different behavior. 3167 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3168 TypeSourceInfo *EncodeTypeInfo, 3169 SourceLocation RParenLoc) { 3170 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3171 } 3172 3173 /// Build a new Objective-C class message. 3174 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3175 Selector Sel, 3176 ArrayRef<SourceLocation> SelectorLocs, 3177 ObjCMethodDecl *Method, 3178 SourceLocation LBracLoc, 3179 MultiExprArg Args, 3180 SourceLocation RBracLoc) { 3181 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3182 ReceiverTypeInfo->getType(), 3183 /*SuperLoc=*/SourceLocation(), 3184 Sel, Method, LBracLoc, SelectorLocs, 3185 RBracLoc, Args); 3186 } 3187 3188 /// Build a new Objective-C instance message. 3189 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3190 Selector Sel, 3191 ArrayRef<SourceLocation> SelectorLocs, 3192 ObjCMethodDecl *Method, 3193 SourceLocation LBracLoc, 3194 MultiExprArg Args, 3195 SourceLocation RBracLoc) { 3196 return SemaRef.BuildInstanceMessage(Receiver, 3197 Receiver->getType(), 3198 /*SuperLoc=*/SourceLocation(), 3199 Sel, Method, LBracLoc, SelectorLocs, 3200 RBracLoc, Args); 3201 } 3202 3203 /// Build a new Objective-C instance/class message to 'super'. 3204 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3205 Selector Sel, 3206 ArrayRef<SourceLocation> SelectorLocs, 3207 QualType SuperType, 3208 ObjCMethodDecl *Method, 3209 SourceLocation LBracLoc, 3210 MultiExprArg Args, 3211 SourceLocation RBracLoc) { 3212 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3213 SuperType, 3214 SuperLoc, 3215 Sel, Method, LBracLoc, SelectorLocs, 3216 RBracLoc, Args) 3217 : SemaRef.BuildClassMessage(nullptr, 3218 SuperType, 3219 SuperLoc, 3220 Sel, Method, LBracLoc, SelectorLocs, 3221 RBracLoc, Args); 3222 3223 3224 } 3225 3226 /// Build a new Objective-C ivar reference expression. 3227 /// 3228 /// By default, performs semantic analysis to build the new expression. 3229 /// Subclasses may override this routine to provide different behavior. 3230 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3231 SourceLocation IvarLoc, 3232 bool IsArrow, bool IsFreeIvar) { 3233 CXXScopeSpec SS; 3234 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3235 ExprResult Result = getSema().BuildMemberReferenceExpr( 3236 BaseArg, BaseArg->getType(), 3237 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3238 /*FirstQualifierInScope=*/nullptr, NameInfo, 3239 /*TemplateArgs=*/nullptr, 3240 /*S=*/nullptr); 3241 if (IsFreeIvar && Result.isUsable()) 3242 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3243 return Result; 3244 } 3245 3246 /// Build a new Objective-C property reference expression. 3247 /// 3248 /// By default, performs semantic analysis to build the new expression. 3249 /// Subclasses may override this routine to provide different behavior. 3250 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3251 ObjCPropertyDecl *Property, 3252 SourceLocation PropertyLoc) { 3253 CXXScopeSpec SS; 3254 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3255 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3256 /*FIXME:*/PropertyLoc, 3257 /*IsArrow=*/false, 3258 SS, SourceLocation(), 3259 /*FirstQualifierInScope=*/nullptr, 3260 NameInfo, 3261 /*TemplateArgs=*/nullptr, 3262 /*S=*/nullptr); 3263 } 3264 3265 /// Build a new Objective-C property reference expression. 3266 /// 3267 /// By default, performs semantic analysis to build the new expression. 3268 /// Subclasses may override this routine to provide different behavior. 3269 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3270 ObjCMethodDecl *Getter, 3271 ObjCMethodDecl *Setter, 3272 SourceLocation PropertyLoc) { 3273 // Since these expressions can only be value-dependent, we do not 3274 // need to perform semantic analysis again. 3275 return Owned( 3276 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3277 VK_LValue, OK_ObjCProperty, 3278 PropertyLoc, Base)); 3279 } 3280 3281 /// Build a new Objective-C "isa" expression. 3282 /// 3283 /// By default, performs semantic analysis to build the new expression. 3284 /// Subclasses may override this routine to provide different behavior. 3285 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3286 SourceLocation OpLoc, bool IsArrow) { 3287 CXXScopeSpec SS; 3288 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3289 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3290 OpLoc, IsArrow, 3291 SS, SourceLocation(), 3292 /*FirstQualifierInScope=*/nullptr, 3293 NameInfo, 3294 /*TemplateArgs=*/nullptr, 3295 /*S=*/nullptr); 3296 } 3297 3298 /// Build a new shuffle vector expression. 3299 /// 3300 /// By default, performs semantic analysis to build the new expression. 3301 /// Subclasses may override this routine to provide different behavior. 3302 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3303 MultiExprArg SubExprs, 3304 SourceLocation RParenLoc) { 3305 // Find the declaration for __builtin_shufflevector 3306 const IdentifierInfo &Name 3307 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3308 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3309 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3310 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3311 3312 // Build a reference to the __builtin_shufflevector builtin 3313 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3314 Expr *Callee = new (SemaRef.Context) 3315 DeclRefExpr(SemaRef.Context, Builtin, false, 3316 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3317 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3318 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3319 CK_BuiltinFnToFnPtr).get(); 3320 3321 // Build the CallExpr 3322 ExprResult TheCall = CallExpr::Create( 3323 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3324 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3325 3326 // Type-check the __builtin_shufflevector expression. 3327 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3328 } 3329 3330 /// Build a new convert vector expression. 3331 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3332 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3333 SourceLocation RParenLoc) { 3334 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3335 BuiltinLoc, RParenLoc); 3336 } 3337 3338 /// Build a new template argument pack expansion. 3339 /// 3340 /// By default, performs semantic analysis to build a new pack expansion 3341 /// for a template argument. Subclasses may override this routine to provide 3342 /// different behavior. 3343 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3344 SourceLocation EllipsisLoc, 3345 Optional<unsigned> NumExpansions) { 3346 switch (Pattern.getArgument().getKind()) { 3347 case TemplateArgument::Expression: { 3348 ExprResult Result 3349 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3350 EllipsisLoc, NumExpansions); 3351 if (Result.isInvalid()) 3352 return TemplateArgumentLoc(); 3353 3354 return TemplateArgumentLoc(Result.get(), Result.get()); 3355 } 3356 3357 case TemplateArgument::Template: 3358 return TemplateArgumentLoc(TemplateArgument( 3359 Pattern.getArgument().getAsTemplate(), 3360 NumExpansions), 3361 Pattern.getTemplateQualifierLoc(), 3362 Pattern.getTemplateNameLoc(), 3363 EllipsisLoc); 3364 3365 case TemplateArgument::Null: 3366 case TemplateArgument::Integral: 3367 case TemplateArgument::Declaration: 3368 case TemplateArgument::Pack: 3369 case TemplateArgument::TemplateExpansion: 3370 case TemplateArgument::NullPtr: 3371 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3372 3373 case TemplateArgument::Type: 3374 if (TypeSourceInfo *Expansion 3375 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3376 EllipsisLoc, 3377 NumExpansions)) 3378 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3379 Expansion); 3380 break; 3381 } 3382 3383 return TemplateArgumentLoc(); 3384 } 3385 3386 /// Build a new expression pack expansion. 3387 /// 3388 /// By default, performs semantic analysis to build a new pack expansion 3389 /// for an expression. Subclasses may override this routine to provide 3390 /// different behavior. 3391 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3392 Optional<unsigned> NumExpansions) { 3393 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3394 } 3395 3396 /// Build a new C++1z fold-expression. 3397 /// 3398 /// By default, performs semantic analysis in order to build a new fold 3399 /// expression. 3400 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3401 BinaryOperatorKind Operator, 3402 SourceLocation EllipsisLoc, Expr *RHS, 3403 SourceLocation RParenLoc, 3404 Optional<unsigned> NumExpansions) { 3405 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3406 RHS, RParenLoc, NumExpansions); 3407 } 3408 3409 /// Build an empty C++1z fold-expression with the given operator. 3410 /// 3411 /// By default, produces the fallback value for the fold-expression, or 3412 /// produce an error if there is no fallback value. 3413 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3414 BinaryOperatorKind Operator) { 3415 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3416 } 3417 3418 /// Build a new atomic operation expression. 3419 /// 3420 /// By default, performs semantic analysis to build the new expression. 3421 /// Subclasses may override this routine to provide different behavior. 3422 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3423 AtomicExpr::AtomicOp Op, 3424 SourceLocation RParenLoc) { 3425 // Use this for all of the locations, since we don't know the difference 3426 // between the call and the expr at this point. 3427 SourceRange Range{BuiltinLoc, RParenLoc}; 3428 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3429 Sema::AtomicArgumentOrder::AST); 3430 } 3431 3432 private: 3433 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3434 QualType ObjectType, 3435 NamedDecl *FirstQualifierInScope, 3436 CXXScopeSpec &SS); 3437 3438 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3439 QualType ObjectType, 3440 NamedDecl *FirstQualifierInScope, 3441 CXXScopeSpec &SS); 3442 3443 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3444 NamedDecl *FirstQualifierInScope, 3445 CXXScopeSpec &SS); 3446 3447 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3448 DependentNameTypeLoc TL, 3449 bool DeducibleTSTContext); 3450 }; 3451 3452 template <typename Derived> 3453 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3454 if (!S) 3455 return S; 3456 3457 switch (S->getStmtClass()) { 3458 case Stmt::NoStmtClass: break; 3459 3460 // Transform individual statement nodes 3461 // Pass SDK into statements that can produce a value 3462 #define STMT(Node, Parent) \ 3463 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3464 #define VALUESTMT(Node, Parent) \ 3465 case Stmt::Node##Class: \ 3466 return getDerived().Transform##Node(cast<Node>(S), SDK); 3467 #define ABSTRACT_STMT(Node) 3468 #define EXPR(Node, Parent) 3469 #include "clang/AST/StmtNodes.inc" 3470 3471 // Transform expressions by calling TransformExpr. 3472 #define STMT(Node, Parent) 3473 #define ABSTRACT_STMT(Stmt) 3474 #define EXPR(Node, Parent) case Stmt::Node##Class: 3475 #include "clang/AST/StmtNodes.inc" 3476 { 3477 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3478 3479 if (SDK == SDK_StmtExprResult) 3480 E = getSema().ActOnStmtExprResult(E); 3481 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3482 } 3483 } 3484 3485 return S; 3486 } 3487 3488 template<typename Derived> 3489 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3490 if (!S) 3491 return S; 3492 3493 switch (S->getClauseKind()) { 3494 default: break; 3495 // Transform individual clause nodes 3496 #define OPENMP_CLAUSE(Name, Class) \ 3497 case OMPC_ ## Name : \ 3498 return getDerived().Transform ## Class(cast<Class>(S)); 3499 #include "clang/Basic/OpenMPKinds.def" 3500 } 3501 3502 return S; 3503 } 3504 3505 3506 template<typename Derived> 3507 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3508 if (!E) 3509 return E; 3510 3511 switch (E->getStmtClass()) { 3512 case Stmt::NoStmtClass: break; 3513 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3514 #define ABSTRACT_STMT(Stmt) 3515 #define EXPR(Node, Parent) \ 3516 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3517 #include "clang/AST/StmtNodes.inc" 3518 } 3519 3520 return E; 3521 } 3522 3523 template<typename Derived> 3524 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3525 bool NotCopyInit) { 3526 // Initializers are instantiated like expressions, except that various outer 3527 // layers are stripped. 3528 if (!Init) 3529 return Init; 3530 3531 if (auto *FE = dyn_cast<FullExpr>(Init)) 3532 Init = FE->getSubExpr(); 3533 3534 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3535 Init = AIL->getCommonExpr(); 3536 3537 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3538 Init = MTE->getSubExpr(); 3539 3540 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3541 Init = Binder->getSubExpr(); 3542 3543 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3544 Init = ICE->getSubExprAsWritten(); 3545 3546 if (CXXStdInitializerListExpr *ILE = 3547 dyn_cast<CXXStdInitializerListExpr>(Init)) 3548 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3549 3550 // If this is copy-initialization, we only need to reconstruct 3551 // InitListExprs. Other forms of copy-initialization will be a no-op if 3552 // the initializer is already the right type. 3553 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3554 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3555 return getDerived().TransformExpr(Init); 3556 3557 // Revert value-initialization back to empty parens. 3558 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3559 SourceRange Parens = VIE->getSourceRange(); 3560 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3561 Parens.getEnd()); 3562 } 3563 3564 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3565 if (isa<ImplicitValueInitExpr>(Init)) 3566 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3567 SourceLocation()); 3568 3569 // Revert initialization by constructor back to a parenthesized or braced list 3570 // of expressions. Any other form of initializer can just be reused directly. 3571 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3572 return getDerived().TransformExpr(Init); 3573 3574 // If the initialization implicitly converted an initializer list to a 3575 // std::initializer_list object, unwrap the std::initializer_list too. 3576 if (Construct && Construct->isStdInitListInitialization()) 3577 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3578 3579 // Enter a list-init context if this was list initialization. 3580 EnterExpressionEvaluationContext Context( 3581 getSema(), EnterExpressionEvaluationContext::InitList, 3582 Construct->isListInitialization()); 3583 3584 SmallVector<Expr*, 8> NewArgs; 3585 bool ArgChanged = false; 3586 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3587 /*IsCall*/true, NewArgs, &ArgChanged)) 3588 return ExprError(); 3589 3590 // If this was list initialization, revert to syntactic list form. 3591 if (Construct->isListInitialization()) 3592 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3593 Construct->getEndLoc()); 3594 3595 // Build a ParenListExpr to represent anything else. 3596 SourceRange Parens = Construct->getParenOrBraceRange(); 3597 if (Parens.isInvalid()) { 3598 // This was a variable declaration's initialization for which no initializer 3599 // was specified. 3600 assert(NewArgs.empty() && 3601 "no parens or braces but have direct init with arguments?"); 3602 return ExprEmpty(); 3603 } 3604 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3605 Parens.getEnd()); 3606 } 3607 3608 template<typename Derived> 3609 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3610 unsigned NumInputs, 3611 bool IsCall, 3612 SmallVectorImpl<Expr *> &Outputs, 3613 bool *ArgChanged) { 3614 for (unsigned I = 0; I != NumInputs; ++I) { 3615 // If requested, drop call arguments that need to be dropped. 3616 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3617 if (ArgChanged) 3618 *ArgChanged = true; 3619 3620 break; 3621 } 3622 3623 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3624 Expr *Pattern = Expansion->getPattern(); 3625 3626 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3627 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3628 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3629 3630 // Determine whether the set of unexpanded parameter packs can and should 3631 // be expanded. 3632 bool Expand = true; 3633 bool RetainExpansion = false; 3634 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3635 Optional<unsigned> NumExpansions = OrigNumExpansions; 3636 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3637 Pattern->getSourceRange(), 3638 Unexpanded, 3639 Expand, RetainExpansion, 3640 NumExpansions)) 3641 return true; 3642 3643 if (!Expand) { 3644 // The transform has determined that we should perform a simple 3645 // transformation on the pack expansion, producing another pack 3646 // expansion. 3647 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3648 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3649 if (OutPattern.isInvalid()) 3650 return true; 3651 3652 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3653 Expansion->getEllipsisLoc(), 3654 NumExpansions); 3655 if (Out.isInvalid()) 3656 return true; 3657 3658 if (ArgChanged) 3659 *ArgChanged = true; 3660 Outputs.push_back(Out.get()); 3661 continue; 3662 } 3663 3664 // Record right away that the argument was changed. This needs 3665 // to happen even if the array expands to nothing. 3666 if (ArgChanged) *ArgChanged = true; 3667 3668 // The transform has determined that we should perform an elementwise 3669 // expansion of the pattern. Do so. 3670 for (unsigned I = 0; I != *NumExpansions; ++I) { 3671 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3672 ExprResult Out = getDerived().TransformExpr(Pattern); 3673 if (Out.isInvalid()) 3674 return true; 3675 3676 if (Out.get()->containsUnexpandedParameterPack()) { 3677 Out = getDerived().RebuildPackExpansion( 3678 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3679 if (Out.isInvalid()) 3680 return true; 3681 } 3682 3683 Outputs.push_back(Out.get()); 3684 } 3685 3686 // If we're supposed to retain a pack expansion, do so by temporarily 3687 // forgetting the partially-substituted parameter pack. 3688 if (RetainExpansion) { 3689 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3690 3691 ExprResult Out = getDerived().TransformExpr(Pattern); 3692 if (Out.isInvalid()) 3693 return true; 3694 3695 Out = getDerived().RebuildPackExpansion( 3696 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3697 if (Out.isInvalid()) 3698 return true; 3699 3700 Outputs.push_back(Out.get()); 3701 } 3702 3703 continue; 3704 } 3705 3706 ExprResult Result = 3707 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3708 : getDerived().TransformExpr(Inputs[I]); 3709 if (Result.isInvalid()) 3710 return true; 3711 3712 if (Result.get() != Inputs[I] && ArgChanged) 3713 *ArgChanged = true; 3714 3715 Outputs.push_back(Result.get()); 3716 } 3717 3718 return false; 3719 } 3720 3721 template <typename Derived> 3722 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3723 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3724 if (Var) { 3725 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3726 getDerived().TransformDefinition(Var->getLocation(), Var)); 3727 3728 if (!ConditionVar) 3729 return Sema::ConditionError(); 3730 3731 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3732 } 3733 3734 if (Expr) { 3735 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3736 3737 if (CondExpr.isInvalid()) 3738 return Sema::ConditionError(); 3739 3740 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3741 } 3742 3743 return Sema::ConditionResult(); 3744 } 3745 3746 template<typename Derived> 3747 NestedNameSpecifierLoc 3748 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3749 NestedNameSpecifierLoc NNS, 3750 QualType ObjectType, 3751 NamedDecl *FirstQualifierInScope) { 3752 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3753 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3754 Qualifier = Qualifier.getPrefix()) 3755 Qualifiers.push_back(Qualifier); 3756 3757 CXXScopeSpec SS; 3758 while (!Qualifiers.empty()) { 3759 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3760 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3761 3762 switch (QNNS->getKind()) { 3763 case NestedNameSpecifier::Identifier: { 3764 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3765 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3766 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3767 SS, FirstQualifierInScope, false)) 3768 return NestedNameSpecifierLoc(); 3769 } 3770 break; 3771 3772 case NestedNameSpecifier::Namespace: { 3773 NamespaceDecl *NS 3774 = cast_or_null<NamespaceDecl>( 3775 getDerived().TransformDecl( 3776 Q.getLocalBeginLoc(), 3777 QNNS->getAsNamespace())); 3778 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3779 break; 3780 } 3781 3782 case NestedNameSpecifier::NamespaceAlias: { 3783 NamespaceAliasDecl *Alias 3784 = cast_or_null<NamespaceAliasDecl>( 3785 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3786 QNNS->getAsNamespaceAlias())); 3787 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3788 Q.getLocalEndLoc()); 3789 break; 3790 } 3791 3792 case NestedNameSpecifier::Global: 3793 // There is no meaningful transformation that one could perform on the 3794 // global scope. 3795 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3796 break; 3797 3798 case NestedNameSpecifier::Super: { 3799 CXXRecordDecl *RD = 3800 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3801 SourceLocation(), QNNS->getAsRecordDecl())); 3802 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3803 break; 3804 } 3805 3806 case NestedNameSpecifier::TypeSpecWithTemplate: 3807 case NestedNameSpecifier::TypeSpec: { 3808 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3809 FirstQualifierInScope, SS); 3810 3811 if (!TL) 3812 return NestedNameSpecifierLoc(); 3813 3814 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3815 (SemaRef.getLangOpts().CPlusPlus11 && 3816 TL.getType()->isEnumeralType())) { 3817 assert(!TL.getType().hasLocalQualifiers() && 3818 "Can't get cv-qualifiers here"); 3819 if (TL.getType()->isEnumeralType()) 3820 SemaRef.Diag(TL.getBeginLoc(), 3821 diag::warn_cxx98_compat_enum_nested_name_spec); 3822 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3823 Q.getLocalEndLoc()); 3824 break; 3825 } 3826 // If the nested-name-specifier is an invalid type def, don't emit an 3827 // error because a previous error should have already been emitted. 3828 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3829 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3830 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3831 << TL.getType() << SS.getRange(); 3832 } 3833 return NestedNameSpecifierLoc(); 3834 } 3835 } 3836 3837 // The qualifier-in-scope and object type only apply to the leftmost entity. 3838 FirstQualifierInScope = nullptr; 3839 ObjectType = QualType(); 3840 } 3841 3842 // Don't rebuild the nested-name-specifier if we don't have to. 3843 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3844 !getDerived().AlwaysRebuild()) 3845 return NNS; 3846 3847 // If we can re-use the source-location data from the original 3848 // nested-name-specifier, do so. 3849 if (SS.location_size() == NNS.getDataLength() && 3850 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3851 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3852 3853 // Allocate new nested-name-specifier location information. 3854 return SS.getWithLocInContext(SemaRef.Context); 3855 } 3856 3857 template<typename Derived> 3858 DeclarationNameInfo 3859 TreeTransform<Derived> 3860 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3861 DeclarationName Name = NameInfo.getName(); 3862 if (!Name) 3863 return DeclarationNameInfo(); 3864 3865 switch (Name.getNameKind()) { 3866 case DeclarationName::Identifier: 3867 case DeclarationName::ObjCZeroArgSelector: 3868 case DeclarationName::ObjCOneArgSelector: 3869 case DeclarationName::ObjCMultiArgSelector: 3870 case DeclarationName::CXXOperatorName: 3871 case DeclarationName::CXXLiteralOperatorName: 3872 case DeclarationName::CXXUsingDirective: 3873 return NameInfo; 3874 3875 case DeclarationName::CXXDeductionGuideName: { 3876 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3877 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3878 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3879 if (!NewTemplate) 3880 return DeclarationNameInfo(); 3881 3882 DeclarationNameInfo NewNameInfo(NameInfo); 3883 NewNameInfo.setName( 3884 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3885 return NewNameInfo; 3886 } 3887 3888 case DeclarationName::CXXConstructorName: 3889 case DeclarationName::CXXDestructorName: 3890 case DeclarationName::CXXConversionFunctionName: { 3891 TypeSourceInfo *NewTInfo; 3892 CanQualType NewCanTy; 3893 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3894 NewTInfo = getDerived().TransformType(OldTInfo); 3895 if (!NewTInfo) 3896 return DeclarationNameInfo(); 3897 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3898 } 3899 else { 3900 NewTInfo = nullptr; 3901 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3902 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3903 if (NewT.isNull()) 3904 return DeclarationNameInfo(); 3905 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3906 } 3907 3908 DeclarationName NewName 3909 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3910 NewCanTy); 3911 DeclarationNameInfo NewNameInfo(NameInfo); 3912 NewNameInfo.setName(NewName); 3913 NewNameInfo.setNamedTypeInfo(NewTInfo); 3914 return NewNameInfo; 3915 } 3916 } 3917 3918 llvm_unreachable("Unknown name kind."); 3919 } 3920 3921 template<typename Derived> 3922 TemplateName 3923 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3924 TemplateName Name, 3925 SourceLocation NameLoc, 3926 QualType ObjectType, 3927 NamedDecl *FirstQualifierInScope, 3928 bool AllowInjectedClassName) { 3929 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3930 TemplateDecl *Template = QTN->getTemplateDecl(); 3931 assert(Template && "qualified template name must refer to a template"); 3932 3933 TemplateDecl *TransTemplate 3934 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3935 Template)); 3936 if (!TransTemplate) 3937 return TemplateName(); 3938 3939 if (!getDerived().AlwaysRebuild() && 3940 SS.getScopeRep() == QTN->getQualifier() && 3941 TransTemplate == Template) 3942 return Name; 3943 3944 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3945 TransTemplate); 3946 } 3947 3948 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3949 if (SS.getScopeRep()) { 3950 // These apply to the scope specifier, not the template. 3951 ObjectType = QualType(); 3952 FirstQualifierInScope = nullptr; 3953 } 3954 3955 if (!getDerived().AlwaysRebuild() && 3956 SS.getScopeRep() == DTN->getQualifier() && 3957 ObjectType.isNull()) 3958 return Name; 3959 3960 // FIXME: Preserve the location of the "template" keyword. 3961 SourceLocation TemplateKWLoc = NameLoc; 3962 3963 if (DTN->isIdentifier()) { 3964 return getDerived().RebuildTemplateName(SS, 3965 TemplateKWLoc, 3966 *DTN->getIdentifier(), 3967 NameLoc, 3968 ObjectType, 3969 FirstQualifierInScope, 3970 AllowInjectedClassName); 3971 } 3972 3973 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 3974 DTN->getOperator(), NameLoc, 3975 ObjectType, AllowInjectedClassName); 3976 } 3977 3978 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3979 TemplateDecl *TransTemplate 3980 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3981 Template)); 3982 if (!TransTemplate) 3983 return TemplateName(); 3984 3985 if (!getDerived().AlwaysRebuild() && 3986 TransTemplate == Template) 3987 return Name; 3988 3989 return TemplateName(TransTemplate); 3990 } 3991 3992 if (SubstTemplateTemplateParmPackStorage *SubstPack 3993 = Name.getAsSubstTemplateTemplateParmPack()) { 3994 TemplateTemplateParmDecl *TransParam 3995 = cast_or_null<TemplateTemplateParmDecl>( 3996 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3997 if (!TransParam) 3998 return TemplateName(); 3999 4000 if (!getDerived().AlwaysRebuild() && 4001 TransParam == SubstPack->getParameterPack()) 4002 return Name; 4003 4004 return getDerived().RebuildTemplateName(TransParam, 4005 SubstPack->getArgumentPack()); 4006 } 4007 4008 // These should be getting filtered out before they reach the AST. 4009 llvm_unreachable("overloaded function decl survived to here"); 4010 } 4011 4012 template<typename Derived> 4013 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4014 const TemplateArgument &Arg, 4015 TemplateArgumentLoc &Output) { 4016 SourceLocation Loc = getDerived().getBaseLocation(); 4017 switch (Arg.getKind()) { 4018 case TemplateArgument::Null: 4019 llvm_unreachable("null template argument in TreeTransform"); 4020 break; 4021 4022 case TemplateArgument::Type: 4023 Output = TemplateArgumentLoc(Arg, 4024 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 4025 4026 break; 4027 4028 case TemplateArgument::Template: 4029 case TemplateArgument::TemplateExpansion: { 4030 NestedNameSpecifierLocBuilder Builder; 4031 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 4032 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 4033 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 4034 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 4035 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 4036 4037 if (Arg.getKind() == TemplateArgument::Template) 4038 Output = TemplateArgumentLoc(Arg, 4039 Builder.getWithLocInContext(SemaRef.Context), 4040 Loc); 4041 else 4042 Output = TemplateArgumentLoc(Arg, 4043 Builder.getWithLocInContext(SemaRef.Context), 4044 Loc, Loc); 4045 4046 break; 4047 } 4048 4049 case TemplateArgument::Expression: 4050 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 4051 break; 4052 4053 case TemplateArgument::Declaration: 4054 case TemplateArgument::Integral: 4055 case TemplateArgument::Pack: 4056 case TemplateArgument::NullPtr: 4057 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 4058 break; 4059 } 4060 } 4061 4062 template<typename Derived> 4063 bool TreeTransform<Derived>::TransformTemplateArgument( 4064 const TemplateArgumentLoc &Input, 4065 TemplateArgumentLoc &Output, bool Uneval) { 4066 const TemplateArgument &Arg = Input.getArgument(); 4067 switch (Arg.getKind()) { 4068 case TemplateArgument::Null: 4069 case TemplateArgument::Integral: 4070 case TemplateArgument::Pack: 4071 case TemplateArgument::Declaration: 4072 case TemplateArgument::NullPtr: 4073 llvm_unreachable("Unexpected TemplateArgument"); 4074 4075 case TemplateArgument::Type: { 4076 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4077 if (!DI) 4078 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4079 4080 DI = getDerived().TransformType(DI); 4081 if (!DI) return true; 4082 4083 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4084 return false; 4085 } 4086 4087 case TemplateArgument::Template: { 4088 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4089 if (QualifierLoc) { 4090 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4091 if (!QualifierLoc) 4092 return true; 4093 } 4094 4095 CXXScopeSpec SS; 4096 SS.Adopt(QualifierLoc); 4097 TemplateName Template 4098 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4099 Input.getTemplateNameLoc()); 4100 if (Template.isNull()) 4101 return true; 4102 4103 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4104 Input.getTemplateNameLoc()); 4105 return false; 4106 } 4107 4108 case TemplateArgument::TemplateExpansion: 4109 llvm_unreachable("Caller should expand pack expansions"); 4110 4111 case TemplateArgument::Expression: { 4112 // Template argument expressions are constant expressions. 4113 EnterExpressionEvaluationContext Unevaluated( 4114 getSema(), 4115 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4116 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4117 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4118 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4119 4120 Expr *InputExpr = Input.getSourceExpression(); 4121 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4122 4123 ExprResult E = getDerived().TransformExpr(InputExpr); 4124 E = SemaRef.ActOnConstantExpression(E); 4125 if (E.isInvalid()) return true; 4126 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4127 return false; 4128 } 4129 } 4130 4131 // Work around bogus GCC warning 4132 return true; 4133 } 4134 4135 /// Iterator adaptor that invents template argument location information 4136 /// for each of the template arguments in its underlying iterator. 4137 template<typename Derived, typename InputIterator> 4138 class TemplateArgumentLocInventIterator { 4139 TreeTransform<Derived> &Self; 4140 InputIterator Iter; 4141 4142 public: 4143 typedef TemplateArgumentLoc value_type; 4144 typedef TemplateArgumentLoc reference; 4145 typedef typename std::iterator_traits<InputIterator>::difference_type 4146 difference_type; 4147 typedef std::input_iterator_tag iterator_category; 4148 4149 class pointer { 4150 TemplateArgumentLoc Arg; 4151 4152 public: 4153 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4154 4155 const TemplateArgumentLoc *operator->() const { return &Arg; } 4156 }; 4157 4158 TemplateArgumentLocInventIterator() { } 4159 4160 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4161 InputIterator Iter) 4162 : Self(Self), Iter(Iter) { } 4163 4164 TemplateArgumentLocInventIterator &operator++() { 4165 ++Iter; 4166 return *this; 4167 } 4168 4169 TemplateArgumentLocInventIterator operator++(int) { 4170 TemplateArgumentLocInventIterator Old(*this); 4171 ++(*this); 4172 return Old; 4173 } 4174 4175 reference operator*() const { 4176 TemplateArgumentLoc Result; 4177 Self.InventTemplateArgumentLoc(*Iter, Result); 4178 return Result; 4179 } 4180 4181 pointer operator->() const { return pointer(**this); } 4182 4183 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4184 const TemplateArgumentLocInventIterator &Y) { 4185 return X.Iter == Y.Iter; 4186 } 4187 4188 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4189 const TemplateArgumentLocInventIterator &Y) { 4190 return X.Iter != Y.Iter; 4191 } 4192 }; 4193 4194 template<typename Derived> 4195 template<typename InputIterator> 4196 bool TreeTransform<Derived>::TransformTemplateArguments( 4197 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4198 bool Uneval) { 4199 for (; First != Last; ++First) { 4200 TemplateArgumentLoc Out; 4201 TemplateArgumentLoc In = *First; 4202 4203 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4204 // Unpack argument packs, which we translate them into separate 4205 // arguments. 4206 // FIXME: We could do much better if we could guarantee that the 4207 // TemplateArgumentLocInfo for the pack expansion would be usable for 4208 // all of the template arguments in the argument pack. 4209 typedef TemplateArgumentLocInventIterator<Derived, 4210 TemplateArgument::pack_iterator> 4211 PackLocIterator; 4212 if (TransformTemplateArguments(PackLocIterator(*this, 4213 In.getArgument().pack_begin()), 4214 PackLocIterator(*this, 4215 In.getArgument().pack_end()), 4216 Outputs, Uneval)) 4217 return true; 4218 4219 continue; 4220 } 4221 4222 if (In.getArgument().isPackExpansion()) { 4223 // We have a pack expansion, for which we will be substituting into 4224 // the pattern. 4225 SourceLocation Ellipsis; 4226 Optional<unsigned> OrigNumExpansions; 4227 TemplateArgumentLoc Pattern 4228 = getSema().getTemplateArgumentPackExpansionPattern( 4229 In, Ellipsis, OrigNumExpansions); 4230 4231 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4232 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4233 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4234 4235 // Determine whether the set of unexpanded parameter packs can and should 4236 // be expanded. 4237 bool Expand = true; 4238 bool RetainExpansion = false; 4239 Optional<unsigned> NumExpansions = OrigNumExpansions; 4240 if (getDerived().TryExpandParameterPacks(Ellipsis, 4241 Pattern.getSourceRange(), 4242 Unexpanded, 4243 Expand, 4244 RetainExpansion, 4245 NumExpansions)) 4246 return true; 4247 4248 if (!Expand) { 4249 // The transform has determined that we should perform a simple 4250 // transformation on the pack expansion, producing another pack 4251 // expansion. 4252 TemplateArgumentLoc OutPattern; 4253 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4254 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4255 return true; 4256 4257 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4258 NumExpansions); 4259 if (Out.getArgument().isNull()) 4260 return true; 4261 4262 Outputs.addArgument(Out); 4263 continue; 4264 } 4265 4266 // The transform has determined that we should perform an elementwise 4267 // expansion of the pattern. Do so. 4268 for (unsigned I = 0; I != *NumExpansions; ++I) { 4269 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4270 4271 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4272 return true; 4273 4274 if (Out.getArgument().containsUnexpandedParameterPack()) { 4275 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4276 OrigNumExpansions); 4277 if (Out.getArgument().isNull()) 4278 return true; 4279 } 4280 4281 Outputs.addArgument(Out); 4282 } 4283 4284 // If we're supposed to retain a pack expansion, do so by temporarily 4285 // forgetting the partially-substituted parameter pack. 4286 if (RetainExpansion) { 4287 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4288 4289 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4290 return true; 4291 4292 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4293 OrigNumExpansions); 4294 if (Out.getArgument().isNull()) 4295 return true; 4296 4297 Outputs.addArgument(Out); 4298 } 4299 4300 continue; 4301 } 4302 4303 // The simple case: 4304 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4305 return true; 4306 4307 Outputs.addArgument(Out); 4308 } 4309 4310 return false; 4311 4312 } 4313 4314 //===----------------------------------------------------------------------===// 4315 // Type transformation 4316 //===----------------------------------------------------------------------===// 4317 4318 template<typename Derived> 4319 QualType TreeTransform<Derived>::TransformType(QualType T) { 4320 if (getDerived().AlreadyTransformed(T)) 4321 return T; 4322 4323 // Temporary workaround. All of these transformations should 4324 // eventually turn into transformations on TypeLocs. 4325 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4326 getDerived().getBaseLocation()); 4327 4328 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4329 4330 if (!NewDI) 4331 return QualType(); 4332 4333 return NewDI->getType(); 4334 } 4335 4336 template<typename Derived> 4337 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4338 // Refine the base location to the type's location. 4339 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4340 getDerived().getBaseEntity()); 4341 if (getDerived().AlreadyTransformed(DI->getType())) 4342 return DI; 4343 4344 TypeLocBuilder TLB; 4345 4346 TypeLoc TL = DI->getTypeLoc(); 4347 TLB.reserve(TL.getFullDataSize()); 4348 4349 QualType Result = getDerived().TransformType(TLB, TL); 4350 if (Result.isNull()) 4351 return nullptr; 4352 4353 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4354 } 4355 4356 template<typename Derived> 4357 QualType 4358 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4359 switch (T.getTypeLocClass()) { 4360 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4361 #define TYPELOC(CLASS, PARENT) \ 4362 case TypeLoc::CLASS: \ 4363 return getDerived().Transform##CLASS##Type(TLB, \ 4364 T.castAs<CLASS##TypeLoc>()); 4365 #include "clang/AST/TypeLocNodes.def" 4366 } 4367 4368 llvm_unreachable("unhandled type loc!"); 4369 } 4370 4371 template<typename Derived> 4372 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4373 if (!isa<DependentNameType>(T)) 4374 return TransformType(T); 4375 4376 if (getDerived().AlreadyTransformed(T)) 4377 return T; 4378 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4379 getDerived().getBaseLocation()); 4380 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4381 return NewDI ? NewDI->getType() : QualType(); 4382 } 4383 4384 template<typename Derived> 4385 TypeSourceInfo * 4386 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4387 if (!isa<DependentNameType>(DI->getType())) 4388 return TransformType(DI); 4389 4390 // Refine the base location to the type's location. 4391 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4392 getDerived().getBaseEntity()); 4393 if (getDerived().AlreadyTransformed(DI->getType())) 4394 return DI; 4395 4396 TypeLocBuilder TLB; 4397 4398 TypeLoc TL = DI->getTypeLoc(); 4399 TLB.reserve(TL.getFullDataSize()); 4400 4401 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4402 if (QTL) 4403 TL = QTL.getUnqualifiedLoc(); 4404 4405 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4406 4407 QualType Result = getDerived().TransformDependentNameType( 4408 TLB, DNTL, /*DeducedTSTContext*/true); 4409 if (Result.isNull()) 4410 return nullptr; 4411 4412 if (QTL) { 4413 Result = getDerived().RebuildQualifiedType(Result, QTL); 4414 if (Result.isNull()) 4415 return nullptr; 4416 TLB.TypeWasModifiedSafely(Result); 4417 } 4418 4419 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4420 } 4421 4422 template<typename Derived> 4423 QualType 4424 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4425 QualifiedTypeLoc T) { 4426 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4427 if (Result.isNull()) 4428 return QualType(); 4429 4430 Result = getDerived().RebuildQualifiedType(Result, T); 4431 4432 if (Result.isNull()) 4433 return QualType(); 4434 4435 // RebuildQualifiedType might have updated the type, but not in a way 4436 // that invalidates the TypeLoc. (There's no location information for 4437 // qualifiers.) 4438 TLB.TypeWasModifiedSafely(Result); 4439 4440 return Result; 4441 } 4442 4443 template <typename Derived> 4444 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4445 QualifiedTypeLoc TL) { 4446 4447 SourceLocation Loc = TL.getBeginLoc(); 4448 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4449 4450 if (((T.getAddressSpace() != LangAS::Default && 4451 Quals.getAddressSpace() != LangAS::Default)) && 4452 T.getAddressSpace() != Quals.getAddressSpace()) { 4453 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4454 << TL.getType() << T; 4455 return QualType(); 4456 } 4457 4458 // C++ [dcl.fct]p7: 4459 // [When] adding cv-qualifications on top of the function type [...] the 4460 // cv-qualifiers are ignored. 4461 if (T->isFunctionType()) { 4462 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4463 Quals.getAddressSpace()); 4464 return T; 4465 } 4466 4467 // C++ [dcl.ref]p1: 4468 // when the cv-qualifiers are introduced through the use of a typedef-name 4469 // or decltype-specifier [...] the cv-qualifiers are ignored. 4470 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4471 // applied to a reference type. 4472 if (T->isReferenceType()) { 4473 // The only qualifier that applies to a reference type is restrict. 4474 if (!Quals.hasRestrict()) 4475 return T; 4476 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4477 } 4478 4479 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4480 // resulting type. 4481 if (Quals.hasObjCLifetime()) { 4482 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4483 Quals.removeObjCLifetime(); 4484 else if (T.getObjCLifetime()) { 4485 // Objective-C ARC: 4486 // A lifetime qualifier applied to a substituted template parameter 4487 // overrides the lifetime qualifier from the template argument. 4488 const AutoType *AutoTy; 4489 if (const SubstTemplateTypeParmType *SubstTypeParam 4490 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4491 QualType Replacement = SubstTypeParam->getReplacementType(); 4492 Qualifiers Qs = Replacement.getQualifiers(); 4493 Qs.removeObjCLifetime(); 4494 Replacement = SemaRef.Context.getQualifiedType( 4495 Replacement.getUnqualifiedType(), Qs); 4496 T = SemaRef.Context.getSubstTemplateTypeParmType( 4497 SubstTypeParam->getReplacedParameter(), Replacement); 4498 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4499 // 'auto' types behave the same way as template parameters. 4500 QualType Deduced = AutoTy->getDeducedType(); 4501 Qualifiers Qs = Deduced.getQualifiers(); 4502 Qs.removeObjCLifetime(); 4503 Deduced = 4504 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4505 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4506 AutoTy->isDependentType(), 4507 /*isPack=*/false, 4508 AutoTy->getTypeConstraintConcept(), 4509 AutoTy->getTypeConstraintArguments()); 4510 } else { 4511 // Otherwise, complain about the addition of a qualifier to an 4512 // already-qualified type. 4513 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4514 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4515 Quals.removeObjCLifetime(); 4516 } 4517 } 4518 } 4519 4520 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4521 } 4522 4523 template<typename Derived> 4524 TypeLoc 4525 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4526 QualType ObjectType, 4527 NamedDecl *UnqualLookup, 4528 CXXScopeSpec &SS) { 4529 if (getDerived().AlreadyTransformed(TL.getType())) 4530 return TL; 4531 4532 TypeSourceInfo *TSI = 4533 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4534 if (TSI) 4535 return TSI->getTypeLoc(); 4536 return TypeLoc(); 4537 } 4538 4539 template<typename Derived> 4540 TypeSourceInfo * 4541 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4542 QualType ObjectType, 4543 NamedDecl *UnqualLookup, 4544 CXXScopeSpec &SS) { 4545 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4546 return TSInfo; 4547 4548 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4549 UnqualLookup, SS); 4550 } 4551 4552 template <typename Derived> 4553 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4554 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4555 CXXScopeSpec &SS) { 4556 QualType T = TL.getType(); 4557 assert(!getDerived().AlreadyTransformed(T)); 4558 4559 TypeLocBuilder TLB; 4560 QualType Result; 4561 4562 if (isa<TemplateSpecializationType>(T)) { 4563 TemplateSpecializationTypeLoc SpecTL = 4564 TL.castAs<TemplateSpecializationTypeLoc>(); 4565 4566 TemplateName Template = getDerived().TransformTemplateName( 4567 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4568 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4569 if (Template.isNull()) 4570 return nullptr; 4571 4572 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4573 Template); 4574 } else if (isa<DependentTemplateSpecializationType>(T)) { 4575 DependentTemplateSpecializationTypeLoc SpecTL = 4576 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4577 4578 TemplateName Template 4579 = getDerived().RebuildTemplateName(SS, 4580 SpecTL.getTemplateKeywordLoc(), 4581 *SpecTL.getTypePtr()->getIdentifier(), 4582 SpecTL.getTemplateNameLoc(), 4583 ObjectType, UnqualLookup, 4584 /*AllowInjectedClassName*/true); 4585 if (Template.isNull()) 4586 return nullptr; 4587 4588 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4589 SpecTL, 4590 Template, 4591 SS); 4592 } else { 4593 // Nothing special needs to be done for these. 4594 Result = getDerived().TransformType(TLB, TL); 4595 } 4596 4597 if (Result.isNull()) 4598 return nullptr; 4599 4600 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4601 } 4602 4603 template <class TyLoc> static inline 4604 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4605 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4606 NewT.setNameLoc(T.getNameLoc()); 4607 return T.getType(); 4608 } 4609 4610 template<typename Derived> 4611 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4612 BuiltinTypeLoc T) { 4613 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4614 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4615 if (T.needsExtraLocalData()) 4616 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4617 return T.getType(); 4618 } 4619 4620 template<typename Derived> 4621 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4622 ComplexTypeLoc T) { 4623 // FIXME: recurse? 4624 return TransformTypeSpecType(TLB, T); 4625 } 4626 4627 template <typename Derived> 4628 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4629 AdjustedTypeLoc TL) { 4630 // Adjustments applied during transformation are handled elsewhere. 4631 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4632 } 4633 4634 template<typename Derived> 4635 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4636 DecayedTypeLoc TL) { 4637 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4638 if (OriginalType.isNull()) 4639 return QualType(); 4640 4641 QualType Result = TL.getType(); 4642 if (getDerived().AlwaysRebuild() || 4643 OriginalType != TL.getOriginalLoc().getType()) 4644 Result = SemaRef.Context.getDecayedType(OriginalType); 4645 TLB.push<DecayedTypeLoc>(Result); 4646 // Nothing to set for DecayedTypeLoc. 4647 return Result; 4648 } 4649 4650 template<typename Derived> 4651 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4652 PointerTypeLoc TL) { 4653 QualType PointeeType 4654 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4655 if (PointeeType.isNull()) 4656 return QualType(); 4657 4658 QualType Result = TL.getType(); 4659 if (PointeeType->getAs<ObjCObjectType>()) { 4660 // A dependent pointer type 'T *' has is being transformed such 4661 // that an Objective-C class type is being replaced for 'T'. The 4662 // resulting pointer type is an ObjCObjectPointerType, not a 4663 // PointerType. 4664 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4665 4666 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4667 NewT.setStarLoc(TL.getStarLoc()); 4668 return Result; 4669 } 4670 4671 if (getDerived().AlwaysRebuild() || 4672 PointeeType != TL.getPointeeLoc().getType()) { 4673 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4674 if (Result.isNull()) 4675 return QualType(); 4676 } 4677 4678 // Objective-C ARC can add lifetime qualifiers to the type that we're 4679 // pointing to. 4680 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4681 4682 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4683 NewT.setSigilLoc(TL.getSigilLoc()); 4684 return Result; 4685 } 4686 4687 template<typename Derived> 4688 QualType 4689 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4690 BlockPointerTypeLoc TL) { 4691 QualType PointeeType 4692 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4693 if (PointeeType.isNull()) 4694 return QualType(); 4695 4696 QualType Result = TL.getType(); 4697 if (getDerived().AlwaysRebuild() || 4698 PointeeType != TL.getPointeeLoc().getType()) { 4699 Result = getDerived().RebuildBlockPointerType(PointeeType, 4700 TL.getSigilLoc()); 4701 if (Result.isNull()) 4702 return QualType(); 4703 } 4704 4705 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4706 NewT.setSigilLoc(TL.getSigilLoc()); 4707 return Result; 4708 } 4709 4710 /// Transforms a reference type. Note that somewhat paradoxically we 4711 /// don't care whether the type itself is an l-value type or an r-value 4712 /// type; we only care if the type was *written* as an l-value type 4713 /// or an r-value type. 4714 template<typename Derived> 4715 QualType 4716 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4717 ReferenceTypeLoc TL) { 4718 const ReferenceType *T = TL.getTypePtr(); 4719 4720 // Note that this works with the pointee-as-written. 4721 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4722 if (PointeeType.isNull()) 4723 return QualType(); 4724 4725 QualType Result = TL.getType(); 4726 if (getDerived().AlwaysRebuild() || 4727 PointeeType != T->getPointeeTypeAsWritten()) { 4728 Result = getDerived().RebuildReferenceType(PointeeType, 4729 T->isSpelledAsLValue(), 4730 TL.getSigilLoc()); 4731 if (Result.isNull()) 4732 return QualType(); 4733 } 4734 4735 // Objective-C ARC can add lifetime qualifiers to the type that we're 4736 // referring to. 4737 TLB.TypeWasModifiedSafely( 4738 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4739 4740 // r-value references can be rebuilt as l-value references. 4741 ReferenceTypeLoc NewTL; 4742 if (isa<LValueReferenceType>(Result)) 4743 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4744 else 4745 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4746 NewTL.setSigilLoc(TL.getSigilLoc()); 4747 4748 return Result; 4749 } 4750 4751 template<typename Derived> 4752 QualType 4753 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4754 LValueReferenceTypeLoc TL) { 4755 return TransformReferenceType(TLB, TL); 4756 } 4757 4758 template<typename Derived> 4759 QualType 4760 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4761 RValueReferenceTypeLoc TL) { 4762 return TransformReferenceType(TLB, TL); 4763 } 4764 4765 template<typename Derived> 4766 QualType 4767 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4768 MemberPointerTypeLoc TL) { 4769 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4770 if (PointeeType.isNull()) 4771 return QualType(); 4772 4773 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4774 TypeSourceInfo *NewClsTInfo = nullptr; 4775 if (OldClsTInfo) { 4776 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4777 if (!NewClsTInfo) 4778 return QualType(); 4779 } 4780 4781 const MemberPointerType *T = TL.getTypePtr(); 4782 QualType OldClsType = QualType(T->getClass(), 0); 4783 QualType NewClsType; 4784 if (NewClsTInfo) 4785 NewClsType = NewClsTInfo->getType(); 4786 else { 4787 NewClsType = getDerived().TransformType(OldClsType); 4788 if (NewClsType.isNull()) 4789 return QualType(); 4790 } 4791 4792 QualType Result = TL.getType(); 4793 if (getDerived().AlwaysRebuild() || 4794 PointeeType != T->getPointeeType() || 4795 NewClsType != OldClsType) { 4796 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4797 TL.getStarLoc()); 4798 if (Result.isNull()) 4799 return QualType(); 4800 } 4801 4802 // If we had to adjust the pointee type when building a member pointer, make 4803 // sure to push TypeLoc info for it. 4804 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4805 if (MPT && PointeeType != MPT->getPointeeType()) { 4806 assert(isa<AdjustedType>(MPT->getPointeeType())); 4807 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4808 } 4809 4810 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4811 NewTL.setSigilLoc(TL.getSigilLoc()); 4812 NewTL.setClassTInfo(NewClsTInfo); 4813 4814 return Result; 4815 } 4816 4817 template<typename Derived> 4818 QualType 4819 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4820 ConstantArrayTypeLoc TL) { 4821 const ConstantArrayType *T = TL.getTypePtr(); 4822 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4823 if (ElementType.isNull()) 4824 return QualType(); 4825 4826 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4827 Expr *OldSize = TL.getSizeExpr(); 4828 if (!OldSize) 4829 OldSize = const_cast<Expr*>(T->getSizeExpr()); 4830 Expr *NewSize = nullptr; 4831 if (OldSize) { 4832 EnterExpressionEvaluationContext Unevaluated( 4833 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4834 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 4835 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 4836 } 4837 4838 QualType Result = TL.getType(); 4839 if (getDerived().AlwaysRebuild() || 4840 ElementType != T->getElementType() || 4841 (T->getSizeExpr() && NewSize != OldSize)) { 4842 Result = getDerived().RebuildConstantArrayType(ElementType, 4843 T->getSizeModifier(), 4844 T->getSize(), NewSize, 4845 T->getIndexTypeCVRQualifiers(), 4846 TL.getBracketsRange()); 4847 if (Result.isNull()) 4848 return QualType(); 4849 } 4850 4851 // We might have either a ConstantArrayType or a VariableArrayType now: 4852 // a ConstantArrayType is allowed to have an element type which is a 4853 // VariableArrayType if the type is dependent. Fortunately, all array 4854 // types have the same location layout. 4855 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4856 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4857 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4858 NewTL.setSizeExpr(NewSize); 4859 4860 return Result; 4861 } 4862 4863 template<typename Derived> 4864 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4865 TypeLocBuilder &TLB, 4866 IncompleteArrayTypeLoc TL) { 4867 const IncompleteArrayType *T = TL.getTypePtr(); 4868 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4869 if (ElementType.isNull()) 4870 return QualType(); 4871 4872 QualType Result = TL.getType(); 4873 if (getDerived().AlwaysRebuild() || 4874 ElementType != T->getElementType()) { 4875 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4876 T->getSizeModifier(), 4877 T->getIndexTypeCVRQualifiers(), 4878 TL.getBracketsRange()); 4879 if (Result.isNull()) 4880 return QualType(); 4881 } 4882 4883 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4884 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4885 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4886 NewTL.setSizeExpr(nullptr); 4887 4888 return Result; 4889 } 4890 4891 template<typename Derived> 4892 QualType 4893 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4894 VariableArrayTypeLoc TL) { 4895 const VariableArrayType *T = TL.getTypePtr(); 4896 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4897 if (ElementType.isNull()) 4898 return QualType(); 4899 4900 ExprResult SizeResult; 4901 { 4902 EnterExpressionEvaluationContext Context( 4903 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4904 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4905 } 4906 if (SizeResult.isInvalid()) 4907 return QualType(); 4908 SizeResult = 4909 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 4910 if (SizeResult.isInvalid()) 4911 return QualType(); 4912 4913 Expr *Size = SizeResult.get(); 4914 4915 QualType Result = TL.getType(); 4916 if (getDerived().AlwaysRebuild() || 4917 ElementType != T->getElementType() || 4918 Size != T->getSizeExpr()) { 4919 Result = getDerived().RebuildVariableArrayType(ElementType, 4920 T->getSizeModifier(), 4921 Size, 4922 T->getIndexTypeCVRQualifiers(), 4923 TL.getBracketsRange()); 4924 if (Result.isNull()) 4925 return QualType(); 4926 } 4927 4928 // We might have constant size array now, but fortunately it has the same 4929 // location layout. 4930 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4931 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4932 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4933 NewTL.setSizeExpr(Size); 4934 4935 return Result; 4936 } 4937 4938 template<typename Derived> 4939 QualType 4940 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4941 DependentSizedArrayTypeLoc TL) { 4942 const DependentSizedArrayType *T = TL.getTypePtr(); 4943 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4944 if (ElementType.isNull()) 4945 return QualType(); 4946 4947 // Array bounds are constant expressions. 4948 EnterExpressionEvaluationContext Unevaluated( 4949 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4950 4951 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4952 Expr *origSize = TL.getSizeExpr(); 4953 if (!origSize) origSize = T->getSizeExpr(); 4954 4955 ExprResult sizeResult 4956 = getDerived().TransformExpr(origSize); 4957 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4958 if (sizeResult.isInvalid()) 4959 return QualType(); 4960 4961 Expr *size = sizeResult.get(); 4962 4963 QualType Result = TL.getType(); 4964 if (getDerived().AlwaysRebuild() || 4965 ElementType != T->getElementType() || 4966 size != origSize) { 4967 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4968 T->getSizeModifier(), 4969 size, 4970 T->getIndexTypeCVRQualifiers(), 4971 TL.getBracketsRange()); 4972 if (Result.isNull()) 4973 return QualType(); 4974 } 4975 4976 // We might have any sort of array type now, but fortunately they 4977 // all have the same location layout. 4978 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4979 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4980 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4981 NewTL.setSizeExpr(size); 4982 4983 return Result; 4984 } 4985 4986 template <typename Derived> 4987 QualType TreeTransform<Derived>::TransformDependentVectorType( 4988 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 4989 const DependentVectorType *T = TL.getTypePtr(); 4990 QualType ElementType = getDerived().TransformType(T->getElementType()); 4991 if (ElementType.isNull()) 4992 return QualType(); 4993 4994 EnterExpressionEvaluationContext Unevaluated( 4995 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4996 4997 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4998 Size = SemaRef.ActOnConstantExpression(Size); 4999 if (Size.isInvalid()) 5000 return QualType(); 5001 5002 QualType Result = TL.getType(); 5003 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5004 Size.get() != T->getSizeExpr()) { 5005 Result = getDerived().RebuildDependentVectorType( 5006 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5007 if (Result.isNull()) 5008 return QualType(); 5009 } 5010 5011 // Result might be dependent or not. 5012 if (isa<DependentVectorType>(Result)) { 5013 DependentVectorTypeLoc NewTL = 5014 TLB.push<DependentVectorTypeLoc>(Result); 5015 NewTL.setNameLoc(TL.getNameLoc()); 5016 } else { 5017 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5018 NewTL.setNameLoc(TL.getNameLoc()); 5019 } 5020 5021 return Result; 5022 } 5023 5024 template<typename Derived> 5025 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5026 TypeLocBuilder &TLB, 5027 DependentSizedExtVectorTypeLoc TL) { 5028 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5029 5030 // FIXME: ext vector locs should be nested 5031 QualType ElementType = getDerived().TransformType(T->getElementType()); 5032 if (ElementType.isNull()) 5033 return QualType(); 5034 5035 // Vector sizes are constant expressions. 5036 EnterExpressionEvaluationContext Unevaluated( 5037 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5038 5039 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5040 Size = SemaRef.ActOnConstantExpression(Size); 5041 if (Size.isInvalid()) 5042 return QualType(); 5043 5044 QualType Result = TL.getType(); 5045 if (getDerived().AlwaysRebuild() || 5046 ElementType != T->getElementType() || 5047 Size.get() != T->getSizeExpr()) { 5048 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5049 Size.get(), 5050 T->getAttributeLoc()); 5051 if (Result.isNull()) 5052 return QualType(); 5053 } 5054 5055 // Result might be dependent or not. 5056 if (isa<DependentSizedExtVectorType>(Result)) { 5057 DependentSizedExtVectorTypeLoc NewTL 5058 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5059 NewTL.setNameLoc(TL.getNameLoc()); 5060 } else { 5061 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5062 NewTL.setNameLoc(TL.getNameLoc()); 5063 } 5064 5065 return Result; 5066 } 5067 5068 template <typename Derived> 5069 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5070 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5071 const DependentAddressSpaceType *T = TL.getTypePtr(); 5072 5073 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5074 5075 if (pointeeType.isNull()) 5076 return QualType(); 5077 5078 // Address spaces are constant expressions. 5079 EnterExpressionEvaluationContext Unevaluated( 5080 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5081 5082 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5083 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5084 if (AddrSpace.isInvalid()) 5085 return QualType(); 5086 5087 QualType Result = TL.getType(); 5088 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5089 AddrSpace.get() != T->getAddrSpaceExpr()) { 5090 Result = getDerived().RebuildDependentAddressSpaceType( 5091 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5092 if (Result.isNull()) 5093 return QualType(); 5094 } 5095 5096 // Result might be dependent or not. 5097 if (isa<DependentAddressSpaceType>(Result)) { 5098 DependentAddressSpaceTypeLoc NewTL = 5099 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5100 5101 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5102 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5103 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5104 5105 } else { 5106 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5107 Result, getDerived().getBaseLocation()); 5108 TransformType(TLB, DI->getTypeLoc()); 5109 } 5110 5111 return Result; 5112 } 5113 5114 template <typename Derived> 5115 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5116 VectorTypeLoc TL) { 5117 const VectorType *T = TL.getTypePtr(); 5118 QualType ElementType = getDerived().TransformType(T->getElementType()); 5119 if (ElementType.isNull()) 5120 return QualType(); 5121 5122 QualType Result = TL.getType(); 5123 if (getDerived().AlwaysRebuild() || 5124 ElementType != T->getElementType()) { 5125 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5126 T->getVectorKind()); 5127 if (Result.isNull()) 5128 return QualType(); 5129 } 5130 5131 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5132 NewTL.setNameLoc(TL.getNameLoc()); 5133 5134 return Result; 5135 } 5136 5137 template<typename Derived> 5138 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5139 ExtVectorTypeLoc TL) { 5140 const VectorType *T = TL.getTypePtr(); 5141 QualType ElementType = getDerived().TransformType(T->getElementType()); 5142 if (ElementType.isNull()) 5143 return QualType(); 5144 5145 QualType Result = TL.getType(); 5146 if (getDerived().AlwaysRebuild() || 5147 ElementType != T->getElementType()) { 5148 Result = getDerived().RebuildExtVectorType(ElementType, 5149 T->getNumElements(), 5150 /*FIXME*/ SourceLocation()); 5151 if (Result.isNull()) 5152 return QualType(); 5153 } 5154 5155 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5156 NewTL.setNameLoc(TL.getNameLoc()); 5157 5158 return Result; 5159 } 5160 5161 template <typename Derived> 5162 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5163 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5164 bool ExpectParameterPack) { 5165 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5166 TypeSourceInfo *NewDI = nullptr; 5167 5168 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5169 // If we're substituting into a pack expansion type and we know the 5170 // length we want to expand to, just substitute for the pattern. 5171 TypeLoc OldTL = OldDI->getTypeLoc(); 5172 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5173 5174 TypeLocBuilder TLB; 5175 TypeLoc NewTL = OldDI->getTypeLoc(); 5176 TLB.reserve(NewTL.getFullDataSize()); 5177 5178 QualType Result = getDerived().TransformType(TLB, 5179 OldExpansionTL.getPatternLoc()); 5180 if (Result.isNull()) 5181 return nullptr; 5182 5183 Result = RebuildPackExpansionType(Result, 5184 OldExpansionTL.getPatternLoc().getSourceRange(), 5185 OldExpansionTL.getEllipsisLoc(), 5186 NumExpansions); 5187 if (Result.isNull()) 5188 return nullptr; 5189 5190 PackExpansionTypeLoc NewExpansionTL 5191 = TLB.push<PackExpansionTypeLoc>(Result); 5192 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5193 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5194 } else 5195 NewDI = getDerived().TransformType(OldDI); 5196 if (!NewDI) 5197 return nullptr; 5198 5199 if (NewDI == OldDI && indexAdjustment == 0) 5200 return OldParm; 5201 5202 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5203 OldParm->getDeclContext(), 5204 OldParm->getInnerLocStart(), 5205 OldParm->getLocation(), 5206 OldParm->getIdentifier(), 5207 NewDI->getType(), 5208 NewDI, 5209 OldParm->getStorageClass(), 5210 /* DefArg */ nullptr); 5211 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5212 OldParm->getFunctionScopeIndex() + indexAdjustment); 5213 return newParm; 5214 } 5215 5216 template <typename Derived> 5217 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5218 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5219 const QualType *ParamTypes, 5220 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5221 SmallVectorImpl<QualType> &OutParamTypes, 5222 SmallVectorImpl<ParmVarDecl *> *PVars, 5223 Sema::ExtParameterInfoBuilder &PInfos) { 5224 int indexAdjustment = 0; 5225 5226 unsigned NumParams = Params.size(); 5227 for (unsigned i = 0; i != NumParams; ++i) { 5228 if (ParmVarDecl *OldParm = Params[i]) { 5229 assert(OldParm->getFunctionScopeIndex() == i); 5230 5231 Optional<unsigned> NumExpansions; 5232 ParmVarDecl *NewParm = nullptr; 5233 if (OldParm->isParameterPack()) { 5234 // We have a function parameter pack that may need to be expanded. 5235 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5236 5237 // Find the parameter packs that could be expanded. 5238 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5239 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5240 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5241 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5242 5243 // Determine whether we should expand the parameter packs. 5244 bool ShouldExpand = false; 5245 bool RetainExpansion = false; 5246 Optional<unsigned> OrigNumExpansions; 5247 if (Unexpanded.size() > 0) { 5248 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5249 NumExpansions = OrigNumExpansions; 5250 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5251 Pattern.getSourceRange(), 5252 Unexpanded, 5253 ShouldExpand, 5254 RetainExpansion, 5255 NumExpansions)) { 5256 return true; 5257 } 5258 } else { 5259 #ifndef NDEBUG 5260 const AutoType *AT = 5261 Pattern.getType().getTypePtr()->getContainedAutoType(); 5262 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5263 "Could not find parameter packs or undeduced auto type!"); 5264 #endif 5265 } 5266 5267 if (ShouldExpand) { 5268 // Expand the function parameter pack into multiple, separate 5269 // parameters. 5270 getDerived().ExpandingFunctionParameterPack(OldParm); 5271 for (unsigned I = 0; I != *NumExpansions; ++I) { 5272 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5273 ParmVarDecl *NewParm 5274 = getDerived().TransformFunctionTypeParam(OldParm, 5275 indexAdjustment++, 5276 OrigNumExpansions, 5277 /*ExpectParameterPack=*/false); 5278 if (!NewParm) 5279 return true; 5280 5281 if (ParamInfos) 5282 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5283 OutParamTypes.push_back(NewParm->getType()); 5284 if (PVars) 5285 PVars->push_back(NewParm); 5286 } 5287 5288 // If we're supposed to retain a pack expansion, do so by temporarily 5289 // forgetting the partially-substituted parameter pack. 5290 if (RetainExpansion) { 5291 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5292 ParmVarDecl *NewParm 5293 = getDerived().TransformFunctionTypeParam(OldParm, 5294 indexAdjustment++, 5295 OrigNumExpansions, 5296 /*ExpectParameterPack=*/false); 5297 if (!NewParm) 5298 return true; 5299 5300 if (ParamInfos) 5301 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5302 OutParamTypes.push_back(NewParm->getType()); 5303 if (PVars) 5304 PVars->push_back(NewParm); 5305 } 5306 5307 // The next parameter should have the same adjustment as the 5308 // last thing we pushed, but we post-incremented indexAdjustment 5309 // on every push. Also, if we push nothing, the adjustment should 5310 // go down by one. 5311 indexAdjustment--; 5312 5313 // We're done with the pack expansion. 5314 continue; 5315 } 5316 5317 // We'll substitute the parameter now without expanding the pack 5318 // expansion. 5319 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5320 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5321 indexAdjustment, 5322 NumExpansions, 5323 /*ExpectParameterPack=*/true); 5324 assert(NewParm->isParameterPack() && 5325 "Parameter pack no longer a parameter pack after " 5326 "transformation."); 5327 } else { 5328 NewParm = getDerived().TransformFunctionTypeParam( 5329 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5330 } 5331 5332 if (!NewParm) 5333 return true; 5334 5335 if (ParamInfos) 5336 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5337 OutParamTypes.push_back(NewParm->getType()); 5338 if (PVars) 5339 PVars->push_back(NewParm); 5340 continue; 5341 } 5342 5343 // Deal with the possibility that we don't have a parameter 5344 // declaration for this parameter. 5345 QualType OldType = ParamTypes[i]; 5346 bool IsPackExpansion = false; 5347 Optional<unsigned> NumExpansions; 5348 QualType NewType; 5349 if (const PackExpansionType *Expansion 5350 = dyn_cast<PackExpansionType>(OldType)) { 5351 // We have a function parameter pack that may need to be expanded. 5352 QualType Pattern = Expansion->getPattern(); 5353 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5354 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5355 5356 // Determine whether we should expand the parameter packs. 5357 bool ShouldExpand = false; 5358 bool RetainExpansion = false; 5359 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5360 Unexpanded, 5361 ShouldExpand, 5362 RetainExpansion, 5363 NumExpansions)) { 5364 return true; 5365 } 5366 5367 if (ShouldExpand) { 5368 // Expand the function parameter pack into multiple, separate 5369 // parameters. 5370 for (unsigned I = 0; I != *NumExpansions; ++I) { 5371 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5372 QualType NewType = getDerived().TransformType(Pattern); 5373 if (NewType.isNull()) 5374 return true; 5375 5376 if (NewType->containsUnexpandedParameterPack()) { 5377 NewType = 5378 getSema().getASTContext().getPackExpansionType(NewType, None); 5379 5380 if (NewType.isNull()) 5381 return true; 5382 } 5383 5384 if (ParamInfos) 5385 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5386 OutParamTypes.push_back(NewType); 5387 if (PVars) 5388 PVars->push_back(nullptr); 5389 } 5390 5391 // We're done with the pack expansion. 5392 continue; 5393 } 5394 5395 // If we're supposed to retain a pack expansion, do so by temporarily 5396 // forgetting the partially-substituted parameter pack. 5397 if (RetainExpansion) { 5398 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5399 QualType NewType = getDerived().TransformType(Pattern); 5400 if (NewType.isNull()) 5401 return true; 5402 5403 if (ParamInfos) 5404 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5405 OutParamTypes.push_back(NewType); 5406 if (PVars) 5407 PVars->push_back(nullptr); 5408 } 5409 5410 // We'll substitute the parameter now without expanding the pack 5411 // expansion. 5412 OldType = Expansion->getPattern(); 5413 IsPackExpansion = true; 5414 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5415 NewType = getDerived().TransformType(OldType); 5416 } else { 5417 NewType = getDerived().TransformType(OldType); 5418 } 5419 5420 if (NewType.isNull()) 5421 return true; 5422 5423 if (IsPackExpansion) 5424 NewType = getSema().Context.getPackExpansionType(NewType, 5425 NumExpansions); 5426 5427 if (ParamInfos) 5428 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5429 OutParamTypes.push_back(NewType); 5430 if (PVars) 5431 PVars->push_back(nullptr); 5432 } 5433 5434 #ifndef NDEBUG 5435 if (PVars) { 5436 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5437 if (ParmVarDecl *parm = (*PVars)[i]) 5438 assert(parm->getFunctionScopeIndex() == i); 5439 } 5440 #endif 5441 5442 return false; 5443 } 5444 5445 template<typename Derived> 5446 QualType 5447 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5448 FunctionProtoTypeLoc TL) { 5449 SmallVector<QualType, 4> ExceptionStorage; 5450 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5451 return getDerived().TransformFunctionProtoType( 5452 TLB, TL, nullptr, Qualifiers(), 5453 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5454 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5455 ExceptionStorage, Changed); 5456 }); 5457 } 5458 5459 template<typename Derived> template<typename Fn> 5460 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5461 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5462 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5463 5464 // Transform the parameters and return type. 5465 // 5466 // We are required to instantiate the params and return type in source order. 5467 // When the function has a trailing return type, we instantiate the 5468 // parameters before the return type, since the return type can then refer 5469 // to the parameters themselves (via decltype, sizeof, etc.). 5470 // 5471 SmallVector<QualType, 4> ParamTypes; 5472 SmallVector<ParmVarDecl*, 4> ParamDecls; 5473 Sema::ExtParameterInfoBuilder ExtParamInfos; 5474 const FunctionProtoType *T = TL.getTypePtr(); 5475 5476 QualType ResultType; 5477 5478 if (T->hasTrailingReturn()) { 5479 if (getDerived().TransformFunctionTypeParams( 5480 TL.getBeginLoc(), TL.getParams(), 5481 TL.getTypePtr()->param_type_begin(), 5482 T->getExtParameterInfosOrNull(), 5483 ParamTypes, &ParamDecls, ExtParamInfos)) 5484 return QualType(); 5485 5486 { 5487 // C++11 [expr.prim.general]p3: 5488 // If a declaration declares a member function or member function 5489 // template of a class X, the expression this is a prvalue of type 5490 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5491 // and the end of the function-definition, member-declarator, or 5492 // declarator. 5493 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5494 5495 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5496 if (ResultType.isNull()) 5497 return QualType(); 5498 } 5499 } 5500 else { 5501 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5502 if (ResultType.isNull()) 5503 return QualType(); 5504 5505 if (getDerived().TransformFunctionTypeParams( 5506 TL.getBeginLoc(), TL.getParams(), 5507 TL.getTypePtr()->param_type_begin(), 5508 T->getExtParameterInfosOrNull(), 5509 ParamTypes, &ParamDecls, ExtParamInfos)) 5510 return QualType(); 5511 } 5512 5513 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5514 5515 bool EPIChanged = false; 5516 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5517 return QualType(); 5518 5519 // Handle extended parameter information. 5520 if (auto NewExtParamInfos = 5521 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5522 if (!EPI.ExtParameterInfos || 5523 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5524 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5525 EPIChanged = true; 5526 } 5527 EPI.ExtParameterInfos = NewExtParamInfos; 5528 } else if (EPI.ExtParameterInfos) { 5529 EPIChanged = true; 5530 EPI.ExtParameterInfos = nullptr; 5531 } 5532 5533 QualType Result = TL.getType(); 5534 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5535 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5536 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5537 if (Result.isNull()) 5538 return QualType(); 5539 } 5540 5541 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5542 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5543 NewTL.setLParenLoc(TL.getLParenLoc()); 5544 NewTL.setRParenLoc(TL.getRParenLoc()); 5545 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5546 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5547 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5548 NewTL.setParam(i, ParamDecls[i]); 5549 5550 return Result; 5551 } 5552 5553 template<typename Derived> 5554 bool TreeTransform<Derived>::TransformExceptionSpec( 5555 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5556 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5557 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5558 5559 // Instantiate a dynamic noexcept expression, if any. 5560 if (isComputedNoexcept(ESI.Type)) { 5561 EnterExpressionEvaluationContext Unevaluated( 5562 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5563 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5564 if (NoexceptExpr.isInvalid()) 5565 return true; 5566 5567 ExceptionSpecificationType EST = ESI.Type; 5568 NoexceptExpr = 5569 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5570 if (NoexceptExpr.isInvalid()) 5571 return true; 5572 5573 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5574 Changed = true; 5575 ESI.NoexceptExpr = NoexceptExpr.get(); 5576 ESI.Type = EST; 5577 } 5578 5579 if (ESI.Type != EST_Dynamic) 5580 return false; 5581 5582 // Instantiate a dynamic exception specification's type. 5583 for (QualType T : ESI.Exceptions) { 5584 if (const PackExpansionType *PackExpansion = 5585 T->getAs<PackExpansionType>()) { 5586 Changed = true; 5587 5588 // We have a pack expansion. Instantiate it. 5589 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5590 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5591 Unexpanded); 5592 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5593 5594 // Determine whether the set of unexpanded parameter packs can and 5595 // should 5596 // be expanded. 5597 bool Expand = false; 5598 bool RetainExpansion = false; 5599 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5600 // FIXME: Track the location of the ellipsis (and track source location 5601 // information for the types in the exception specification in general). 5602 if (getDerived().TryExpandParameterPacks( 5603 Loc, SourceRange(), Unexpanded, Expand, 5604 RetainExpansion, NumExpansions)) 5605 return true; 5606 5607 if (!Expand) { 5608 // We can't expand this pack expansion into separate arguments yet; 5609 // just substitute into the pattern and create a new pack expansion 5610 // type. 5611 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5612 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5613 if (U.isNull()) 5614 return true; 5615 5616 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5617 Exceptions.push_back(U); 5618 continue; 5619 } 5620 5621 // Substitute into the pack expansion pattern for each slice of the 5622 // pack. 5623 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5624 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5625 5626 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5627 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5628 return true; 5629 5630 Exceptions.push_back(U); 5631 } 5632 } else { 5633 QualType U = getDerived().TransformType(T); 5634 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5635 return true; 5636 if (T != U) 5637 Changed = true; 5638 5639 Exceptions.push_back(U); 5640 } 5641 } 5642 5643 ESI.Exceptions = Exceptions; 5644 if (ESI.Exceptions.empty()) 5645 ESI.Type = EST_DynamicNone; 5646 return false; 5647 } 5648 5649 template<typename Derived> 5650 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5651 TypeLocBuilder &TLB, 5652 FunctionNoProtoTypeLoc TL) { 5653 const FunctionNoProtoType *T = TL.getTypePtr(); 5654 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5655 if (ResultType.isNull()) 5656 return QualType(); 5657 5658 QualType Result = TL.getType(); 5659 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5660 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5661 5662 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5663 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5664 NewTL.setLParenLoc(TL.getLParenLoc()); 5665 NewTL.setRParenLoc(TL.getRParenLoc()); 5666 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5667 5668 return Result; 5669 } 5670 5671 template<typename Derived> QualType 5672 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5673 UnresolvedUsingTypeLoc TL) { 5674 const UnresolvedUsingType *T = TL.getTypePtr(); 5675 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5676 if (!D) 5677 return QualType(); 5678 5679 QualType Result = TL.getType(); 5680 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5681 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5682 if (Result.isNull()) 5683 return QualType(); 5684 } 5685 5686 // We might get an arbitrary type spec type back. We should at 5687 // least always get a type spec type, though. 5688 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5689 NewTL.setNameLoc(TL.getNameLoc()); 5690 5691 return Result; 5692 } 5693 5694 template<typename Derived> 5695 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5696 TypedefTypeLoc TL) { 5697 const TypedefType *T = TL.getTypePtr(); 5698 TypedefNameDecl *Typedef 5699 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5700 T->getDecl())); 5701 if (!Typedef) 5702 return QualType(); 5703 5704 QualType Result = TL.getType(); 5705 if (getDerived().AlwaysRebuild() || 5706 Typedef != T->getDecl()) { 5707 Result = getDerived().RebuildTypedefType(Typedef); 5708 if (Result.isNull()) 5709 return QualType(); 5710 } 5711 5712 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5713 NewTL.setNameLoc(TL.getNameLoc()); 5714 5715 return Result; 5716 } 5717 5718 template<typename Derived> 5719 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5720 TypeOfExprTypeLoc TL) { 5721 // typeof expressions are not potentially evaluated contexts 5722 EnterExpressionEvaluationContext Unevaluated( 5723 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5724 Sema::ReuseLambdaContextDecl); 5725 5726 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5727 if (E.isInvalid()) 5728 return QualType(); 5729 5730 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5731 if (E.isInvalid()) 5732 return QualType(); 5733 5734 QualType Result = TL.getType(); 5735 if (getDerived().AlwaysRebuild() || 5736 E.get() != TL.getUnderlyingExpr()) { 5737 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5738 if (Result.isNull()) 5739 return QualType(); 5740 } 5741 else E.get(); 5742 5743 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5744 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5745 NewTL.setLParenLoc(TL.getLParenLoc()); 5746 NewTL.setRParenLoc(TL.getRParenLoc()); 5747 5748 return Result; 5749 } 5750 5751 template<typename Derived> 5752 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5753 TypeOfTypeLoc TL) { 5754 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5755 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5756 if (!New_Under_TI) 5757 return QualType(); 5758 5759 QualType Result = TL.getType(); 5760 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5761 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5762 if (Result.isNull()) 5763 return QualType(); 5764 } 5765 5766 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5767 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5768 NewTL.setLParenLoc(TL.getLParenLoc()); 5769 NewTL.setRParenLoc(TL.getRParenLoc()); 5770 NewTL.setUnderlyingTInfo(New_Under_TI); 5771 5772 return Result; 5773 } 5774 5775 template<typename Derived> 5776 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5777 DecltypeTypeLoc TL) { 5778 const DecltypeType *T = TL.getTypePtr(); 5779 5780 // decltype expressions are not potentially evaluated contexts 5781 EnterExpressionEvaluationContext Unevaluated( 5782 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5783 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5784 5785 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5786 if (E.isInvalid()) 5787 return QualType(); 5788 5789 E = getSema().ActOnDecltypeExpression(E.get()); 5790 if (E.isInvalid()) 5791 return QualType(); 5792 5793 QualType Result = TL.getType(); 5794 if (getDerived().AlwaysRebuild() || 5795 E.get() != T->getUnderlyingExpr()) { 5796 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5797 if (Result.isNull()) 5798 return QualType(); 5799 } 5800 else E.get(); 5801 5802 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5803 NewTL.setNameLoc(TL.getNameLoc()); 5804 5805 return Result; 5806 } 5807 5808 template<typename Derived> 5809 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5810 TypeLocBuilder &TLB, 5811 UnaryTransformTypeLoc TL) { 5812 QualType Result = TL.getType(); 5813 if (Result->isDependentType()) { 5814 const UnaryTransformType *T = TL.getTypePtr(); 5815 QualType NewBase = 5816 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5817 Result = getDerived().RebuildUnaryTransformType(NewBase, 5818 T->getUTTKind(), 5819 TL.getKWLoc()); 5820 if (Result.isNull()) 5821 return QualType(); 5822 } 5823 5824 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5825 NewTL.setKWLoc(TL.getKWLoc()); 5826 NewTL.setParensRange(TL.getParensRange()); 5827 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5828 return Result; 5829 } 5830 5831 template<typename Derived> 5832 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5833 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5834 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5835 5836 CXXScopeSpec SS; 5837 TemplateName TemplateName = getDerived().TransformTemplateName( 5838 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5839 if (TemplateName.isNull()) 5840 return QualType(); 5841 5842 QualType OldDeduced = T->getDeducedType(); 5843 QualType NewDeduced; 5844 if (!OldDeduced.isNull()) { 5845 NewDeduced = getDerived().TransformType(OldDeduced); 5846 if (NewDeduced.isNull()) 5847 return QualType(); 5848 } 5849 5850 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5851 TemplateName, NewDeduced); 5852 if (Result.isNull()) 5853 return QualType(); 5854 5855 DeducedTemplateSpecializationTypeLoc NewTL = 5856 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5857 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5858 5859 return Result; 5860 } 5861 5862 template<typename Derived> 5863 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5864 RecordTypeLoc TL) { 5865 const RecordType *T = TL.getTypePtr(); 5866 RecordDecl *Record 5867 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5868 T->getDecl())); 5869 if (!Record) 5870 return QualType(); 5871 5872 QualType Result = TL.getType(); 5873 if (getDerived().AlwaysRebuild() || 5874 Record != T->getDecl()) { 5875 Result = getDerived().RebuildRecordType(Record); 5876 if (Result.isNull()) 5877 return QualType(); 5878 } 5879 5880 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5881 NewTL.setNameLoc(TL.getNameLoc()); 5882 5883 return Result; 5884 } 5885 5886 template<typename Derived> 5887 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5888 EnumTypeLoc TL) { 5889 const EnumType *T = TL.getTypePtr(); 5890 EnumDecl *Enum 5891 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5892 T->getDecl())); 5893 if (!Enum) 5894 return QualType(); 5895 5896 QualType Result = TL.getType(); 5897 if (getDerived().AlwaysRebuild() || 5898 Enum != T->getDecl()) { 5899 Result = getDerived().RebuildEnumType(Enum); 5900 if (Result.isNull()) 5901 return QualType(); 5902 } 5903 5904 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5905 NewTL.setNameLoc(TL.getNameLoc()); 5906 5907 return Result; 5908 } 5909 5910 template<typename Derived> 5911 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5912 TypeLocBuilder &TLB, 5913 InjectedClassNameTypeLoc TL) { 5914 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5915 TL.getTypePtr()->getDecl()); 5916 if (!D) return QualType(); 5917 5918 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5919 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5920 return T; 5921 } 5922 5923 template<typename Derived> 5924 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5925 TypeLocBuilder &TLB, 5926 TemplateTypeParmTypeLoc TL) { 5927 return TransformTypeSpecType(TLB, TL); 5928 } 5929 5930 template<typename Derived> 5931 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5932 TypeLocBuilder &TLB, 5933 SubstTemplateTypeParmTypeLoc TL) { 5934 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5935 5936 // Substitute into the replacement type, which itself might involve something 5937 // that needs to be transformed. This only tends to occur with default 5938 // template arguments of template template parameters. 5939 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5940 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5941 if (Replacement.isNull()) 5942 return QualType(); 5943 5944 // Always canonicalize the replacement type. 5945 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5946 QualType Result 5947 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5948 Replacement); 5949 5950 // Propagate type-source information. 5951 SubstTemplateTypeParmTypeLoc NewTL 5952 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5953 NewTL.setNameLoc(TL.getNameLoc()); 5954 return Result; 5955 5956 } 5957 5958 template<typename Derived> 5959 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5960 TypeLocBuilder &TLB, 5961 SubstTemplateTypeParmPackTypeLoc TL) { 5962 return TransformTypeSpecType(TLB, TL); 5963 } 5964 5965 template<typename Derived> 5966 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5967 TypeLocBuilder &TLB, 5968 TemplateSpecializationTypeLoc TL) { 5969 const TemplateSpecializationType *T = TL.getTypePtr(); 5970 5971 // The nested-name-specifier never matters in a TemplateSpecializationType, 5972 // because we can't have a dependent nested-name-specifier anyway. 5973 CXXScopeSpec SS; 5974 TemplateName Template 5975 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5976 TL.getTemplateNameLoc()); 5977 if (Template.isNull()) 5978 return QualType(); 5979 5980 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5981 } 5982 5983 template<typename Derived> 5984 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5985 AtomicTypeLoc TL) { 5986 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5987 if (ValueType.isNull()) 5988 return QualType(); 5989 5990 QualType Result = TL.getType(); 5991 if (getDerived().AlwaysRebuild() || 5992 ValueType != TL.getValueLoc().getType()) { 5993 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5994 if (Result.isNull()) 5995 return QualType(); 5996 } 5997 5998 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5999 NewTL.setKWLoc(TL.getKWLoc()); 6000 NewTL.setLParenLoc(TL.getLParenLoc()); 6001 NewTL.setRParenLoc(TL.getRParenLoc()); 6002 6003 return Result; 6004 } 6005 6006 template <typename Derived> 6007 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6008 PipeTypeLoc TL) { 6009 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6010 if (ValueType.isNull()) 6011 return QualType(); 6012 6013 QualType Result = TL.getType(); 6014 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6015 const PipeType *PT = Result->castAs<PipeType>(); 6016 bool isReadPipe = PT->isReadOnly(); 6017 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6018 if (Result.isNull()) 6019 return QualType(); 6020 } 6021 6022 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6023 NewTL.setKWLoc(TL.getKWLoc()); 6024 6025 return Result; 6026 } 6027 6028 /// Simple iterator that traverses the template arguments in a 6029 /// container that provides a \c getArgLoc() member function. 6030 /// 6031 /// This iterator is intended to be used with the iterator form of 6032 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6033 template<typename ArgLocContainer> 6034 class TemplateArgumentLocContainerIterator { 6035 ArgLocContainer *Container; 6036 unsigned Index; 6037 6038 public: 6039 typedef TemplateArgumentLoc value_type; 6040 typedef TemplateArgumentLoc reference; 6041 typedef int difference_type; 6042 typedef std::input_iterator_tag iterator_category; 6043 6044 class pointer { 6045 TemplateArgumentLoc Arg; 6046 6047 public: 6048 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6049 6050 const TemplateArgumentLoc *operator->() const { 6051 return &Arg; 6052 } 6053 }; 6054 6055 6056 TemplateArgumentLocContainerIterator() {} 6057 6058 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6059 unsigned Index) 6060 : Container(&Container), Index(Index) { } 6061 6062 TemplateArgumentLocContainerIterator &operator++() { 6063 ++Index; 6064 return *this; 6065 } 6066 6067 TemplateArgumentLocContainerIterator operator++(int) { 6068 TemplateArgumentLocContainerIterator Old(*this); 6069 ++(*this); 6070 return Old; 6071 } 6072 6073 TemplateArgumentLoc operator*() const { 6074 return Container->getArgLoc(Index); 6075 } 6076 6077 pointer operator->() const { 6078 return pointer(Container->getArgLoc(Index)); 6079 } 6080 6081 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6082 const TemplateArgumentLocContainerIterator &Y) { 6083 return X.Container == Y.Container && X.Index == Y.Index; 6084 } 6085 6086 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6087 const TemplateArgumentLocContainerIterator &Y) { 6088 return !(X == Y); 6089 } 6090 }; 6091 6092 template<typename Derived> 6093 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6094 AutoTypeLoc TL) { 6095 const AutoType *T = TL.getTypePtr(); 6096 QualType OldDeduced = T->getDeducedType(); 6097 QualType NewDeduced; 6098 if (!OldDeduced.isNull()) { 6099 NewDeduced = getDerived().TransformType(OldDeduced); 6100 if (NewDeduced.isNull()) 6101 return QualType(); 6102 } 6103 6104 ConceptDecl *NewCD = nullptr; 6105 TemplateArgumentListInfo NewTemplateArgs; 6106 NestedNameSpecifierLoc NewNestedNameSpec; 6107 if (TL.getTypePtr()->isConstrained()) { 6108 NewCD = cast_or_null<ConceptDecl>( 6109 getDerived().TransformDecl( 6110 TL.getConceptNameLoc(), 6111 TL.getTypePtr()->getTypeConstraintConcept())); 6112 6113 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6114 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6115 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6116 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6117 ArgIterator(TL, 6118 TL.getNumArgs()), 6119 NewTemplateArgs)) 6120 return QualType(); 6121 6122 if (TL.getNestedNameSpecifierLoc()) { 6123 NewNestedNameSpec 6124 = getDerived().TransformNestedNameSpecifierLoc( 6125 TL.getNestedNameSpecifierLoc()); 6126 if (!NewNestedNameSpec) 6127 return QualType(); 6128 } 6129 } 6130 6131 QualType Result = TL.getType(); 6132 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6133 T->isDependentType()) { 6134 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6135 NewArgList.reserve(NewArgList.size()); 6136 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6137 NewArgList.push_back(ArgLoc.getArgument()); 6138 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6139 NewArgList); 6140 if (Result.isNull()) 6141 return QualType(); 6142 } 6143 6144 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6145 NewTL.setNameLoc(TL.getNameLoc()); 6146 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6147 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6148 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6149 NewTL.setFoundDecl(TL.getFoundDecl()); 6150 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6151 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6152 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6153 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6154 6155 return Result; 6156 } 6157 6158 template <typename Derived> 6159 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6160 TypeLocBuilder &TLB, 6161 TemplateSpecializationTypeLoc TL, 6162 TemplateName Template) { 6163 TemplateArgumentListInfo NewTemplateArgs; 6164 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6165 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6166 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6167 ArgIterator; 6168 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6169 ArgIterator(TL, TL.getNumArgs()), 6170 NewTemplateArgs)) 6171 return QualType(); 6172 6173 // FIXME: maybe don't rebuild if all the template arguments are the same. 6174 6175 QualType Result = 6176 getDerived().RebuildTemplateSpecializationType(Template, 6177 TL.getTemplateNameLoc(), 6178 NewTemplateArgs); 6179 6180 if (!Result.isNull()) { 6181 // Specializations of template template parameters are represented as 6182 // TemplateSpecializationTypes, and substitution of type alias templates 6183 // within a dependent context can transform them into 6184 // DependentTemplateSpecializationTypes. 6185 if (isa<DependentTemplateSpecializationType>(Result)) { 6186 DependentTemplateSpecializationTypeLoc NewTL 6187 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6188 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6189 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6190 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6191 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6192 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6193 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6194 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6195 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6196 return Result; 6197 } 6198 6199 TemplateSpecializationTypeLoc NewTL 6200 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6201 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6202 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6203 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6204 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6205 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6206 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6207 } 6208 6209 return Result; 6210 } 6211 6212 template <typename Derived> 6213 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6214 TypeLocBuilder &TLB, 6215 DependentTemplateSpecializationTypeLoc TL, 6216 TemplateName Template, 6217 CXXScopeSpec &SS) { 6218 TemplateArgumentListInfo NewTemplateArgs; 6219 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6220 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6221 typedef TemplateArgumentLocContainerIterator< 6222 DependentTemplateSpecializationTypeLoc> ArgIterator; 6223 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6224 ArgIterator(TL, TL.getNumArgs()), 6225 NewTemplateArgs)) 6226 return QualType(); 6227 6228 // FIXME: maybe don't rebuild if all the template arguments are the same. 6229 6230 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6231 QualType Result 6232 = getSema().Context.getDependentTemplateSpecializationType( 6233 TL.getTypePtr()->getKeyword(), 6234 DTN->getQualifier(), 6235 DTN->getIdentifier(), 6236 NewTemplateArgs); 6237 6238 DependentTemplateSpecializationTypeLoc NewTL 6239 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6240 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6241 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6242 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6243 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6244 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6245 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6246 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6247 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6248 return Result; 6249 } 6250 6251 QualType Result 6252 = getDerived().RebuildTemplateSpecializationType(Template, 6253 TL.getTemplateNameLoc(), 6254 NewTemplateArgs); 6255 6256 if (!Result.isNull()) { 6257 /// FIXME: Wrap this in an elaborated-type-specifier? 6258 TemplateSpecializationTypeLoc NewTL 6259 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6260 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6261 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6262 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6263 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6264 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6265 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6266 } 6267 6268 return Result; 6269 } 6270 6271 template<typename Derived> 6272 QualType 6273 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6274 ElaboratedTypeLoc TL) { 6275 const ElaboratedType *T = TL.getTypePtr(); 6276 6277 NestedNameSpecifierLoc QualifierLoc; 6278 // NOTE: the qualifier in an ElaboratedType is optional. 6279 if (TL.getQualifierLoc()) { 6280 QualifierLoc 6281 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6282 if (!QualifierLoc) 6283 return QualType(); 6284 } 6285 6286 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6287 if (NamedT.isNull()) 6288 return QualType(); 6289 6290 // C++0x [dcl.type.elab]p2: 6291 // If the identifier resolves to a typedef-name or the simple-template-id 6292 // resolves to an alias template specialization, the 6293 // elaborated-type-specifier is ill-formed. 6294 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6295 if (const TemplateSpecializationType *TST = 6296 NamedT->getAs<TemplateSpecializationType>()) { 6297 TemplateName Template = TST->getTemplateName(); 6298 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6299 Template.getAsTemplateDecl())) { 6300 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6301 diag::err_tag_reference_non_tag) 6302 << TAT << Sema::NTK_TypeAliasTemplate 6303 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6304 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6305 } 6306 } 6307 } 6308 6309 QualType Result = TL.getType(); 6310 if (getDerived().AlwaysRebuild() || 6311 QualifierLoc != TL.getQualifierLoc() || 6312 NamedT != T->getNamedType()) { 6313 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6314 T->getKeyword(), 6315 QualifierLoc, NamedT); 6316 if (Result.isNull()) 6317 return QualType(); 6318 } 6319 6320 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6321 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6322 NewTL.setQualifierLoc(QualifierLoc); 6323 return Result; 6324 } 6325 6326 template<typename Derived> 6327 QualType TreeTransform<Derived>::TransformAttributedType( 6328 TypeLocBuilder &TLB, 6329 AttributedTypeLoc TL) { 6330 const AttributedType *oldType = TL.getTypePtr(); 6331 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6332 if (modifiedType.isNull()) 6333 return QualType(); 6334 6335 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6336 const Attr *oldAttr = TL.getAttr(); 6337 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6338 if (oldAttr && !newAttr) 6339 return QualType(); 6340 6341 QualType result = TL.getType(); 6342 6343 // FIXME: dependent operand expressions? 6344 if (getDerived().AlwaysRebuild() || 6345 modifiedType != oldType->getModifiedType()) { 6346 // TODO: this is really lame; we should really be rebuilding the 6347 // equivalent type from first principles. 6348 QualType equivalentType 6349 = getDerived().TransformType(oldType->getEquivalentType()); 6350 if (equivalentType.isNull()) 6351 return QualType(); 6352 6353 // Check whether we can add nullability; it is only represented as 6354 // type sugar, and therefore cannot be diagnosed in any other way. 6355 if (auto nullability = oldType->getImmediateNullability()) { 6356 if (!modifiedType->canHaveNullability()) { 6357 SemaRef.Diag(TL.getAttr()->getLocation(), 6358 diag::err_nullability_nonpointer) 6359 << DiagNullabilityKind(*nullability, false) << modifiedType; 6360 return QualType(); 6361 } 6362 } 6363 6364 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6365 modifiedType, 6366 equivalentType); 6367 } 6368 6369 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6370 newTL.setAttr(newAttr); 6371 return result; 6372 } 6373 6374 template<typename Derived> 6375 QualType 6376 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6377 ParenTypeLoc TL) { 6378 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6379 if (Inner.isNull()) 6380 return QualType(); 6381 6382 QualType Result = TL.getType(); 6383 if (getDerived().AlwaysRebuild() || 6384 Inner != TL.getInnerLoc().getType()) { 6385 Result = getDerived().RebuildParenType(Inner); 6386 if (Result.isNull()) 6387 return QualType(); 6388 } 6389 6390 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6391 NewTL.setLParenLoc(TL.getLParenLoc()); 6392 NewTL.setRParenLoc(TL.getRParenLoc()); 6393 return Result; 6394 } 6395 6396 template <typename Derived> 6397 QualType 6398 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6399 MacroQualifiedTypeLoc TL) { 6400 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6401 if (Inner.isNull()) 6402 return QualType(); 6403 6404 QualType Result = TL.getType(); 6405 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6406 Result = 6407 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6408 if (Result.isNull()) 6409 return QualType(); 6410 } 6411 6412 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6413 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6414 return Result; 6415 } 6416 6417 template<typename Derived> 6418 QualType TreeTransform<Derived>::TransformDependentNameType( 6419 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6420 return TransformDependentNameType(TLB, TL, false); 6421 } 6422 6423 template<typename Derived> 6424 QualType TreeTransform<Derived>::TransformDependentNameType( 6425 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6426 const DependentNameType *T = TL.getTypePtr(); 6427 6428 NestedNameSpecifierLoc QualifierLoc 6429 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6430 if (!QualifierLoc) 6431 return QualType(); 6432 6433 QualType Result 6434 = getDerived().RebuildDependentNameType(T->getKeyword(), 6435 TL.getElaboratedKeywordLoc(), 6436 QualifierLoc, 6437 T->getIdentifier(), 6438 TL.getNameLoc(), 6439 DeducedTSTContext); 6440 if (Result.isNull()) 6441 return QualType(); 6442 6443 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6444 QualType NamedT = ElabT->getNamedType(); 6445 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6446 6447 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6448 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6449 NewTL.setQualifierLoc(QualifierLoc); 6450 } else { 6451 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6452 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6453 NewTL.setQualifierLoc(QualifierLoc); 6454 NewTL.setNameLoc(TL.getNameLoc()); 6455 } 6456 return Result; 6457 } 6458 6459 template<typename Derived> 6460 QualType TreeTransform<Derived>:: 6461 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6462 DependentTemplateSpecializationTypeLoc TL) { 6463 NestedNameSpecifierLoc QualifierLoc; 6464 if (TL.getQualifierLoc()) { 6465 QualifierLoc 6466 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6467 if (!QualifierLoc) 6468 return QualType(); 6469 } 6470 6471 return getDerived() 6472 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6473 } 6474 6475 template<typename Derived> 6476 QualType TreeTransform<Derived>:: 6477 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6478 DependentTemplateSpecializationTypeLoc TL, 6479 NestedNameSpecifierLoc QualifierLoc) { 6480 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6481 6482 TemplateArgumentListInfo NewTemplateArgs; 6483 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6484 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6485 6486 typedef TemplateArgumentLocContainerIterator< 6487 DependentTemplateSpecializationTypeLoc> ArgIterator; 6488 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6489 ArgIterator(TL, TL.getNumArgs()), 6490 NewTemplateArgs)) 6491 return QualType(); 6492 6493 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6494 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6495 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6496 /*AllowInjectedClassName*/ false); 6497 if (Result.isNull()) 6498 return QualType(); 6499 6500 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6501 QualType NamedT = ElabT->getNamedType(); 6502 6503 // Copy information relevant to the template specialization. 6504 TemplateSpecializationTypeLoc NamedTL 6505 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6506 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6507 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6508 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6509 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6510 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6511 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6512 6513 // Copy information relevant to the elaborated type. 6514 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6515 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6516 NewTL.setQualifierLoc(QualifierLoc); 6517 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6518 DependentTemplateSpecializationTypeLoc SpecTL 6519 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6520 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6521 SpecTL.setQualifierLoc(QualifierLoc); 6522 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6523 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6524 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6525 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6526 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6527 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6528 } else { 6529 TemplateSpecializationTypeLoc SpecTL 6530 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6531 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6532 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6533 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6534 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6535 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6536 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6537 } 6538 return Result; 6539 } 6540 6541 template<typename Derived> 6542 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6543 PackExpansionTypeLoc TL) { 6544 QualType Pattern 6545 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6546 if (Pattern.isNull()) 6547 return QualType(); 6548 6549 QualType Result = TL.getType(); 6550 if (getDerived().AlwaysRebuild() || 6551 Pattern != TL.getPatternLoc().getType()) { 6552 Result = getDerived().RebuildPackExpansionType(Pattern, 6553 TL.getPatternLoc().getSourceRange(), 6554 TL.getEllipsisLoc(), 6555 TL.getTypePtr()->getNumExpansions()); 6556 if (Result.isNull()) 6557 return QualType(); 6558 } 6559 6560 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6561 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6562 return Result; 6563 } 6564 6565 template<typename Derived> 6566 QualType 6567 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6568 ObjCInterfaceTypeLoc TL) { 6569 // ObjCInterfaceType is never dependent. 6570 TLB.pushFullCopy(TL); 6571 return TL.getType(); 6572 } 6573 6574 template<typename Derived> 6575 QualType 6576 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6577 ObjCTypeParamTypeLoc TL) { 6578 const ObjCTypeParamType *T = TL.getTypePtr(); 6579 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6580 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6581 if (!OTP) 6582 return QualType(); 6583 6584 QualType Result = TL.getType(); 6585 if (getDerived().AlwaysRebuild() || 6586 OTP != T->getDecl()) { 6587 Result = getDerived().RebuildObjCTypeParamType(OTP, 6588 TL.getProtocolLAngleLoc(), 6589 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6590 TL.getNumProtocols()), 6591 TL.getProtocolLocs(), 6592 TL.getProtocolRAngleLoc()); 6593 if (Result.isNull()) 6594 return QualType(); 6595 } 6596 6597 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6598 if (TL.getNumProtocols()) { 6599 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6600 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6601 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6602 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6603 } 6604 return Result; 6605 } 6606 6607 template<typename Derived> 6608 QualType 6609 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6610 ObjCObjectTypeLoc TL) { 6611 // Transform base type. 6612 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6613 if (BaseType.isNull()) 6614 return QualType(); 6615 6616 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6617 6618 // Transform type arguments. 6619 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6620 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6621 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6622 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6623 QualType TypeArg = TypeArgInfo->getType(); 6624 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6625 AnyChanged = true; 6626 6627 // We have a pack expansion. Instantiate it. 6628 const auto *PackExpansion = PackExpansionLoc.getType() 6629 ->castAs<PackExpansionType>(); 6630 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6631 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6632 Unexpanded); 6633 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6634 6635 // Determine whether the set of unexpanded parameter packs can 6636 // and should be expanded. 6637 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6638 bool Expand = false; 6639 bool RetainExpansion = false; 6640 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6641 if (getDerived().TryExpandParameterPacks( 6642 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6643 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6644 return QualType(); 6645 6646 if (!Expand) { 6647 // We can't expand this pack expansion into separate arguments yet; 6648 // just substitute into the pattern and create a new pack expansion 6649 // type. 6650 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6651 6652 TypeLocBuilder TypeArgBuilder; 6653 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6654 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6655 PatternLoc); 6656 if (NewPatternType.isNull()) 6657 return QualType(); 6658 6659 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6660 NewPatternType, NumExpansions); 6661 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6662 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6663 NewTypeArgInfos.push_back( 6664 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6665 continue; 6666 } 6667 6668 // Substitute into the pack expansion pattern for each slice of the 6669 // pack. 6670 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6671 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6672 6673 TypeLocBuilder TypeArgBuilder; 6674 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6675 6676 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6677 PatternLoc); 6678 if (NewTypeArg.isNull()) 6679 return QualType(); 6680 6681 NewTypeArgInfos.push_back( 6682 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6683 } 6684 6685 continue; 6686 } 6687 6688 TypeLocBuilder TypeArgBuilder; 6689 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6690 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6691 if (NewTypeArg.isNull()) 6692 return QualType(); 6693 6694 // If nothing changed, just keep the old TypeSourceInfo. 6695 if (NewTypeArg == TypeArg) { 6696 NewTypeArgInfos.push_back(TypeArgInfo); 6697 continue; 6698 } 6699 6700 NewTypeArgInfos.push_back( 6701 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6702 AnyChanged = true; 6703 } 6704 6705 QualType Result = TL.getType(); 6706 if (getDerived().AlwaysRebuild() || AnyChanged) { 6707 // Rebuild the type. 6708 Result = getDerived().RebuildObjCObjectType( 6709 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6710 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6711 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6712 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6713 6714 if (Result.isNull()) 6715 return QualType(); 6716 } 6717 6718 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6719 NewT.setHasBaseTypeAsWritten(true); 6720 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6721 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6722 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6723 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6724 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6725 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6726 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6727 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6728 return Result; 6729 } 6730 6731 template<typename Derived> 6732 QualType 6733 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6734 ObjCObjectPointerTypeLoc TL) { 6735 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6736 if (PointeeType.isNull()) 6737 return QualType(); 6738 6739 QualType Result = TL.getType(); 6740 if (getDerived().AlwaysRebuild() || 6741 PointeeType != TL.getPointeeLoc().getType()) { 6742 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6743 TL.getStarLoc()); 6744 if (Result.isNull()) 6745 return QualType(); 6746 } 6747 6748 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6749 NewT.setStarLoc(TL.getStarLoc()); 6750 return Result; 6751 } 6752 6753 //===----------------------------------------------------------------------===// 6754 // Statement transformation 6755 //===----------------------------------------------------------------------===// 6756 template<typename Derived> 6757 StmtResult 6758 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6759 return S; 6760 } 6761 6762 template<typename Derived> 6763 StmtResult 6764 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6765 return getDerived().TransformCompoundStmt(S, false); 6766 } 6767 6768 template<typename Derived> 6769 StmtResult 6770 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6771 bool IsStmtExpr) { 6772 Sema::CompoundScopeRAII CompoundScope(getSema()); 6773 6774 const Stmt *ExprResult = S->getStmtExprResult(); 6775 bool SubStmtInvalid = false; 6776 bool SubStmtChanged = false; 6777 SmallVector<Stmt*, 8> Statements; 6778 for (auto *B : S->body()) { 6779 StmtResult Result = getDerived().TransformStmt( 6780 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 6781 6782 if (Result.isInvalid()) { 6783 // Immediately fail if this was a DeclStmt, since it's very 6784 // likely that this will cause problems for future statements. 6785 if (isa<DeclStmt>(B)) 6786 return StmtError(); 6787 6788 // Otherwise, just keep processing substatements and fail later. 6789 SubStmtInvalid = true; 6790 continue; 6791 } 6792 6793 SubStmtChanged = SubStmtChanged || Result.get() != B; 6794 Statements.push_back(Result.getAs<Stmt>()); 6795 } 6796 6797 if (SubStmtInvalid) 6798 return StmtError(); 6799 6800 if (!getDerived().AlwaysRebuild() && 6801 !SubStmtChanged) 6802 return S; 6803 6804 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6805 Statements, 6806 S->getRBracLoc(), 6807 IsStmtExpr); 6808 } 6809 6810 template<typename Derived> 6811 StmtResult 6812 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6813 ExprResult LHS, RHS; 6814 { 6815 EnterExpressionEvaluationContext Unevaluated( 6816 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6817 6818 // Transform the left-hand case value. 6819 LHS = getDerived().TransformExpr(S->getLHS()); 6820 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6821 if (LHS.isInvalid()) 6822 return StmtError(); 6823 6824 // Transform the right-hand case value (for the GNU case-range extension). 6825 RHS = getDerived().TransformExpr(S->getRHS()); 6826 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6827 if (RHS.isInvalid()) 6828 return StmtError(); 6829 } 6830 6831 // Build the case statement. 6832 // Case statements are always rebuilt so that they will attached to their 6833 // transformed switch statement. 6834 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6835 LHS.get(), 6836 S->getEllipsisLoc(), 6837 RHS.get(), 6838 S->getColonLoc()); 6839 if (Case.isInvalid()) 6840 return StmtError(); 6841 6842 // Transform the statement following the case 6843 StmtResult SubStmt = 6844 getDerived().TransformStmt(S->getSubStmt()); 6845 if (SubStmt.isInvalid()) 6846 return StmtError(); 6847 6848 // Attach the body to the case statement 6849 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6850 } 6851 6852 template <typename Derived> 6853 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6854 // Transform the statement following the default case 6855 StmtResult SubStmt = 6856 getDerived().TransformStmt(S->getSubStmt()); 6857 if (SubStmt.isInvalid()) 6858 return StmtError(); 6859 6860 // Default statements are always rebuilt 6861 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6862 SubStmt.get()); 6863 } 6864 6865 template<typename Derived> 6866 StmtResult 6867 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 6868 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6869 if (SubStmt.isInvalid()) 6870 return StmtError(); 6871 6872 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6873 S->getDecl()); 6874 if (!LD) 6875 return StmtError(); 6876 6877 // If we're transforming "in-place" (we're not creating new local 6878 // declarations), assume we're replacing the old label statement 6879 // and clear out the reference to it. 6880 if (LD == S->getDecl()) 6881 S->getDecl()->setStmt(nullptr); 6882 6883 // FIXME: Pass the real colon location in. 6884 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6885 cast<LabelDecl>(LD), SourceLocation(), 6886 SubStmt.get()); 6887 } 6888 6889 template <typename Derived> 6890 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6891 if (!R) 6892 return R; 6893 6894 switch (R->getKind()) { 6895 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6896 #define ATTR(X) 6897 #define PRAGMA_SPELLING_ATTR(X) \ 6898 case attr::X: \ 6899 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6900 #include "clang/Basic/AttrList.inc" 6901 default: 6902 return R; 6903 } 6904 } 6905 6906 template <typename Derived> 6907 StmtResult 6908 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 6909 StmtDiscardKind SDK) { 6910 bool AttrsChanged = false; 6911 SmallVector<const Attr *, 1> Attrs; 6912 6913 // Visit attributes and keep track if any are transformed. 6914 for (const auto *I : S->getAttrs()) { 6915 const Attr *R = getDerived().TransformAttr(I); 6916 AttrsChanged |= (I != R); 6917 Attrs.push_back(R); 6918 } 6919 6920 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6921 if (SubStmt.isInvalid()) 6922 return StmtError(); 6923 6924 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6925 return S; 6926 6927 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6928 SubStmt.get()); 6929 } 6930 6931 template<typename Derived> 6932 StmtResult 6933 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6934 // Transform the initialization statement 6935 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6936 if (Init.isInvalid()) 6937 return StmtError(); 6938 6939 // Transform the condition 6940 Sema::ConditionResult Cond = getDerived().TransformCondition( 6941 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6942 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6943 : Sema::ConditionKind::Boolean); 6944 if (Cond.isInvalid()) 6945 return StmtError(); 6946 6947 // If this is a constexpr if, determine which arm we should instantiate. 6948 llvm::Optional<bool> ConstexprConditionValue; 6949 if (S->isConstexpr()) 6950 ConstexprConditionValue = Cond.getKnownValue(); 6951 6952 // Transform the "then" branch. 6953 StmtResult Then; 6954 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6955 Then = getDerived().TransformStmt(S->getThen()); 6956 if (Then.isInvalid()) 6957 return StmtError(); 6958 } else { 6959 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 6960 } 6961 6962 // Transform the "else" branch. 6963 StmtResult Else; 6964 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6965 Else = getDerived().TransformStmt(S->getElse()); 6966 if (Else.isInvalid()) 6967 return StmtError(); 6968 } 6969 6970 if (!getDerived().AlwaysRebuild() && 6971 Init.get() == S->getInit() && 6972 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6973 Then.get() == S->getThen() && 6974 Else.get() == S->getElse()) 6975 return S; 6976 6977 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6978 Init.get(), Then.get(), S->getElseLoc(), 6979 Else.get()); 6980 } 6981 6982 template<typename Derived> 6983 StmtResult 6984 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6985 // Transform the initialization statement 6986 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6987 if (Init.isInvalid()) 6988 return StmtError(); 6989 6990 // Transform the condition. 6991 Sema::ConditionResult Cond = getDerived().TransformCondition( 6992 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6993 Sema::ConditionKind::Switch); 6994 if (Cond.isInvalid()) 6995 return StmtError(); 6996 6997 // Rebuild the switch statement. 6998 StmtResult Switch 6999 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 7000 if (Switch.isInvalid()) 7001 return StmtError(); 7002 7003 // Transform the body of the switch statement. 7004 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7005 if (Body.isInvalid()) 7006 return StmtError(); 7007 7008 // Complete the switch statement. 7009 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7010 Body.get()); 7011 } 7012 7013 template<typename Derived> 7014 StmtResult 7015 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7016 // Transform the condition 7017 Sema::ConditionResult Cond = getDerived().TransformCondition( 7018 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7019 Sema::ConditionKind::Boolean); 7020 if (Cond.isInvalid()) 7021 return StmtError(); 7022 7023 // Transform the body 7024 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7025 if (Body.isInvalid()) 7026 return StmtError(); 7027 7028 if (!getDerived().AlwaysRebuild() && 7029 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7030 Body.get() == S->getBody()) 7031 return Owned(S); 7032 7033 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 7034 } 7035 7036 template<typename Derived> 7037 StmtResult 7038 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7039 // Transform the body 7040 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7041 if (Body.isInvalid()) 7042 return StmtError(); 7043 7044 // Transform the condition 7045 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7046 if (Cond.isInvalid()) 7047 return StmtError(); 7048 7049 if (!getDerived().AlwaysRebuild() && 7050 Cond.get() == S->getCond() && 7051 Body.get() == S->getBody()) 7052 return S; 7053 7054 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7055 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7056 S->getRParenLoc()); 7057 } 7058 7059 template<typename Derived> 7060 StmtResult 7061 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7062 if (getSema().getLangOpts().OpenMP) 7063 getSema().startOpenMPLoop(); 7064 7065 // Transform the initialization statement 7066 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7067 if (Init.isInvalid()) 7068 return StmtError(); 7069 7070 // In OpenMP loop region loop control variable must be captured and be 7071 // private. Perform analysis of first part (if any). 7072 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7073 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7074 7075 // Transform the condition 7076 Sema::ConditionResult Cond = getDerived().TransformCondition( 7077 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7078 Sema::ConditionKind::Boolean); 7079 if (Cond.isInvalid()) 7080 return StmtError(); 7081 7082 // Transform the increment 7083 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7084 if (Inc.isInvalid()) 7085 return StmtError(); 7086 7087 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7088 if (S->getInc() && !FullInc.get()) 7089 return StmtError(); 7090 7091 // Transform the body 7092 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7093 if (Body.isInvalid()) 7094 return StmtError(); 7095 7096 if (!getDerived().AlwaysRebuild() && 7097 Init.get() == S->getInit() && 7098 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7099 Inc.get() == S->getInc() && 7100 Body.get() == S->getBody()) 7101 return S; 7102 7103 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7104 Init.get(), Cond, FullInc, 7105 S->getRParenLoc(), Body.get()); 7106 } 7107 7108 template<typename Derived> 7109 StmtResult 7110 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7111 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7112 S->getLabel()); 7113 if (!LD) 7114 return StmtError(); 7115 7116 // Goto statements must always be rebuilt, to resolve the label. 7117 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7118 cast<LabelDecl>(LD)); 7119 } 7120 7121 template<typename Derived> 7122 StmtResult 7123 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7124 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7125 if (Target.isInvalid()) 7126 return StmtError(); 7127 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7128 7129 if (!getDerived().AlwaysRebuild() && 7130 Target.get() == S->getTarget()) 7131 return S; 7132 7133 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7134 Target.get()); 7135 } 7136 7137 template<typename Derived> 7138 StmtResult 7139 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7140 return S; 7141 } 7142 7143 template<typename Derived> 7144 StmtResult 7145 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7146 return S; 7147 } 7148 7149 template<typename Derived> 7150 StmtResult 7151 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7152 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7153 /*NotCopyInit*/false); 7154 if (Result.isInvalid()) 7155 return StmtError(); 7156 7157 // FIXME: We always rebuild the return statement because there is no way 7158 // to tell whether the return type of the function has changed. 7159 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7160 } 7161 7162 template<typename Derived> 7163 StmtResult 7164 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7165 bool DeclChanged = false; 7166 SmallVector<Decl *, 4> Decls; 7167 for (auto *D : S->decls()) { 7168 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7169 if (!Transformed) 7170 return StmtError(); 7171 7172 if (Transformed != D) 7173 DeclChanged = true; 7174 7175 Decls.push_back(Transformed); 7176 } 7177 7178 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7179 return S; 7180 7181 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7182 } 7183 7184 template<typename Derived> 7185 StmtResult 7186 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7187 7188 SmallVector<Expr*, 8> Constraints; 7189 SmallVector<Expr*, 8> Exprs; 7190 SmallVector<IdentifierInfo *, 4> Names; 7191 7192 ExprResult AsmString; 7193 SmallVector<Expr*, 8> Clobbers; 7194 7195 bool ExprsChanged = false; 7196 7197 // Go through the outputs. 7198 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7199 Names.push_back(S->getOutputIdentifier(I)); 7200 7201 // No need to transform the constraint literal. 7202 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7203 7204 // Transform the output expr. 7205 Expr *OutputExpr = S->getOutputExpr(I); 7206 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7207 if (Result.isInvalid()) 7208 return StmtError(); 7209 7210 ExprsChanged |= Result.get() != OutputExpr; 7211 7212 Exprs.push_back(Result.get()); 7213 } 7214 7215 // Go through the inputs. 7216 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7217 Names.push_back(S->getInputIdentifier(I)); 7218 7219 // No need to transform the constraint literal. 7220 Constraints.push_back(S->getInputConstraintLiteral(I)); 7221 7222 // Transform the input expr. 7223 Expr *InputExpr = S->getInputExpr(I); 7224 ExprResult Result = getDerived().TransformExpr(InputExpr); 7225 if (Result.isInvalid()) 7226 return StmtError(); 7227 7228 ExprsChanged |= Result.get() != InputExpr; 7229 7230 Exprs.push_back(Result.get()); 7231 } 7232 7233 // Go through the Labels. 7234 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7235 Names.push_back(S->getLabelIdentifier(I)); 7236 7237 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7238 if (Result.isInvalid()) 7239 return StmtError(); 7240 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7241 Exprs.push_back(Result.get()); 7242 } 7243 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7244 return S; 7245 7246 // Go through the clobbers. 7247 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7248 Clobbers.push_back(S->getClobberStringLiteral(I)); 7249 7250 // No need to transform the asm string literal. 7251 AsmString = S->getAsmString(); 7252 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7253 S->isVolatile(), S->getNumOutputs(), 7254 S->getNumInputs(), Names.data(), 7255 Constraints, Exprs, AsmString.get(), 7256 Clobbers, S->getNumLabels(), 7257 S->getRParenLoc()); 7258 } 7259 7260 template<typename Derived> 7261 StmtResult 7262 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7263 ArrayRef<Token> AsmToks = 7264 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7265 7266 bool HadError = false, HadChange = false; 7267 7268 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7269 SmallVector<Expr*, 8> TransformedExprs; 7270 TransformedExprs.reserve(SrcExprs.size()); 7271 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7272 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7273 if (!Result.isUsable()) { 7274 HadError = true; 7275 } else { 7276 HadChange |= (Result.get() != SrcExprs[i]); 7277 TransformedExprs.push_back(Result.get()); 7278 } 7279 } 7280 7281 if (HadError) return StmtError(); 7282 if (!HadChange && !getDerived().AlwaysRebuild()) 7283 return Owned(S); 7284 7285 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7286 AsmToks, S->getAsmString(), 7287 S->getNumOutputs(), S->getNumInputs(), 7288 S->getAllConstraints(), S->getClobbers(), 7289 TransformedExprs, S->getEndLoc()); 7290 } 7291 7292 // C++ Coroutines TS 7293 7294 template<typename Derived> 7295 StmtResult 7296 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7297 auto *ScopeInfo = SemaRef.getCurFunction(); 7298 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7299 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7300 ScopeInfo->NeedsCoroutineSuspends && 7301 ScopeInfo->CoroutineSuspends.first == nullptr && 7302 ScopeInfo->CoroutineSuspends.second == nullptr && 7303 "expected clean scope info"); 7304 7305 // Set that we have (possibly-invalid) suspend points before we do anything 7306 // that may fail. 7307 ScopeInfo->setNeedsCoroutineSuspends(false); 7308 7309 // We re-build the coroutine promise object (and the coroutine parameters its 7310 // type and constructor depend on) based on the types used in our current 7311 // function. We must do so, and set it on the current FunctionScopeInfo, 7312 // before attempting to transform the other parts of the coroutine body 7313 // statement, such as the implicit suspend statements (because those 7314 // statements reference the FunctionScopeInfo::CoroutinePromise). 7315 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7316 return StmtError(); 7317 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7318 if (!Promise) 7319 return StmtError(); 7320 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7321 ScopeInfo->CoroutinePromise = Promise; 7322 7323 // Transform the implicit coroutine statements constructed using dependent 7324 // types during the previous parse: initial and final suspensions, the return 7325 // object, and others. We also transform the coroutine function's body. 7326 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7327 if (InitSuspend.isInvalid()) 7328 return StmtError(); 7329 StmtResult FinalSuspend = 7330 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7331 if (FinalSuspend.isInvalid()) 7332 return StmtError(); 7333 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7334 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7335 7336 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7337 if (BodyRes.isInvalid()) 7338 return StmtError(); 7339 7340 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7341 if (Builder.isInvalid()) 7342 return StmtError(); 7343 7344 Expr *ReturnObject = S->getReturnValueInit(); 7345 assert(ReturnObject && "the return object is expected to be valid"); 7346 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7347 /*NoCopyInit*/ false); 7348 if (Res.isInvalid()) 7349 return StmtError(); 7350 Builder.ReturnValue = Res.get(); 7351 7352 // If during the previous parse the coroutine still had a dependent promise 7353 // statement, we may need to build some implicit coroutine statements 7354 // (such as exception and fallthrough handlers) for the first time. 7355 if (S->hasDependentPromiseType()) { 7356 // We can only build these statements, however, if the current promise type 7357 // is not dependent. 7358 if (!Promise->getType()->isDependentType()) { 7359 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7360 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7361 "these nodes should not have been built yet"); 7362 if (!Builder.buildDependentStatements()) 7363 return StmtError(); 7364 } 7365 } else { 7366 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7367 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7368 if (Res.isInvalid()) 7369 return StmtError(); 7370 Builder.OnFallthrough = Res.get(); 7371 } 7372 7373 if (auto *OnException = S->getExceptionHandler()) { 7374 StmtResult Res = getDerived().TransformStmt(OnException); 7375 if (Res.isInvalid()) 7376 return StmtError(); 7377 Builder.OnException = Res.get(); 7378 } 7379 7380 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7381 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7382 if (Res.isInvalid()) 7383 return StmtError(); 7384 Builder.ReturnStmtOnAllocFailure = Res.get(); 7385 } 7386 7387 // Transform any additional statements we may have already built 7388 assert(S->getAllocate() && S->getDeallocate() && 7389 "allocation and deallocation calls must already be built"); 7390 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7391 if (AllocRes.isInvalid()) 7392 return StmtError(); 7393 Builder.Allocate = AllocRes.get(); 7394 7395 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7396 if (DeallocRes.isInvalid()) 7397 return StmtError(); 7398 Builder.Deallocate = DeallocRes.get(); 7399 7400 assert(S->getResultDecl() && "ResultDecl must already be built"); 7401 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7402 if (ResultDecl.isInvalid()) 7403 return StmtError(); 7404 Builder.ResultDecl = ResultDecl.get(); 7405 7406 if (auto *ReturnStmt = S->getReturnStmt()) { 7407 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7408 if (Res.isInvalid()) 7409 return StmtError(); 7410 Builder.ReturnStmt = Res.get(); 7411 } 7412 } 7413 7414 return getDerived().RebuildCoroutineBodyStmt(Builder); 7415 } 7416 7417 template<typename Derived> 7418 StmtResult 7419 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7420 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7421 /*NotCopyInit*/false); 7422 if (Result.isInvalid()) 7423 return StmtError(); 7424 7425 // Always rebuild; we don't know if this needs to be injected into a new 7426 // context or if the promise type has changed. 7427 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7428 S->isImplicit()); 7429 } 7430 7431 template<typename Derived> 7432 ExprResult 7433 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7434 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7435 /*NotCopyInit*/false); 7436 if (Result.isInvalid()) 7437 return ExprError(); 7438 7439 // Always rebuild; we don't know if this needs to be injected into a new 7440 // context or if the promise type has changed. 7441 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7442 E->isImplicit()); 7443 } 7444 7445 template <typename Derived> 7446 ExprResult 7447 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7448 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7449 /*NotCopyInit*/ false); 7450 if (OperandResult.isInvalid()) 7451 return ExprError(); 7452 7453 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7454 E->getOperatorCoawaitLookup()); 7455 7456 if (LookupResult.isInvalid()) 7457 return ExprError(); 7458 7459 // Always rebuild; we don't know if this needs to be injected into a new 7460 // context or if the promise type has changed. 7461 return getDerived().RebuildDependentCoawaitExpr( 7462 E->getKeywordLoc(), OperandResult.get(), 7463 cast<UnresolvedLookupExpr>(LookupResult.get())); 7464 } 7465 7466 template<typename Derived> 7467 ExprResult 7468 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7469 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7470 /*NotCopyInit*/false); 7471 if (Result.isInvalid()) 7472 return ExprError(); 7473 7474 // Always rebuild; we don't know if this needs to be injected into a new 7475 // context or if the promise type has changed. 7476 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7477 } 7478 7479 // Objective-C Statements. 7480 7481 template<typename Derived> 7482 StmtResult 7483 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7484 // Transform the body of the @try. 7485 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7486 if (TryBody.isInvalid()) 7487 return StmtError(); 7488 7489 // Transform the @catch statements (if present). 7490 bool AnyCatchChanged = false; 7491 SmallVector<Stmt*, 8> CatchStmts; 7492 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7493 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7494 if (Catch.isInvalid()) 7495 return StmtError(); 7496 if (Catch.get() != S->getCatchStmt(I)) 7497 AnyCatchChanged = true; 7498 CatchStmts.push_back(Catch.get()); 7499 } 7500 7501 // Transform the @finally statement (if present). 7502 StmtResult Finally; 7503 if (S->getFinallyStmt()) { 7504 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7505 if (Finally.isInvalid()) 7506 return StmtError(); 7507 } 7508 7509 // If nothing changed, just retain this statement. 7510 if (!getDerived().AlwaysRebuild() && 7511 TryBody.get() == S->getTryBody() && 7512 !AnyCatchChanged && 7513 Finally.get() == S->getFinallyStmt()) 7514 return S; 7515 7516 // Build a new statement. 7517 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7518 CatchStmts, Finally.get()); 7519 } 7520 7521 template<typename Derived> 7522 StmtResult 7523 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7524 // Transform the @catch parameter, if there is one. 7525 VarDecl *Var = nullptr; 7526 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7527 TypeSourceInfo *TSInfo = nullptr; 7528 if (FromVar->getTypeSourceInfo()) { 7529 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7530 if (!TSInfo) 7531 return StmtError(); 7532 } 7533 7534 QualType T; 7535 if (TSInfo) 7536 T = TSInfo->getType(); 7537 else { 7538 T = getDerived().TransformType(FromVar->getType()); 7539 if (T.isNull()) 7540 return StmtError(); 7541 } 7542 7543 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7544 if (!Var) 7545 return StmtError(); 7546 } 7547 7548 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7549 if (Body.isInvalid()) 7550 return StmtError(); 7551 7552 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7553 S->getRParenLoc(), 7554 Var, Body.get()); 7555 } 7556 7557 template<typename Derived> 7558 StmtResult 7559 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7560 // Transform the body. 7561 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7562 if (Body.isInvalid()) 7563 return StmtError(); 7564 7565 // If nothing changed, just retain this statement. 7566 if (!getDerived().AlwaysRebuild() && 7567 Body.get() == S->getFinallyBody()) 7568 return S; 7569 7570 // Build a new statement. 7571 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7572 Body.get()); 7573 } 7574 7575 template<typename Derived> 7576 StmtResult 7577 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7578 ExprResult Operand; 7579 if (S->getThrowExpr()) { 7580 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7581 if (Operand.isInvalid()) 7582 return StmtError(); 7583 } 7584 7585 if (!getDerived().AlwaysRebuild() && 7586 Operand.get() == S->getThrowExpr()) 7587 return S; 7588 7589 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7590 } 7591 7592 template<typename Derived> 7593 StmtResult 7594 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7595 ObjCAtSynchronizedStmt *S) { 7596 // Transform the object we are locking. 7597 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7598 if (Object.isInvalid()) 7599 return StmtError(); 7600 Object = 7601 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7602 Object.get()); 7603 if (Object.isInvalid()) 7604 return StmtError(); 7605 7606 // Transform the body. 7607 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7608 if (Body.isInvalid()) 7609 return StmtError(); 7610 7611 // If nothing change, just retain the current statement. 7612 if (!getDerived().AlwaysRebuild() && 7613 Object.get() == S->getSynchExpr() && 7614 Body.get() == S->getSynchBody()) 7615 return S; 7616 7617 // Build a new statement. 7618 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7619 Object.get(), Body.get()); 7620 } 7621 7622 template<typename Derived> 7623 StmtResult 7624 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7625 ObjCAutoreleasePoolStmt *S) { 7626 // Transform the body. 7627 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7628 if (Body.isInvalid()) 7629 return StmtError(); 7630 7631 // If nothing changed, just retain this statement. 7632 if (!getDerived().AlwaysRebuild() && 7633 Body.get() == S->getSubStmt()) 7634 return S; 7635 7636 // Build a new statement. 7637 return getDerived().RebuildObjCAutoreleasePoolStmt( 7638 S->getAtLoc(), Body.get()); 7639 } 7640 7641 template<typename Derived> 7642 StmtResult 7643 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7644 ObjCForCollectionStmt *S) { 7645 // Transform the element statement. 7646 StmtResult Element = 7647 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7648 if (Element.isInvalid()) 7649 return StmtError(); 7650 7651 // Transform the collection expression. 7652 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7653 if (Collection.isInvalid()) 7654 return StmtError(); 7655 7656 // Transform the body. 7657 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7658 if (Body.isInvalid()) 7659 return StmtError(); 7660 7661 // If nothing changed, just retain this statement. 7662 if (!getDerived().AlwaysRebuild() && 7663 Element.get() == S->getElement() && 7664 Collection.get() == S->getCollection() && 7665 Body.get() == S->getBody()) 7666 return S; 7667 7668 // Build a new statement. 7669 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7670 Element.get(), 7671 Collection.get(), 7672 S->getRParenLoc(), 7673 Body.get()); 7674 } 7675 7676 template <typename Derived> 7677 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7678 // Transform the exception declaration, if any. 7679 VarDecl *Var = nullptr; 7680 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7681 TypeSourceInfo *T = 7682 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7683 if (!T) 7684 return StmtError(); 7685 7686 Var = getDerived().RebuildExceptionDecl( 7687 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7688 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7689 if (!Var || Var->isInvalidDecl()) 7690 return StmtError(); 7691 } 7692 7693 // Transform the actual exception handler. 7694 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7695 if (Handler.isInvalid()) 7696 return StmtError(); 7697 7698 if (!getDerived().AlwaysRebuild() && !Var && 7699 Handler.get() == S->getHandlerBlock()) 7700 return S; 7701 7702 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7703 } 7704 7705 template <typename Derived> 7706 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7707 // Transform the try block itself. 7708 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7709 if (TryBlock.isInvalid()) 7710 return StmtError(); 7711 7712 // Transform the handlers. 7713 bool HandlerChanged = false; 7714 SmallVector<Stmt *, 8> Handlers; 7715 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7716 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7717 if (Handler.isInvalid()) 7718 return StmtError(); 7719 7720 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7721 Handlers.push_back(Handler.getAs<Stmt>()); 7722 } 7723 7724 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7725 !HandlerChanged) 7726 return S; 7727 7728 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7729 Handlers); 7730 } 7731 7732 template<typename Derived> 7733 StmtResult 7734 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7735 StmtResult Init = 7736 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7737 if (Init.isInvalid()) 7738 return StmtError(); 7739 7740 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7741 if (Range.isInvalid()) 7742 return StmtError(); 7743 7744 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7745 if (Begin.isInvalid()) 7746 return StmtError(); 7747 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7748 if (End.isInvalid()) 7749 return StmtError(); 7750 7751 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7752 if (Cond.isInvalid()) 7753 return StmtError(); 7754 if (Cond.get()) 7755 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7756 if (Cond.isInvalid()) 7757 return StmtError(); 7758 if (Cond.get()) 7759 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7760 7761 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7762 if (Inc.isInvalid()) 7763 return StmtError(); 7764 if (Inc.get()) 7765 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7766 7767 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7768 if (LoopVar.isInvalid()) 7769 return StmtError(); 7770 7771 StmtResult NewStmt = S; 7772 if (getDerived().AlwaysRebuild() || 7773 Init.get() != S->getInit() || 7774 Range.get() != S->getRangeStmt() || 7775 Begin.get() != S->getBeginStmt() || 7776 End.get() != S->getEndStmt() || 7777 Cond.get() != S->getCond() || 7778 Inc.get() != S->getInc() || 7779 LoopVar.get() != S->getLoopVarStmt()) { 7780 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7781 S->getCoawaitLoc(), Init.get(), 7782 S->getColonLoc(), Range.get(), 7783 Begin.get(), End.get(), 7784 Cond.get(), 7785 Inc.get(), LoopVar.get(), 7786 S->getRParenLoc()); 7787 if (NewStmt.isInvalid()) 7788 return StmtError(); 7789 } 7790 7791 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7792 if (Body.isInvalid()) 7793 return StmtError(); 7794 7795 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7796 // it now so we have a new statement to attach the body to. 7797 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7798 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7799 S->getCoawaitLoc(), Init.get(), 7800 S->getColonLoc(), Range.get(), 7801 Begin.get(), End.get(), 7802 Cond.get(), 7803 Inc.get(), LoopVar.get(), 7804 S->getRParenLoc()); 7805 if (NewStmt.isInvalid()) 7806 return StmtError(); 7807 } 7808 7809 if (NewStmt.get() == S) 7810 return S; 7811 7812 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7813 } 7814 7815 template<typename Derived> 7816 StmtResult 7817 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7818 MSDependentExistsStmt *S) { 7819 // Transform the nested-name-specifier, if any. 7820 NestedNameSpecifierLoc QualifierLoc; 7821 if (S->getQualifierLoc()) { 7822 QualifierLoc 7823 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7824 if (!QualifierLoc) 7825 return StmtError(); 7826 } 7827 7828 // Transform the declaration name. 7829 DeclarationNameInfo NameInfo = S->getNameInfo(); 7830 if (NameInfo.getName()) { 7831 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7832 if (!NameInfo.getName()) 7833 return StmtError(); 7834 } 7835 7836 // Check whether anything changed. 7837 if (!getDerived().AlwaysRebuild() && 7838 QualifierLoc == S->getQualifierLoc() && 7839 NameInfo.getName() == S->getNameInfo().getName()) 7840 return S; 7841 7842 // Determine whether this name exists, if we can. 7843 CXXScopeSpec SS; 7844 SS.Adopt(QualifierLoc); 7845 bool Dependent = false; 7846 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7847 case Sema::IER_Exists: 7848 if (S->isIfExists()) 7849 break; 7850 7851 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7852 7853 case Sema::IER_DoesNotExist: 7854 if (S->isIfNotExists()) 7855 break; 7856 7857 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7858 7859 case Sema::IER_Dependent: 7860 Dependent = true; 7861 break; 7862 7863 case Sema::IER_Error: 7864 return StmtError(); 7865 } 7866 7867 // We need to continue with the instantiation, so do so now. 7868 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7869 if (SubStmt.isInvalid()) 7870 return StmtError(); 7871 7872 // If we have resolved the name, just transform to the substatement. 7873 if (!Dependent) 7874 return SubStmt; 7875 7876 // The name is still dependent, so build a dependent expression again. 7877 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7878 S->isIfExists(), 7879 QualifierLoc, 7880 NameInfo, 7881 SubStmt.get()); 7882 } 7883 7884 template<typename Derived> 7885 ExprResult 7886 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7887 NestedNameSpecifierLoc QualifierLoc; 7888 if (E->getQualifierLoc()) { 7889 QualifierLoc 7890 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7891 if (!QualifierLoc) 7892 return ExprError(); 7893 } 7894 7895 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7896 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7897 if (!PD) 7898 return ExprError(); 7899 7900 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7901 if (Base.isInvalid()) 7902 return ExprError(); 7903 7904 return new (SemaRef.getASTContext()) 7905 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7906 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7907 QualifierLoc, E->getMemberLoc()); 7908 } 7909 7910 template <typename Derived> 7911 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7912 MSPropertySubscriptExpr *E) { 7913 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7914 if (BaseRes.isInvalid()) 7915 return ExprError(); 7916 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7917 if (IdxRes.isInvalid()) 7918 return ExprError(); 7919 7920 if (!getDerived().AlwaysRebuild() && 7921 BaseRes.get() == E->getBase() && 7922 IdxRes.get() == E->getIdx()) 7923 return E; 7924 7925 return getDerived().RebuildArraySubscriptExpr( 7926 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7927 } 7928 7929 template <typename Derived> 7930 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7931 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7932 if (TryBlock.isInvalid()) 7933 return StmtError(); 7934 7935 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7936 if (Handler.isInvalid()) 7937 return StmtError(); 7938 7939 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7940 Handler.get() == S->getHandler()) 7941 return S; 7942 7943 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7944 TryBlock.get(), Handler.get()); 7945 } 7946 7947 template <typename Derived> 7948 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7949 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7950 if (Block.isInvalid()) 7951 return StmtError(); 7952 7953 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7954 } 7955 7956 template <typename Derived> 7957 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7958 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7959 if (FilterExpr.isInvalid()) 7960 return StmtError(); 7961 7962 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7963 if (Block.isInvalid()) 7964 return StmtError(); 7965 7966 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7967 Block.get()); 7968 } 7969 7970 template <typename Derived> 7971 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7972 if (isa<SEHFinallyStmt>(Handler)) 7973 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7974 else 7975 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7976 } 7977 7978 template<typename Derived> 7979 StmtResult 7980 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7981 return S; 7982 } 7983 7984 //===----------------------------------------------------------------------===// 7985 // OpenMP directive transformation 7986 //===----------------------------------------------------------------------===// 7987 template <typename Derived> 7988 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7989 OMPExecutableDirective *D) { 7990 7991 // Transform the clauses 7992 llvm::SmallVector<OMPClause *, 16> TClauses; 7993 ArrayRef<OMPClause *> Clauses = D->clauses(); 7994 TClauses.reserve(Clauses.size()); 7995 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7996 I != E; ++I) { 7997 if (*I) { 7998 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7999 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8000 getDerived().getSema().EndOpenMPClause(); 8001 if (Clause) 8002 TClauses.push_back(Clause); 8003 } else { 8004 TClauses.push_back(nullptr); 8005 } 8006 } 8007 StmtResult AssociatedStmt; 8008 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8009 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8010 /*CurScope=*/nullptr); 8011 StmtResult Body; 8012 { 8013 Sema::CompoundScopeRAII CompoundScope(getSema()); 8014 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8015 Body = getDerived().TransformStmt(CS); 8016 } 8017 AssociatedStmt = 8018 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8019 if (AssociatedStmt.isInvalid()) { 8020 return StmtError(); 8021 } 8022 } 8023 if (TClauses.size() != Clauses.size()) { 8024 return StmtError(); 8025 } 8026 8027 // Transform directive name for 'omp critical' directive. 8028 DeclarationNameInfo DirName; 8029 if (D->getDirectiveKind() == OMPD_critical) { 8030 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8031 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8032 } 8033 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8034 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8035 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8036 } else if (D->getDirectiveKind() == OMPD_cancel) { 8037 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8038 } 8039 8040 return getDerived().RebuildOMPExecutableDirective( 8041 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8042 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8043 } 8044 8045 template <typename Derived> 8046 StmtResult 8047 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8048 DeclarationNameInfo DirName; 8049 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8050 D->getBeginLoc()); 8051 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8052 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8053 return Res; 8054 } 8055 8056 template <typename Derived> 8057 StmtResult 8058 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8059 DeclarationNameInfo DirName; 8060 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8061 D->getBeginLoc()); 8062 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8063 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8064 return Res; 8065 } 8066 8067 template <typename Derived> 8068 StmtResult 8069 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8070 DeclarationNameInfo DirName; 8071 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8072 D->getBeginLoc()); 8073 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8074 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8075 return Res; 8076 } 8077 8078 template <typename Derived> 8079 StmtResult 8080 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8081 DeclarationNameInfo DirName; 8082 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8083 D->getBeginLoc()); 8084 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8085 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8086 return Res; 8087 } 8088 8089 template <typename Derived> 8090 StmtResult 8091 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8092 DeclarationNameInfo DirName; 8093 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8094 D->getBeginLoc()); 8095 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8096 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8097 return Res; 8098 } 8099 8100 template <typename Derived> 8101 StmtResult 8102 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8103 DeclarationNameInfo DirName; 8104 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8105 D->getBeginLoc()); 8106 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8107 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8108 return Res; 8109 } 8110 8111 template <typename Derived> 8112 StmtResult 8113 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8114 DeclarationNameInfo DirName; 8115 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8116 D->getBeginLoc()); 8117 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8118 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8119 return Res; 8120 } 8121 8122 template <typename Derived> 8123 StmtResult 8124 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8125 DeclarationNameInfo DirName; 8126 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8127 D->getBeginLoc()); 8128 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8129 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8130 return Res; 8131 } 8132 8133 template <typename Derived> 8134 StmtResult 8135 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8136 getDerived().getSema().StartOpenMPDSABlock( 8137 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8138 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8139 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8140 return Res; 8141 } 8142 8143 template <typename Derived> 8144 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8145 OMPParallelForDirective *D) { 8146 DeclarationNameInfo DirName; 8147 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8148 nullptr, D->getBeginLoc()); 8149 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8150 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8151 return Res; 8152 } 8153 8154 template <typename Derived> 8155 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8156 OMPParallelForSimdDirective *D) { 8157 DeclarationNameInfo DirName; 8158 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8159 nullptr, D->getBeginLoc()); 8160 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8161 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8162 return Res; 8163 } 8164 8165 template <typename Derived> 8166 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8167 OMPParallelMasterDirective *D) { 8168 DeclarationNameInfo DirName; 8169 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8170 nullptr, D->getBeginLoc()); 8171 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8172 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8173 return Res; 8174 } 8175 8176 template <typename Derived> 8177 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8178 OMPParallelSectionsDirective *D) { 8179 DeclarationNameInfo DirName; 8180 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8181 nullptr, D->getBeginLoc()); 8182 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8183 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8184 return Res; 8185 } 8186 8187 template <typename Derived> 8188 StmtResult 8189 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8190 DeclarationNameInfo DirName; 8191 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8192 D->getBeginLoc()); 8193 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8194 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8195 return Res; 8196 } 8197 8198 template <typename Derived> 8199 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8200 OMPTaskyieldDirective *D) { 8201 DeclarationNameInfo DirName; 8202 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8203 D->getBeginLoc()); 8204 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8205 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8206 return Res; 8207 } 8208 8209 template <typename Derived> 8210 StmtResult 8211 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8212 DeclarationNameInfo DirName; 8213 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8214 D->getBeginLoc()); 8215 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8216 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8217 return Res; 8218 } 8219 8220 template <typename Derived> 8221 StmtResult 8222 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8223 DeclarationNameInfo DirName; 8224 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8225 D->getBeginLoc()); 8226 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8227 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8228 return Res; 8229 } 8230 8231 template <typename Derived> 8232 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8233 OMPTaskgroupDirective *D) { 8234 DeclarationNameInfo DirName; 8235 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8236 D->getBeginLoc()); 8237 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8239 return Res; 8240 } 8241 8242 template <typename Derived> 8243 StmtResult 8244 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8245 DeclarationNameInfo DirName; 8246 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8247 D->getBeginLoc()); 8248 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8249 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8250 return Res; 8251 } 8252 8253 template <typename Derived> 8254 StmtResult 8255 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8256 DeclarationNameInfo DirName; 8257 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8258 D->getBeginLoc()); 8259 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8260 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8261 return Res; 8262 } 8263 8264 template <typename Derived> 8265 StmtResult 8266 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8267 DeclarationNameInfo DirName; 8268 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8269 D->getBeginLoc()); 8270 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8271 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8272 return Res; 8273 } 8274 8275 template <typename Derived> 8276 StmtResult 8277 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8278 DeclarationNameInfo DirName; 8279 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8280 D->getBeginLoc()); 8281 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8282 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8283 return Res; 8284 } 8285 8286 template <typename Derived> 8287 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8288 OMPTargetDataDirective *D) { 8289 DeclarationNameInfo DirName; 8290 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8291 D->getBeginLoc()); 8292 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8293 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8294 return Res; 8295 } 8296 8297 template <typename Derived> 8298 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8299 OMPTargetEnterDataDirective *D) { 8300 DeclarationNameInfo DirName; 8301 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8302 nullptr, D->getBeginLoc()); 8303 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8304 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8305 return Res; 8306 } 8307 8308 template <typename Derived> 8309 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8310 OMPTargetExitDataDirective *D) { 8311 DeclarationNameInfo DirName; 8312 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8313 nullptr, D->getBeginLoc()); 8314 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8315 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8316 return Res; 8317 } 8318 8319 template <typename Derived> 8320 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8321 OMPTargetParallelDirective *D) { 8322 DeclarationNameInfo DirName; 8323 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8324 nullptr, D->getBeginLoc()); 8325 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8326 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8327 return Res; 8328 } 8329 8330 template <typename Derived> 8331 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8332 OMPTargetParallelForDirective *D) { 8333 DeclarationNameInfo DirName; 8334 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8335 nullptr, D->getBeginLoc()); 8336 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8337 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8338 return Res; 8339 } 8340 8341 template <typename Derived> 8342 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8343 OMPTargetUpdateDirective *D) { 8344 DeclarationNameInfo DirName; 8345 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8346 nullptr, D->getBeginLoc()); 8347 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8348 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8349 return Res; 8350 } 8351 8352 template <typename Derived> 8353 StmtResult 8354 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8355 DeclarationNameInfo DirName; 8356 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8357 D->getBeginLoc()); 8358 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8359 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8360 return Res; 8361 } 8362 8363 template <typename Derived> 8364 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8365 OMPCancellationPointDirective *D) { 8366 DeclarationNameInfo DirName; 8367 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8368 nullptr, D->getBeginLoc()); 8369 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8370 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8371 return Res; 8372 } 8373 8374 template <typename Derived> 8375 StmtResult 8376 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8377 DeclarationNameInfo DirName; 8378 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8379 D->getBeginLoc()); 8380 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8381 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8382 return Res; 8383 } 8384 8385 template <typename Derived> 8386 StmtResult 8387 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8388 DeclarationNameInfo DirName; 8389 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8390 D->getBeginLoc()); 8391 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8392 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8393 return Res; 8394 } 8395 8396 template <typename Derived> 8397 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8398 OMPTaskLoopSimdDirective *D) { 8399 DeclarationNameInfo DirName; 8400 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8401 nullptr, D->getBeginLoc()); 8402 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8403 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8404 return Res; 8405 } 8406 8407 template <typename Derived> 8408 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8409 OMPMasterTaskLoopDirective *D) { 8410 DeclarationNameInfo DirName; 8411 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8412 nullptr, D->getBeginLoc()); 8413 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8414 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8415 return Res; 8416 } 8417 8418 template <typename Derived> 8419 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8420 OMPMasterTaskLoopSimdDirective *D) { 8421 DeclarationNameInfo DirName; 8422 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8423 nullptr, D->getBeginLoc()); 8424 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8425 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8426 return Res; 8427 } 8428 8429 template <typename Derived> 8430 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8431 OMPParallelMasterTaskLoopDirective *D) { 8432 DeclarationNameInfo DirName; 8433 getDerived().getSema().StartOpenMPDSABlock( 8434 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8435 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8436 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8437 return Res; 8438 } 8439 8440 template <typename Derived> 8441 StmtResult 8442 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8443 OMPParallelMasterTaskLoopSimdDirective *D) { 8444 DeclarationNameInfo DirName; 8445 getDerived().getSema().StartOpenMPDSABlock( 8446 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8447 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8448 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8449 return Res; 8450 } 8451 8452 template <typename Derived> 8453 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8454 OMPDistributeDirective *D) { 8455 DeclarationNameInfo DirName; 8456 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8457 D->getBeginLoc()); 8458 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8459 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8460 return Res; 8461 } 8462 8463 template <typename Derived> 8464 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8465 OMPDistributeParallelForDirective *D) { 8466 DeclarationNameInfo DirName; 8467 getDerived().getSema().StartOpenMPDSABlock( 8468 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8469 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8470 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8471 return Res; 8472 } 8473 8474 template <typename Derived> 8475 StmtResult 8476 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8477 OMPDistributeParallelForSimdDirective *D) { 8478 DeclarationNameInfo DirName; 8479 getDerived().getSema().StartOpenMPDSABlock( 8480 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8481 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8482 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8483 return Res; 8484 } 8485 8486 template <typename Derived> 8487 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8488 OMPDistributeSimdDirective *D) { 8489 DeclarationNameInfo DirName; 8490 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8491 nullptr, D->getBeginLoc()); 8492 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8493 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8494 return Res; 8495 } 8496 8497 template <typename Derived> 8498 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8499 OMPTargetParallelForSimdDirective *D) { 8500 DeclarationNameInfo DirName; 8501 getDerived().getSema().StartOpenMPDSABlock( 8502 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8503 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8504 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8505 return Res; 8506 } 8507 8508 template <typename Derived> 8509 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8510 OMPTargetSimdDirective *D) { 8511 DeclarationNameInfo DirName; 8512 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8513 D->getBeginLoc()); 8514 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8515 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8516 return Res; 8517 } 8518 8519 template <typename Derived> 8520 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8521 OMPTeamsDistributeDirective *D) { 8522 DeclarationNameInfo DirName; 8523 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8524 nullptr, D->getBeginLoc()); 8525 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8526 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8527 return Res; 8528 } 8529 8530 template <typename Derived> 8531 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8532 OMPTeamsDistributeSimdDirective *D) { 8533 DeclarationNameInfo DirName; 8534 getDerived().getSema().StartOpenMPDSABlock( 8535 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8536 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8537 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8538 return Res; 8539 } 8540 8541 template <typename Derived> 8542 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8543 OMPTeamsDistributeParallelForSimdDirective *D) { 8544 DeclarationNameInfo DirName; 8545 getDerived().getSema().StartOpenMPDSABlock( 8546 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8547 D->getBeginLoc()); 8548 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8549 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8550 return Res; 8551 } 8552 8553 template <typename Derived> 8554 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8555 OMPTeamsDistributeParallelForDirective *D) { 8556 DeclarationNameInfo DirName; 8557 getDerived().getSema().StartOpenMPDSABlock( 8558 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8559 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8560 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8561 return Res; 8562 } 8563 8564 template <typename Derived> 8565 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8566 OMPTargetTeamsDirective *D) { 8567 DeclarationNameInfo DirName; 8568 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8569 nullptr, D->getBeginLoc()); 8570 auto Res = getDerived().TransformOMPExecutableDirective(D); 8571 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8572 return Res; 8573 } 8574 8575 template <typename Derived> 8576 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8577 OMPTargetTeamsDistributeDirective *D) { 8578 DeclarationNameInfo DirName; 8579 getDerived().getSema().StartOpenMPDSABlock( 8580 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8581 auto Res = getDerived().TransformOMPExecutableDirective(D); 8582 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8583 return Res; 8584 } 8585 8586 template <typename Derived> 8587 StmtResult 8588 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8589 OMPTargetTeamsDistributeParallelForDirective *D) { 8590 DeclarationNameInfo DirName; 8591 getDerived().getSema().StartOpenMPDSABlock( 8592 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8593 D->getBeginLoc()); 8594 auto Res = getDerived().TransformOMPExecutableDirective(D); 8595 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8596 return Res; 8597 } 8598 8599 template <typename Derived> 8600 StmtResult TreeTransform<Derived>:: 8601 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8602 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8603 DeclarationNameInfo DirName; 8604 getDerived().getSema().StartOpenMPDSABlock( 8605 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8606 D->getBeginLoc()); 8607 auto Res = getDerived().TransformOMPExecutableDirective(D); 8608 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8609 return Res; 8610 } 8611 8612 template <typename Derived> 8613 StmtResult 8614 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8615 OMPTargetTeamsDistributeSimdDirective *D) { 8616 DeclarationNameInfo DirName; 8617 getDerived().getSema().StartOpenMPDSABlock( 8618 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8619 auto Res = getDerived().TransformOMPExecutableDirective(D); 8620 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8621 return Res; 8622 } 8623 8624 8625 //===----------------------------------------------------------------------===// 8626 // OpenMP clause transformation 8627 //===----------------------------------------------------------------------===// 8628 template <typename Derived> 8629 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8630 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8631 if (Cond.isInvalid()) 8632 return nullptr; 8633 return getDerived().RebuildOMPIfClause( 8634 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8635 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8636 } 8637 8638 template <typename Derived> 8639 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8640 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8641 if (Cond.isInvalid()) 8642 return nullptr; 8643 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8644 C->getLParenLoc(), C->getEndLoc()); 8645 } 8646 8647 template <typename Derived> 8648 OMPClause * 8649 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8650 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8651 if (NumThreads.isInvalid()) 8652 return nullptr; 8653 return getDerived().RebuildOMPNumThreadsClause( 8654 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8655 } 8656 8657 template <typename Derived> 8658 OMPClause * 8659 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8660 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8661 if (E.isInvalid()) 8662 return nullptr; 8663 return getDerived().RebuildOMPSafelenClause( 8664 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8665 } 8666 8667 template <typename Derived> 8668 OMPClause * 8669 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8670 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8671 if (E.isInvalid()) 8672 return nullptr; 8673 return getDerived().RebuildOMPAllocatorClause( 8674 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8675 } 8676 8677 template <typename Derived> 8678 OMPClause * 8679 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8680 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8681 if (E.isInvalid()) 8682 return nullptr; 8683 return getDerived().RebuildOMPSimdlenClause( 8684 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8685 } 8686 8687 template <typename Derived> 8688 OMPClause * 8689 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8690 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8691 if (E.isInvalid()) 8692 return nullptr; 8693 return getDerived().RebuildOMPCollapseClause( 8694 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8695 } 8696 8697 template <typename Derived> 8698 OMPClause * 8699 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8700 return getDerived().RebuildOMPDefaultClause( 8701 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8702 C->getLParenLoc(), C->getEndLoc()); 8703 } 8704 8705 template <typename Derived> 8706 OMPClause * 8707 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8708 return getDerived().RebuildOMPProcBindClause( 8709 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8710 C->getLParenLoc(), C->getEndLoc()); 8711 } 8712 8713 template <typename Derived> 8714 OMPClause * 8715 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8716 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8717 if (E.isInvalid()) 8718 return nullptr; 8719 return getDerived().RebuildOMPScheduleClause( 8720 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8721 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8722 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8723 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8724 } 8725 8726 template <typename Derived> 8727 OMPClause * 8728 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8729 ExprResult E; 8730 if (auto *Num = C->getNumForLoops()) { 8731 E = getDerived().TransformExpr(Num); 8732 if (E.isInvalid()) 8733 return nullptr; 8734 } 8735 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8736 C->getLParenLoc(), E.get()); 8737 } 8738 8739 template <typename Derived> 8740 OMPClause * 8741 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8742 // No need to rebuild this clause, no template-dependent parameters. 8743 return C; 8744 } 8745 8746 template <typename Derived> 8747 OMPClause * 8748 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8749 // No need to rebuild this clause, no template-dependent parameters. 8750 return C; 8751 } 8752 8753 template <typename Derived> 8754 OMPClause * 8755 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8756 // No need to rebuild this clause, no template-dependent parameters. 8757 return C; 8758 } 8759 8760 template <typename Derived> 8761 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8762 // No need to rebuild this clause, no template-dependent parameters. 8763 return C; 8764 } 8765 8766 template <typename Derived> 8767 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8768 // No need to rebuild this clause, no template-dependent parameters. 8769 return C; 8770 } 8771 8772 template <typename Derived> 8773 OMPClause * 8774 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8775 // No need to rebuild this clause, no template-dependent parameters. 8776 return C; 8777 } 8778 8779 template <typename Derived> 8780 OMPClause * 8781 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8782 // No need to rebuild this clause, no template-dependent parameters. 8783 return C; 8784 } 8785 8786 template <typename Derived> 8787 OMPClause * 8788 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8789 // No need to rebuild this clause, no template-dependent parameters. 8790 return C; 8791 } 8792 8793 template <typename Derived> 8794 OMPClause * 8795 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8796 // No need to rebuild this clause, no template-dependent parameters. 8797 return C; 8798 } 8799 8800 template <typename Derived> 8801 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8802 // No need to rebuild this clause, no template-dependent parameters. 8803 return C; 8804 } 8805 8806 template <typename Derived> 8807 OMPClause * 8808 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8809 // No need to rebuild this clause, no template-dependent parameters. 8810 return C; 8811 } 8812 8813 template <typename Derived> 8814 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8815 OMPUnifiedAddressClause *C) { 8816 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8817 } 8818 8819 template <typename Derived> 8820 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8821 OMPUnifiedSharedMemoryClause *C) { 8822 llvm_unreachable( 8823 "unified_shared_memory clause cannot appear in dependent context"); 8824 } 8825 8826 template <typename Derived> 8827 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8828 OMPReverseOffloadClause *C) { 8829 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8830 } 8831 8832 template <typename Derived> 8833 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8834 OMPDynamicAllocatorsClause *C) { 8835 llvm_unreachable( 8836 "dynamic_allocators clause cannot appear in dependent context"); 8837 } 8838 8839 template <typename Derived> 8840 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8841 OMPAtomicDefaultMemOrderClause *C) { 8842 llvm_unreachable( 8843 "atomic_default_mem_order clause cannot appear in dependent context"); 8844 } 8845 8846 template <typename Derived> 8847 OMPClause * 8848 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8849 llvm::SmallVector<Expr *, 16> Vars; 8850 Vars.reserve(C->varlist_size()); 8851 for (auto *VE : C->varlists()) { 8852 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8853 if (EVar.isInvalid()) 8854 return nullptr; 8855 Vars.push_back(EVar.get()); 8856 } 8857 return getDerived().RebuildOMPPrivateClause( 8858 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8859 } 8860 8861 template <typename Derived> 8862 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8863 OMPFirstprivateClause *C) { 8864 llvm::SmallVector<Expr *, 16> Vars; 8865 Vars.reserve(C->varlist_size()); 8866 for (auto *VE : C->varlists()) { 8867 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8868 if (EVar.isInvalid()) 8869 return nullptr; 8870 Vars.push_back(EVar.get()); 8871 } 8872 return getDerived().RebuildOMPFirstprivateClause( 8873 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8874 } 8875 8876 template <typename Derived> 8877 OMPClause * 8878 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8879 llvm::SmallVector<Expr *, 16> Vars; 8880 Vars.reserve(C->varlist_size()); 8881 for (auto *VE : C->varlists()) { 8882 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8883 if (EVar.isInvalid()) 8884 return nullptr; 8885 Vars.push_back(EVar.get()); 8886 } 8887 return getDerived().RebuildOMPLastprivateClause( 8888 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 8889 C->getLParenLoc(), C->getEndLoc()); 8890 } 8891 8892 template <typename Derived> 8893 OMPClause * 8894 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8895 llvm::SmallVector<Expr *, 16> Vars; 8896 Vars.reserve(C->varlist_size()); 8897 for (auto *VE : C->varlists()) { 8898 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8899 if (EVar.isInvalid()) 8900 return nullptr; 8901 Vars.push_back(EVar.get()); 8902 } 8903 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8904 C->getLParenLoc(), C->getEndLoc()); 8905 } 8906 8907 template <typename Derived> 8908 OMPClause * 8909 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8910 llvm::SmallVector<Expr *, 16> Vars; 8911 Vars.reserve(C->varlist_size()); 8912 for (auto *VE : C->varlists()) { 8913 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8914 if (EVar.isInvalid()) 8915 return nullptr; 8916 Vars.push_back(EVar.get()); 8917 } 8918 CXXScopeSpec ReductionIdScopeSpec; 8919 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8920 8921 DeclarationNameInfo NameInfo = C->getNameInfo(); 8922 if (NameInfo.getName()) { 8923 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8924 if (!NameInfo.getName()) 8925 return nullptr; 8926 } 8927 // Build a list of all UDR decls with the same names ranged by the Scopes. 8928 // The Scope boundary is a duplication of the previous decl. 8929 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8930 for (auto *E : C->reduction_ops()) { 8931 // Transform all the decls. 8932 if (E) { 8933 auto *ULE = cast<UnresolvedLookupExpr>(E); 8934 UnresolvedSet<8> Decls; 8935 for (auto *D : ULE->decls()) { 8936 NamedDecl *InstD = 8937 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8938 Decls.addDecl(InstD, InstD->getAccess()); 8939 } 8940 UnresolvedReductions.push_back( 8941 UnresolvedLookupExpr::Create( 8942 SemaRef.Context, /*NamingClass=*/nullptr, 8943 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8944 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8945 Decls.begin(), Decls.end())); 8946 } else 8947 UnresolvedReductions.push_back(nullptr); 8948 } 8949 return getDerived().RebuildOMPReductionClause( 8950 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8951 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8952 } 8953 8954 template <typename Derived> 8955 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8956 OMPTaskReductionClause *C) { 8957 llvm::SmallVector<Expr *, 16> Vars; 8958 Vars.reserve(C->varlist_size()); 8959 for (auto *VE : C->varlists()) { 8960 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8961 if (EVar.isInvalid()) 8962 return nullptr; 8963 Vars.push_back(EVar.get()); 8964 } 8965 CXXScopeSpec ReductionIdScopeSpec; 8966 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8967 8968 DeclarationNameInfo NameInfo = C->getNameInfo(); 8969 if (NameInfo.getName()) { 8970 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8971 if (!NameInfo.getName()) 8972 return nullptr; 8973 } 8974 // Build a list of all UDR decls with the same names ranged by the Scopes. 8975 // The Scope boundary is a duplication of the previous decl. 8976 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8977 for (auto *E : C->reduction_ops()) { 8978 // Transform all the decls. 8979 if (E) { 8980 auto *ULE = cast<UnresolvedLookupExpr>(E); 8981 UnresolvedSet<8> Decls; 8982 for (auto *D : ULE->decls()) { 8983 NamedDecl *InstD = 8984 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8985 Decls.addDecl(InstD, InstD->getAccess()); 8986 } 8987 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 8988 SemaRef.Context, /*NamingClass=*/nullptr, 8989 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 8990 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 8991 } else 8992 UnresolvedReductions.push_back(nullptr); 8993 } 8994 return getDerived().RebuildOMPTaskReductionClause( 8995 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8996 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8997 } 8998 8999 template <typename Derived> 9000 OMPClause * 9001 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9002 llvm::SmallVector<Expr *, 16> Vars; 9003 Vars.reserve(C->varlist_size()); 9004 for (auto *VE : C->varlists()) { 9005 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9006 if (EVar.isInvalid()) 9007 return nullptr; 9008 Vars.push_back(EVar.get()); 9009 } 9010 CXXScopeSpec ReductionIdScopeSpec; 9011 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9012 9013 DeclarationNameInfo NameInfo = C->getNameInfo(); 9014 if (NameInfo.getName()) { 9015 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9016 if (!NameInfo.getName()) 9017 return nullptr; 9018 } 9019 // Build a list of all UDR decls with the same names ranged by the Scopes. 9020 // The Scope boundary is a duplication of the previous decl. 9021 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9022 for (auto *E : C->reduction_ops()) { 9023 // Transform all the decls. 9024 if (E) { 9025 auto *ULE = cast<UnresolvedLookupExpr>(E); 9026 UnresolvedSet<8> Decls; 9027 for (auto *D : ULE->decls()) { 9028 NamedDecl *InstD = 9029 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9030 Decls.addDecl(InstD, InstD->getAccess()); 9031 } 9032 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9033 SemaRef.Context, /*NamingClass=*/nullptr, 9034 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9035 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9036 } else 9037 UnresolvedReductions.push_back(nullptr); 9038 } 9039 return getDerived().RebuildOMPInReductionClause( 9040 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9041 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9042 } 9043 9044 template <typename Derived> 9045 OMPClause * 9046 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9047 llvm::SmallVector<Expr *, 16> Vars; 9048 Vars.reserve(C->varlist_size()); 9049 for (auto *VE : C->varlists()) { 9050 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9051 if (EVar.isInvalid()) 9052 return nullptr; 9053 Vars.push_back(EVar.get()); 9054 } 9055 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9056 if (Step.isInvalid()) 9057 return nullptr; 9058 return getDerived().RebuildOMPLinearClause( 9059 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9060 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9061 } 9062 9063 template <typename Derived> 9064 OMPClause * 9065 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9066 llvm::SmallVector<Expr *, 16> Vars; 9067 Vars.reserve(C->varlist_size()); 9068 for (auto *VE : C->varlists()) { 9069 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9070 if (EVar.isInvalid()) 9071 return nullptr; 9072 Vars.push_back(EVar.get()); 9073 } 9074 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9075 if (Alignment.isInvalid()) 9076 return nullptr; 9077 return getDerived().RebuildOMPAlignedClause( 9078 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9079 C->getColonLoc(), C->getEndLoc()); 9080 } 9081 9082 template <typename Derived> 9083 OMPClause * 9084 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9085 llvm::SmallVector<Expr *, 16> Vars; 9086 Vars.reserve(C->varlist_size()); 9087 for (auto *VE : C->varlists()) { 9088 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9089 if (EVar.isInvalid()) 9090 return nullptr; 9091 Vars.push_back(EVar.get()); 9092 } 9093 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9094 C->getLParenLoc(), C->getEndLoc()); 9095 } 9096 9097 template <typename Derived> 9098 OMPClause * 9099 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9100 llvm::SmallVector<Expr *, 16> Vars; 9101 Vars.reserve(C->varlist_size()); 9102 for (auto *VE : C->varlists()) { 9103 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9104 if (EVar.isInvalid()) 9105 return nullptr; 9106 Vars.push_back(EVar.get()); 9107 } 9108 return getDerived().RebuildOMPCopyprivateClause( 9109 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9110 } 9111 9112 template <typename Derived> 9113 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9114 llvm::SmallVector<Expr *, 16> Vars; 9115 Vars.reserve(C->varlist_size()); 9116 for (auto *VE : C->varlists()) { 9117 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9118 if (EVar.isInvalid()) 9119 return nullptr; 9120 Vars.push_back(EVar.get()); 9121 } 9122 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9123 C->getLParenLoc(), C->getEndLoc()); 9124 } 9125 9126 template <typename Derived> 9127 OMPClause * 9128 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9129 llvm::SmallVector<Expr *, 16> Vars; 9130 Vars.reserve(C->varlist_size()); 9131 for (auto *VE : C->varlists()) { 9132 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9133 if (EVar.isInvalid()) 9134 return nullptr; 9135 Vars.push_back(EVar.get()); 9136 } 9137 return getDerived().RebuildOMPDependClause( 9138 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 9139 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9140 } 9141 9142 template <typename Derived> 9143 OMPClause * 9144 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9145 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9146 if (E.isInvalid()) 9147 return nullptr; 9148 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 9149 C->getLParenLoc(), C->getEndLoc()); 9150 } 9151 9152 template <typename Derived, class T> 9153 bool transformOMPMappableExprListClause( 9154 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9155 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9156 DeclarationNameInfo &MapperIdInfo, 9157 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9158 // Transform expressions in the list. 9159 Vars.reserve(C->varlist_size()); 9160 for (auto *VE : C->varlists()) { 9161 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9162 if (EVar.isInvalid()) 9163 return true; 9164 Vars.push_back(EVar.get()); 9165 } 9166 // Transform mapper scope specifier and identifier. 9167 NestedNameSpecifierLoc QualifierLoc; 9168 if (C->getMapperQualifierLoc()) { 9169 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9170 C->getMapperQualifierLoc()); 9171 if (!QualifierLoc) 9172 return true; 9173 } 9174 MapperIdScopeSpec.Adopt(QualifierLoc); 9175 MapperIdInfo = C->getMapperIdInfo(); 9176 if (MapperIdInfo.getName()) { 9177 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9178 if (!MapperIdInfo.getName()) 9179 return true; 9180 } 9181 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9182 // the previous user-defined mapper lookup in dependent environment. 9183 for (auto *E : C->mapperlists()) { 9184 // Transform all the decls. 9185 if (E) { 9186 auto *ULE = cast<UnresolvedLookupExpr>(E); 9187 UnresolvedSet<8> Decls; 9188 for (auto *D : ULE->decls()) { 9189 NamedDecl *InstD = 9190 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9191 Decls.addDecl(InstD, InstD->getAccess()); 9192 } 9193 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9194 TT.getSema().Context, /*NamingClass=*/nullptr, 9195 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9196 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9197 Decls.end())); 9198 } else { 9199 UnresolvedMappers.push_back(nullptr); 9200 } 9201 } 9202 return false; 9203 } 9204 9205 template <typename Derived> 9206 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9207 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9208 llvm::SmallVector<Expr *, 16> Vars; 9209 CXXScopeSpec MapperIdScopeSpec; 9210 DeclarationNameInfo MapperIdInfo; 9211 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9212 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9213 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9214 return nullptr; 9215 return getDerived().RebuildOMPMapClause( 9216 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9217 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9218 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9219 } 9220 9221 template <typename Derived> 9222 OMPClause * 9223 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9224 Expr *Allocator = C->getAllocator(); 9225 if (Allocator) { 9226 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9227 if (AllocatorRes.isInvalid()) 9228 return nullptr; 9229 Allocator = AllocatorRes.get(); 9230 } 9231 llvm::SmallVector<Expr *, 16> Vars; 9232 Vars.reserve(C->varlist_size()); 9233 for (auto *VE : C->varlists()) { 9234 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9235 if (EVar.isInvalid()) 9236 return nullptr; 9237 Vars.push_back(EVar.get()); 9238 } 9239 return getDerived().RebuildOMPAllocateClause( 9240 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9241 C->getEndLoc()); 9242 } 9243 9244 template <typename Derived> 9245 OMPClause * 9246 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9247 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9248 if (E.isInvalid()) 9249 return nullptr; 9250 return getDerived().RebuildOMPNumTeamsClause( 9251 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9252 } 9253 9254 template <typename Derived> 9255 OMPClause * 9256 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9257 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9258 if (E.isInvalid()) 9259 return nullptr; 9260 return getDerived().RebuildOMPThreadLimitClause( 9261 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9262 } 9263 9264 template <typename Derived> 9265 OMPClause * 9266 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9267 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9268 if (E.isInvalid()) 9269 return nullptr; 9270 return getDerived().RebuildOMPPriorityClause( 9271 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9272 } 9273 9274 template <typename Derived> 9275 OMPClause * 9276 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9277 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9278 if (E.isInvalid()) 9279 return nullptr; 9280 return getDerived().RebuildOMPGrainsizeClause( 9281 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9282 } 9283 9284 template <typename Derived> 9285 OMPClause * 9286 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9287 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9288 if (E.isInvalid()) 9289 return nullptr; 9290 return getDerived().RebuildOMPNumTasksClause( 9291 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9292 } 9293 9294 template <typename Derived> 9295 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9296 ExprResult E = getDerived().TransformExpr(C->getHint()); 9297 if (E.isInvalid()) 9298 return nullptr; 9299 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9300 C->getLParenLoc(), C->getEndLoc()); 9301 } 9302 9303 template <typename Derived> 9304 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9305 OMPDistScheduleClause *C) { 9306 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9307 if (E.isInvalid()) 9308 return nullptr; 9309 return getDerived().RebuildOMPDistScheduleClause( 9310 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9311 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9312 } 9313 9314 template <typename Derived> 9315 OMPClause * 9316 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9317 // Rebuild Defaultmap Clause since we need to invoke the checking of 9318 // defaultmap(none:variable-category) after template initialization. 9319 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9320 C->getDefaultmapKind(), 9321 C->getBeginLoc(), 9322 C->getLParenLoc(), 9323 C->getDefaultmapModifierLoc(), 9324 C->getDefaultmapKindLoc(), 9325 C->getEndLoc()); 9326 } 9327 9328 template <typename Derived> 9329 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9330 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9331 llvm::SmallVector<Expr *, 16> Vars; 9332 CXXScopeSpec MapperIdScopeSpec; 9333 DeclarationNameInfo MapperIdInfo; 9334 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9335 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9336 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9337 return nullptr; 9338 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9339 Locs, UnresolvedMappers); 9340 } 9341 9342 template <typename Derived> 9343 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9344 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9345 llvm::SmallVector<Expr *, 16> Vars; 9346 CXXScopeSpec MapperIdScopeSpec; 9347 DeclarationNameInfo MapperIdInfo; 9348 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9349 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9350 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9351 return nullptr; 9352 return getDerived().RebuildOMPFromClause( 9353 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9354 } 9355 9356 template <typename Derived> 9357 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9358 OMPUseDevicePtrClause *C) { 9359 llvm::SmallVector<Expr *, 16> Vars; 9360 Vars.reserve(C->varlist_size()); 9361 for (auto *VE : C->varlists()) { 9362 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9363 if (EVar.isInvalid()) 9364 return nullptr; 9365 Vars.push_back(EVar.get()); 9366 } 9367 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9368 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9369 } 9370 9371 template <typename Derived> 9372 OMPClause * 9373 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9374 llvm::SmallVector<Expr *, 16> Vars; 9375 Vars.reserve(C->varlist_size()); 9376 for (auto *VE : C->varlists()) { 9377 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9378 if (EVar.isInvalid()) 9379 return nullptr; 9380 Vars.push_back(EVar.get()); 9381 } 9382 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9383 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9384 } 9385 9386 template <typename Derived> 9387 OMPClause * 9388 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9389 llvm::SmallVector<Expr *, 16> Vars; 9390 Vars.reserve(C->varlist_size()); 9391 for (auto *VE : C->varlists()) { 9392 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9393 if (EVar.isInvalid()) 9394 return nullptr; 9395 Vars.push_back(EVar.get()); 9396 } 9397 return getDerived().RebuildOMPNontemporalClause( 9398 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9399 } 9400 9401 //===----------------------------------------------------------------------===// 9402 // Expression transformation 9403 //===----------------------------------------------------------------------===// 9404 template<typename Derived> 9405 ExprResult 9406 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9407 return TransformExpr(E->getSubExpr()); 9408 } 9409 9410 template<typename Derived> 9411 ExprResult 9412 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9413 if (!E->isTypeDependent()) 9414 return E; 9415 9416 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9417 E->getIdentKind()); 9418 } 9419 9420 template<typename Derived> 9421 ExprResult 9422 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9423 NestedNameSpecifierLoc QualifierLoc; 9424 if (E->getQualifierLoc()) { 9425 QualifierLoc 9426 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9427 if (!QualifierLoc) 9428 return ExprError(); 9429 } 9430 9431 ValueDecl *ND 9432 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9433 E->getDecl())); 9434 if (!ND) 9435 return ExprError(); 9436 9437 NamedDecl *Found = ND; 9438 if (E->getFoundDecl() != E->getDecl()) { 9439 Found = cast_or_null<NamedDecl>( 9440 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9441 if (!Found) 9442 return ExprError(); 9443 } 9444 9445 DeclarationNameInfo NameInfo = E->getNameInfo(); 9446 if (NameInfo.getName()) { 9447 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9448 if (!NameInfo.getName()) 9449 return ExprError(); 9450 } 9451 9452 if (!getDerived().AlwaysRebuild() && 9453 QualifierLoc == E->getQualifierLoc() && 9454 ND == E->getDecl() && 9455 Found == E->getFoundDecl() && 9456 NameInfo.getName() == E->getDecl()->getDeclName() && 9457 !E->hasExplicitTemplateArgs()) { 9458 9459 // Mark it referenced in the new context regardless. 9460 // FIXME: this is a bit instantiation-specific. 9461 SemaRef.MarkDeclRefReferenced(E); 9462 9463 return E; 9464 } 9465 9466 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9467 if (E->hasExplicitTemplateArgs()) { 9468 TemplateArgs = &TransArgs; 9469 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9470 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9471 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9472 E->getNumTemplateArgs(), 9473 TransArgs)) 9474 return ExprError(); 9475 } 9476 9477 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9478 Found, TemplateArgs); 9479 } 9480 9481 template<typename Derived> 9482 ExprResult 9483 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9484 return E; 9485 } 9486 9487 template <typename Derived> 9488 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9489 FixedPointLiteral *E) { 9490 return E; 9491 } 9492 9493 template<typename Derived> 9494 ExprResult 9495 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9496 return E; 9497 } 9498 9499 template<typename Derived> 9500 ExprResult 9501 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9502 return E; 9503 } 9504 9505 template<typename Derived> 9506 ExprResult 9507 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9508 return E; 9509 } 9510 9511 template<typename Derived> 9512 ExprResult 9513 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9514 return E; 9515 } 9516 9517 template<typename Derived> 9518 ExprResult 9519 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9520 if (FunctionDecl *FD = E->getDirectCallee()) 9521 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9522 return SemaRef.MaybeBindToTemporary(E); 9523 } 9524 9525 template<typename Derived> 9526 ExprResult 9527 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9528 ExprResult ControllingExpr = 9529 getDerived().TransformExpr(E->getControllingExpr()); 9530 if (ControllingExpr.isInvalid()) 9531 return ExprError(); 9532 9533 SmallVector<Expr *, 4> AssocExprs; 9534 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9535 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 9536 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9537 if (TSI) { 9538 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9539 if (!AssocType) 9540 return ExprError(); 9541 AssocTypes.push_back(AssocType); 9542 } else { 9543 AssocTypes.push_back(nullptr); 9544 } 9545 9546 ExprResult AssocExpr = 9547 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9548 if (AssocExpr.isInvalid()) 9549 return ExprError(); 9550 AssocExprs.push_back(AssocExpr.get()); 9551 } 9552 9553 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9554 E->getDefaultLoc(), 9555 E->getRParenLoc(), 9556 ControllingExpr.get(), 9557 AssocTypes, 9558 AssocExprs); 9559 } 9560 9561 template<typename Derived> 9562 ExprResult 9563 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9564 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9565 if (SubExpr.isInvalid()) 9566 return ExprError(); 9567 9568 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9569 return E; 9570 9571 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9572 E->getRParen()); 9573 } 9574 9575 /// The operand of a unary address-of operator has special rules: it's 9576 /// allowed to refer to a non-static member of a class even if there's no 'this' 9577 /// object available. 9578 template<typename Derived> 9579 ExprResult 9580 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9581 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9582 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9583 else 9584 return getDerived().TransformExpr(E); 9585 } 9586 9587 template<typename Derived> 9588 ExprResult 9589 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9590 ExprResult SubExpr; 9591 if (E->getOpcode() == UO_AddrOf) 9592 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9593 else 9594 SubExpr = TransformExpr(E->getSubExpr()); 9595 if (SubExpr.isInvalid()) 9596 return ExprError(); 9597 9598 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9599 return E; 9600 9601 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9602 E->getOpcode(), 9603 SubExpr.get()); 9604 } 9605 9606 template<typename Derived> 9607 ExprResult 9608 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9609 // Transform the type. 9610 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9611 if (!Type) 9612 return ExprError(); 9613 9614 // Transform all of the components into components similar to what the 9615 // parser uses. 9616 // FIXME: It would be slightly more efficient in the non-dependent case to 9617 // just map FieldDecls, rather than requiring the rebuilder to look for 9618 // the fields again. However, __builtin_offsetof is rare enough in 9619 // template code that we don't care. 9620 bool ExprChanged = false; 9621 typedef Sema::OffsetOfComponent Component; 9622 SmallVector<Component, 4> Components; 9623 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9624 const OffsetOfNode &ON = E->getComponent(I); 9625 Component Comp; 9626 Comp.isBrackets = true; 9627 Comp.LocStart = ON.getSourceRange().getBegin(); 9628 Comp.LocEnd = ON.getSourceRange().getEnd(); 9629 switch (ON.getKind()) { 9630 case OffsetOfNode::Array: { 9631 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9632 ExprResult Index = getDerived().TransformExpr(FromIndex); 9633 if (Index.isInvalid()) 9634 return ExprError(); 9635 9636 ExprChanged = ExprChanged || Index.get() != FromIndex; 9637 Comp.isBrackets = true; 9638 Comp.U.E = Index.get(); 9639 break; 9640 } 9641 9642 case OffsetOfNode::Field: 9643 case OffsetOfNode::Identifier: 9644 Comp.isBrackets = false; 9645 Comp.U.IdentInfo = ON.getFieldName(); 9646 if (!Comp.U.IdentInfo) 9647 continue; 9648 9649 break; 9650 9651 case OffsetOfNode::Base: 9652 // Will be recomputed during the rebuild. 9653 continue; 9654 } 9655 9656 Components.push_back(Comp); 9657 } 9658 9659 // If nothing changed, retain the existing expression. 9660 if (!getDerived().AlwaysRebuild() && 9661 Type == E->getTypeSourceInfo() && 9662 !ExprChanged) 9663 return E; 9664 9665 // Build a new offsetof expression. 9666 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9667 Components, E->getRParenLoc()); 9668 } 9669 9670 template<typename Derived> 9671 ExprResult 9672 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9673 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9674 "opaque value expression requires transformation"); 9675 return E; 9676 } 9677 9678 template<typename Derived> 9679 ExprResult 9680 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9681 return E; 9682 } 9683 9684 template<typename Derived> 9685 ExprResult 9686 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9687 // Rebuild the syntactic form. The original syntactic form has 9688 // opaque-value expressions in it, so strip those away and rebuild 9689 // the result. This is a really awful way of doing this, but the 9690 // better solution (rebuilding the semantic expressions and 9691 // rebinding OVEs as necessary) doesn't work; we'd need 9692 // TreeTransform to not strip away implicit conversions. 9693 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9694 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9695 if (result.isInvalid()) return ExprError(); 9696 9697 // If that gives us a pseudo-object result back, the pseudo-object 9698 // expression must have been an lvalue-to-rvalue conversion which we 9699 // should reapply. 9700 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9701 result = SemaRef.checkPseudoObjectRValue(result.get()); 9702 9703 return result; 9704 } 9705 9706 template<typename Derived> 9707 ExprResult 9708 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9709 UnaryExprOrTypeTraitExpr *E) { 9710 if (E->isArgumentType()) { 9711 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9712 9713 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9714 if (!NewT) 9715 return ExprError(); 9716 9717 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9718 return E; 9719 9720 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9721 E->getKind(), 9722 E->getSourceRange()); 9723 } 9724 9725 // C++0x [expr.sizeof]p1: 9726 // The operand is either an expression, which is an unevaluated operand 9727 // [...] 9728 EnterExpressionEvaluationContext Unevaluated( 9729 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9730 Sema::ReuseLambdaContextDecl); 9731 9732 // Try to recover if we have something like sizeof(T::X) where X is a type. 9733 // Notably, there must be *exactly* one set of parens if X is a type. 9734 TypeSourceInfo *RecoveryTSI = nullptr; 9735 ExprResult SubExpr; 9736 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9737 if (auto *DRE = 9738 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9739 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9740 PE, DRE, false, &RecoveryTSI); 9741 else 9742 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9743 9744 if (RecoveryTSI) { 9745 return getDerived().RebuildUnaryExprOrTypeTrait( 9746 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9747 } else if (SubExpr.isInvalid()) 9748 return ExprError(); 9749 9750 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9751 return E; 9752 9753 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9754 E->getOperatorLoc(), 9755 E->getKind(), 9756 E->getSourceRange()); 9757 } 9758 9759 template<typename Derived> 9760 ExprResult 9761 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9762 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9763 if (LHS.isInvalid()) 9764 return ExprError(); 9765 9766 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9767 if (RHS.isInvalid()) 9768 return ExprError(); 9769 9770 9771 if (!getDerived().AlwaysRebuild() && 9772 LHS.get() == E->getLHS() && 9773 RHS.get() == E->getRHS()) 9774 return E; 9775 9776 return getDerived().RebuildArraySubscriptExpr( 9777 LHS.get(), 9778 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9779 } 9780 9781 template <typename Derived> 9782 ExprResult 9783 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9784 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9785 if (Base.isInvalid()) 9786 return ExprError(); 9787 9788 ExprResult LowerBound; 9789 if (E->getLowerBound()) { 9790 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9791 if (LowerBound.isInvalid()) 9792 return ExprError(); 9793 } 9794 9795 ExprResult Length; 9796 if (E->getLength()) { 9797 Length = getDerived().TransformExpr(E->getLength()); 9798 if (Length.isInvalid()) 9799 return ExprError(); 9800 } 9801 9802 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9803 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9804 return E; 9805 9806 return getDerived().RebuildOMPArraySectionExpr( 9807 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9808 Length.get(), E->getRBracketLoc()); 9809 } 9810 9811 template<typename Derived> 9812 ExprResult 9813 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9814 // Transform the callee. 9815 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9816 if (Callee.isInvalid()) 9817 return ExprError(); 9818 9819 // Transform arguments. 9820 bool ArgChanged = false; 9821 SmallVector<Expr*, 8> Args; 9822 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9823 &ArgChanged)) 9824 return ExprError(); 9825 9826 if (!getDerived().AlwaysRebuild() && 9827 Callee.get() == E->getCallee() && 9828 !ArgChanged) 9829 return SemaRef.MaybeBindToTemporary(E); 9830 9831 // FIXME: Wrong source location information for the '('. 9832 SourceLocation FakeLParenLoc 9833 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9834 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9835 Args, 9836 E->getRParenLoc()); 9837 } 9838 9839 template<typename Derived> 9840 ExprResult 9841 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9842 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9843 if (Base.isInvalid()) 9844 return ExprError(); 9845 9846 NestedNameSpecifierLoc QualifierLoc; 9847 if (E->hasQualifier()) { 9848 QualifierLoc 9849 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9850 9851 if (!QualifierLoc) 9852 return ExprError(); 9853 } 9854 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9855 9856 ValueDecl *Member 9857 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9858 E->getMemberDecl())); 9859 if (!Member) 9860 return ExprError(); 9861 9862 NamedDecl *FoundDecl = E->getFoundDecl(); 9863 if (FoundDecl == E->getMemberDecl()) { 9864 FoundDecl = Member; 9865 } else { 9866 FoundDecl = cast_or_null<NamedDecl>( 9867 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9868 if (!FoundDecl) 9869 return ExprError(); 9870 } 9871 9872 if (!getDerived().AlwaysRebuild() && 9873 Base.get() == E->getBase() && 9874 QualifierLoc == E->getQualifierLoc() && 9875 Member == E->getMemberDecl() && 9876 FoundDecl == E->getFoundDecl() && 9877 !E->hasExplicitTemplateArgs()) { 9878 9879 // Mark it referenced in the new context regardless. 9880 // FIXME: this is a bit instantiation-specific. 9881 SemaRef.MarkMemberReferenced(E); 9882 9883 return E; 9884 } 9885 9886 TemplateArgumentListInfo TransArgs; 9887 if (E->hasExplicitTemplateArgs()) { 9888 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9889 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9890 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9891 E->getNumTemplateArgs(), 9892 TransArgs)) 9893 return ExprError(); 9894 } 9895 9896 // FIXME: Bogus source location for the operator 9897 SourceLocation FakeOperatorLoc = 9898 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9899 9900 // FIXME: to do this check properly, we will need to preserve the 9901 // first-qualifier-in-scope here, just in case we had a dependent 9902 // base (and therefore couldn't do the check) and a 9903 // nested-name-qualifier (and therefore could do the lookup). 9904 NamedDecl *FirstQualifierInScope = nullptr; 9905 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9906 if (MemberNameInfo.getName()) { 9907 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9908 if (!MemberNameInfo.getName()) 9909 return ExprError(); 9910 } 9911 9912 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9913 E->isArrow(), 9914 QualifierLoc, 9915 TemplateKWLoc, 9916 MemberNameInfo, 9917 Member, 9918 FoundDecl, 9919 (E->hasExplicitTemplateArgs() 9920 ? &TransArgs : nullptr), 9921 FirstQualifierInScope); 9922 } 9923 9924 template<typename Derived> 9925 ExprResult 9926 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9927 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9928 if (LHS.isInvalid()) 9929 return ExprError(); 9930 9931 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9932 if (RHS.isInvalid()) 9933 return ExprError(); 9934 9935 if (!getDerived().AlwaysRebuild() && 9936 LHS.get() == E->getLHS() && 9937 RHS.get() == E->getRHS()) 9938 return E; 9939 9940 Sema::FPContractStateRAII FPContractState(getSema()); 9941 getSema().FPFeatures = E->getFPFeatures(); 9942 9943 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9944 LHS.get(), RHS.get()); 9945 } 9946 9947 template <typename Derived> 9948 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 9949 CXXRewrittenBinaryOperator *E) { 9950 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 9951 9952 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 9953 if (LHS.isInvalid()) 9954 return ExprError(); 9955 9956 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 9957 if (RHS.isInvalid()) 9958 return ExprError(); 9959 9960 if (!getDerived().AlwaysRebuild() && 9961 LHS.get() == Decomp.LHS && 9962 RHS.get() == Decomp.RHS) 9963 return E; 9964 9965 // Extract the already-resolved callee declarations so that we can restrict 9966 // ourselves to using them as the unqualified lookup results when rebuilding. 9967 UnresolvedSet<2> UnqualLookups; 9968 Expr *PossibleBinOps[] = {E->getSemanticForm(), 9969 const_cast<Expr *>(Decomp.InnerBinOp)}; 9970 for (Expr *PossibleBinOp : PossibleBinOps) { 9971 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 9972 if (!Op) 9973 continue; 9974 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 9975 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 9976 continue; 9977 9978 // Transform the callee in case we built a call to a local extern 9979 // declaration. 9980 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 9981 E->getOperatorLoc(), Callee->getFoundDecl())); 9982 if (!Found) 9983 return ExprError(); 9984 UnqualLookups.addDecl(Found); 9985 } 9986 9987 return getDerived().RebuildCXXRewrittenBinaryOperator( 9988 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 9989 } 9990 9991 template<typename Derived> 9992 ExprResult 9993 TreeTransform<Derived>::TransformCompoundAssignOperator( 9994 CompoundAssignOperator *E) { 9995 return getDerived().TransformBinaryOperator(E); 9996 } 9997 9998 template<typename Derived> 9999 ExprResult TreeTransform<Derived>:: 10000 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10001 // Just rebuild the common and RHS expressions and see whether we 10002 // get any changes. 10003 10004 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10005 if (commonExpr.isInvalid()) 10006 return ExprError(); 10007 10008 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10009 if (rhs.isInvalid()) 10010 return ExprError(); 10011 10012 if (!getDerived().AlwaysRebuild() && 10013 commonExpr.get() == e->getCommon() && 10014 rhs.get() == e->getFalseExpr()) 10015 return e; 10016 10017 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10018 e->getQuestionLoc(), 10019 nullptr, 10020 e->getColonLoc(), 10021 rhs.get()); 10022 } 10023 10024 template<typename Derived> 10025 ExprResult 10026 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10027 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10028 if (Cond.isInvalid()) 10029 return ExprError(); 10030 10031 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10032 if (LHS.isInvalid()) 10033 return ExprError(); 10034 10035 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10036 if (RHS.isInvalid()) 10037 return ExprError(); 10038 10039 if (!getDerived().AlwaysRebuild() && 10040 Cond.get() == E->getCond() && 10041 LHS.get() == E->getLHS() && 10042 RHS.get() == E->getRHS()) 10043 return E; 10044 10045 return getDerived().RebuildConditionalOperator(Cond.get(), 10046 E->getQuestionLoc(), 10047 LHS.get(), 10048 E->getColonLoc(), 10049 RHS.get()); 10050 } 10051 10052 template<typename Derived> 10053 ExprResult 10054 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10055 // Implicit casts are eliminated during transformation, since they 10056 // will be recomputed by semantic analysis after transformation. 10057 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10058 } 10059 10060 template<typename Derived> 10061 ExprResult 10062 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10063 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10064 if (!Type) 10065 return ExprError(); 10066 10067 ExprResult SubExpr 10068 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10069 if (SubExpr.isInvalid()) 10070 return ExprError(); 10071 10072 if (!getDerived().AlwaysRebuild() && 10073 Type == E->getTypeInfoAsWritten() && 10074 SubExpr.get() == E->getSubExpr()) 10075 return E; 10076 10077 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10078 Type, 10079 E->getRParenLoc(), 10080 SubExpr.get()); 10081 } 10082 10083 template<typename Derived> 10084 ExprResult 10085 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10086 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10087 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10088 if (!NewT) 10089 return ExprError(); 10090 10091 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10092 if (Init.isInvalid()) 10093 return ExprError(); 10094 10095 if (!getDerived().AlwaysRebuild() && 10096 OldT == NewT && 10097 Init.get() == E->getInitializer()) 10098 return SemaRef.MaybeBindToTemporary(E); 10099 10100 // Note: the expression type doesn't necessarily match the 10101 // type-as-written, but that's okay, because it should always be 10102 // derivable from the initializer. 10103 10104 return getDerived().RebuildCompoundLiteralExpr( 10105 E->getLParenLoc(), NewT, 10106 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10107 } 10108 10109 template<typename Derived> 10110 ExprResult 10111 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10112 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10113 if (Base.isInvalid()) 10114 return ExprError(); 10115 10116 if (!getDerived().AlwaysRebuild() && 10117 Base.get() == E->getBase()) 10118 return E; 10119 10120 // FIXME: Bad source location 10121 SourceLocation FakeOperatorLoc = 10122 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10123 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10124 E->getAccessorLoc(), 10125 E->getAccessor()); 10126 } 10127 10128 template<typename Derived> 10129 ExprResult 10130 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10131 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10132 E = Syntactic; 10133 10134 bool InitChanged = false; 10135 10136 EnterExpressionEvaluationContext Context( 10137 getSema(), EnterExpressionEvaluationContext::InitList); 10138 10139 SmallVector<Expr*, 4> Inits; 10140 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10141 Inits, &InitChanged)) 10142 return ExprError(); 10143 10144 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10145 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10146 // in some cases. We can't reuse it in general, because the syntactic and 10147 // semantic forms are linked, and we can't know that semantic form will 10148 // match even if the syntactic form does. 10149 } 10150 10151 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10152 E->getRBraceLoc()); 10153 } 10154 10155 template<typename Derived> 10156 ExprResult 10157 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10158 Designation Desig; 10159 10160 // transform the initializer value 10161 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10162 if (Init.isInvalid()) 10163 return ExprError(); 10164 10165 // transform the designators. 10166 SmallVector<Expr*, 4> ArrayExprs; 10167 bool ExprChanged = false; 10168 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10169 if (D.isFieldDesignator()) { 10170 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10171 D.getDotLoc(), 10172 D.getFieldLoc())); 10173 if (D.getField()) { 10174 FieldDecl *Field = cast_or_null<FieldDecl>( 10175 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10176 if (Field != D.getField()) 10177 // Rebuild the expression when the transformed FieldDecl is 10178 // different to the already assigned FieldDecl. 10179 ExprChanged = true; 10180 } else { 10181 // Ensure that the designator expression is rebuilt when there isn't 10182 // a resolved FieldDecl in the designator as we don't want to assign 10183 // a FieldDecl to a pattern designator that will be instantiated again. 10184 ExprChanged = true; 10185 } 10186 continue; 10187 } 10188 10189 if (D.isArrayDesignator()) { 10190 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10191 if (Index.isInvalid()) 10192 return ExprError(); 10193 10194 Desig.AddDesignator( 10195 Designator::getArray(Index.get(), D.getLBracketLoc())); 10196 10197 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10198 ArrayExprs.push_back(Index.get()); 10199 continue; 10200 } 10201 10202 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10203 ExprResult Start 10204 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10205 if (Start.isInvalid()) 10206 return ExprError(); 10207 10208 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10209 if (End.isInvalid()) 10210 return ExprError(); 10211 10212 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10213 End.get(), 10214 D.getLBracketLoc(), 10215 D.getEllipsisLoc())); 10216 10217 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10218 End.get() != E->getArrayRangeEnd(D); 10219 10220 ArrayExprs.push_back(Start.get()); 10221 ArrayExprs.push_back(End.get()); 10222 } 10223 10224 if (!getDerived().AlwaysRebuild() && 10225 Init.get() == E->getInit() && 10226 !ExprChanged) 10227 return E; 10228 10229 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10230 E->getEqualOrColonLoc(), 10231 E->usesGNUSyntax(), Init.get()); 10232 } 10233 10234 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10235 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10236 template<typename Derived> 10237 ExprResult 10238 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10239 DesignatedInitUpdateExpr *E) { 10240 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10241 "initializer"); 10242 return ExprError(); 10243 } 10244 10245 template<typename Derived> 10246 ExprResult 10247 TreeTransform<Derived>::TransformNoInitExpr( 10248 NoInitExpr *E) { 10249 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10250 return ExprError(); 10251 } 10252 10253 template<typename Derived> 10254 ExprResult 10255 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10256 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10257 return ExprError(); 10258 } 10259 10260 template<typename Derived> 10261 ExprResult 10262 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10263 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10264 return ExprError(); 10265 } 10266 10267 template<typename Derived> 10268 ExprResult 10269 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10270 ImplicitValueInitExpr *E) { 10271 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10272 10273 // FIXME: Will we ever have proper type location here? Will we actually 10274 // need to transform the type? 10275 QualType T = getDerived().TransformType(E->getType()); 10276 if (T.isNull()) 10277 return ExprError(); 10278 10279 if (!getDerived().AlwaysRebuild() && 10280 T == E->getType()) 10281 return E; 10282 10283 return getDerived().RebuildImplicitValueInitExpr(T); 10284 } 10285 10286 template<typename Derived> 10287 ExprResult 10288 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10289 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10290 if (!TInfo) 10291 return ExprError(); 10292 10293 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10294 if (SubExpr.isInvalid()) 10295 return ExprError(); 10296 10297 if (!getDerived().AlwaysRebuild() && 10298 TInfo == E->getWrittenTypeInfo() && 10299 SubExpr.get() == E->getSubExpr()) 10300 return E; 10301 10302 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10303 TInfo, E->getRParenLoc()); 10304 } 10305 10306 template<typename Derived> 10307 ExprResult 10308 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10309 bool ArgumentChanged = false; 10310 SmallVector<Expr*, 4> Inits; 10311 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10312 &ArgumentChanged)) 10313 return ExprError(); 10314 10315 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10316 Inits, 10317 E->getRParenLoc()); 10318 } 10319 10320 /// Transform an address-of-label expression. 10321 /// 10322 /// By default, the transformation of an address-of-label expression always 10323 /// rebuilds the expression, so that the label identifier can be resolved to 10324 /// the corresponding label statement by semantic analysis. 10325 template<typename Derived> 10326 ExprResult 10327 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10328 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10329 E->getLabel()); 10330 if (!LD) 10331 return ExprError(); 10332 10333 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10334 cast<LabelDecl>(LD)); 10335 } 10336 10337 template<typename Derived> 10338 ExprResult 10339 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10340 SemaRef.ActOnStartStmtExpr(); 10341 StmtResult SubStmt 10342 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10343 if (SubStmt.isInvalid()) { 10344 SemaRef.ActOnStmtExprError(); 10345 return ExprError(); 10346 } 10347 10348 if (!getDerived().AlwaysRebuild() && 10349 SubStmt.get() == E->getSubStmt()) { 10350 // Calling this an 'error' is unintuitive, but it does the right thing. 10351 SemaRef.ActOnStmtExprError(); 10352 return SemaRef.MaybeBindToTemporary(E); 10353 } 10354 10355 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 10356 SubStmt.get(), 10357 E->getRParenLoc()); 10358 } 10359 10360 template<typename Derived> 10361 ExprResult 10362 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10363 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10364 if (Cond.isInvalid()) 10365 return ExprError(); 10366 10367 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10368 if (LHS.isInvalid()) 10369 return ExprError(); 10370 10371 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10372 if (RHS.isInvalid()) 10373 return ExprError(); 10374 10375 if (!getDerived().AlwaysRebuild() && 10376 Cond.get() == E->getCond() && 10377 LHS.get() == E->getLHS() && 10378 RHS.get() == E->getRHS()) 10379 return E; 10380 10381 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10382 Cond.get(), LHS.get(), RHS.get(), 10383 E->getRParenLoc()); 10384 } 10385 10386 template<typename Derived> 10387 ExprResult 10388 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10389 return E; 10390 } 10391 10392 template<typename Derived> 10393 ExprResult 10394 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10395 switch (E->getOperator()) { 10396 case OO_New: 10397 case OO_Delete: 10398 case OO_Array_New: 10399 case OO_Array_Delete: 10400 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10401 10402 case OO_Call: { 10403 // This is a call to an object's operator(). 10404 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10405 10406 // Transform the object itself. 10407 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10408 if (Object.isInvalid()) 10409 return ExprError(); 10410 10411 // FIXME: Poor location information 10412 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10413 static_cast<Expr *>(Object.get())->getEndLoc()); 10414 10415 // Transform the call arguments. 10416 SmallVector<Expr*, 8> Args; 10417 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10418 Args)) 10419 return ExprError(); 10420 10421 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10422 E->getEndLoc()); 10423 } 10424 10425 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10426 case OO_##Name: 10427 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10428 #include "clang/Basic/OperatorKinds.def" 10429 case OO_Subscript: 10430 // Handled below. 10431 break; 10432 10433 case OO_Conditional: 10434 llvm_unreachable("conditional operator is not actually overloadable"); 10435 10436 case OO_None: 10437 case NUM_OVERLOADED_OPERATORS: 10438 llvm_unreachable("not an overloaded operator?"); 10439 } 10440 10441 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10442 if (Callee.isInvalid()) 10443 return ExprError(); 10444 10445 ExprResult First; 10446 if (E->getOperator() == OO_Amp) 10447 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10448 else 10449 First = getDerived().TransformExpr(E->getArg(0)); 10450 if (First.isInvalid()) 10451 return ExprError(); 10452 10453 ExprResult Second; 10454 if (E->getNumArgs() == 2) { 10455 Second = getDerived().TransformExpr(E->getArg(1)); 10456 if (Second.isInvalid()) 10457 return ExprError(); 10458 } 10459 10460 if (!getDerived().AlwaysRebuild() && 10461 Callee.get() == E->getCallee() && 10462 First.get() == E->getArg(0) && 10463 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10464 return SemaRef.MaybeBindToTemporary(E); 10465 10466 Sema::FPContractStateRAII FPContractState(getSema()); 10467 getSema().FPFeatures = E->getFPFeatures(); 10468 10469 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10470 E->getOperatorLoc(), 10471 Callee.get(), 10472 First.get(), 10473 Second.get()); 10474 } 10475 10476 template<typename Derived> 10477 ExprResult 10478 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10479 return getDerived().TransformCallExpr(E); 10480 } 10481 10482 template <typename Derived> 10483 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 10484 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 10485 getSema().CurContext != E->getParentContext(); 10486 10487 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 10488 return E; 10489 10490 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 10491 E->getEndLoc(), 10492 getSema().CurContext); 10493 } 10494 10495 template<typename Derived> 10496 ExprResult 10497 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10498 // Transform the callee. 10499 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10500 if (Callee.isInvalid()) 10501 return ExprError(); 10502 10503 // Transform exec config. 10504 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10505 if (EC.isInvalid()) 10506 return ExprError(); 10507 10508 // Transform arguments. 10509 bool ArgChanged = false; 10510 SmallVector<Expr*, 8> Args; 10511 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10512 &ArgChanged)) 10513 return ExprError(); 10514 10515 if (!getDerived().AlwaysRebuild() && 10516 Callee.get() == E->getCallee() && 10517 !ArgChanged) 10518 return SemaRef.MaybeBindToTemporary(E); 10519 10520 // FIXME: Wrong source location information for the '('. 10521 SourceLocation FakeLParenLoc 10522 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10523 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10524 Args, 10525 E->getRParenLoc(), EC.get()); 10526 } 10527 10528 template<typename Derived> 10529 ExprResult 10530 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10531 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10532 if (!Type) 10533 return ExprError(); 10534 10535 ExprResult SubExpr 10536 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10537 if (SubExpr.isInvalid()) 10538 return ExprError(); 10539 10540 if (!getDerived().AlwaysRebuild() && 10541 Type == E->getTypeInfoAsWritten() && 10542 SubExpr.get() == E->getSubExpr()) 10543 return E; 10544 return getDerived().RebuildCXXNamedCastExpr( 10545 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10546 Type, E->getAngleBrackets().getEnd(), 10547 // FIXME. this should be '(' location 10548 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10549 } 10550 10551 template<typename Derived> 10552 ExprResult 10553 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 10554 TypeSourceInfo *TSI = 10555 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 10556 if (!TSI) 10557 return ExprError(); 10558 10559 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 10560 if (Sub.isInvalid()) 10561 return ExprError(); 10562 10563 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 10564 Sub.get(), BCE->getEndLoc()); 10565 } 10566 10567 template<typename Derived> 10568 ExprResult 10569 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10570 return getDerived().TransformCXXNamedCastExpr(E); 10571 } 10572 10573 template<typename Derived> 10574 ExprResult 10575 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10576 return getDerived().TransformCXXNamedCastExpr(E); 10577 } 10578 10579 template<typename Derived> 10580 ExprResult 10581 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10582 CXXReinterpretCastExpr *E) { 10583 return getDerived().TransformCXXNamedCastExpr(E); 10584 } 10585 10586 template<typename Derived> 10587 ExprResult 10588 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10589 return getDerived().TransformCXXNamedCastExpr(E); 10590 } 10591 10592 template<typename Derived> 10593 ExprResult 10594 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10595 CXXFunctionalCastExpr *E) { 10596 TypeSourceInfo *Type = 10597 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10598 if (!Type) 10599 return ExprError(); 10600 10601 ExprResult SubExpr 10602 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10603 if (SubExpr.isInvalid()) 10604 return ExprError(); 10605 10606 if (!getDerived().AlwaysRebuild() && 10607 Type == E->getTypeInfoAsWritten() && 10608 SubExpr.get() == E->getSubExpr()) 10609 return E; 10610 10611 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10612 E->getLParenLoc(), 10613 SubExpr.get(), 10614 E->getRParenLoc(), 10615 E->isListInitialization()); 10616 } 10617 10618 template<typename Derived> 10619 ExprResult 10620 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10621 if (E->isTypeOperand()) { 10622 TypeSourceInfo *TInfo 10623 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10624 if (!TInfo) 10625 return ExprError(); 10626 10627 if (!getDerived().AlwaysRebuild() && 10628 TInfo == E->getTypeOperandSourceInfo()) 10629 return E; 10630 10631 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10632 TInfo, E->getEndLoc()); 10633 } 10634 10635 // We don't know whether the subexpression is potentially evaluated until 10636 // after we perform semantic analysis. We speculatively assume it is 10637 // unevaluated; it will get fixed later if the subexpression is in fact 10638 // potentially evaluated. 10639 EnterExpressionEvaluationContext Unevaluated( 10640 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10641 Sema::ReuseLambdaContextDecl); 10642 10643 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10644 if (SubExpr.isInvalid()) 10645 return ExprError(); 10646 10647 if (!getDerived().AlwaysRebuild() && 10648 SubExpr.get() == E->getExprOperand()) 10649 return E; 10650 10651 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10652 SubExpr.get(), E->getEndLoc()); 10653 } 10654 10655 template<typename Derived> 10656 ExprResult 10657 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10658 if (E->isTypeOperand()) { 10659 TypeSourceInfo *TInfo 10660 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10661 if (!TInfo) 10662 return ExprError(); 10663 10664 if (!getDerived().AlwaysRebuild() && 10665 TInfo == E->getTypeOperandSourceInfo()) 10666 return E; 10667 10668 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10669 TInfo, E->getEndLoc()); 10670 } 10671 10672 EnterExpressionEvaluationContext Unevaluated( 10673 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10674 10675 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10676 if (SubExpr.isInvalid()) 10677 return ExprError(); 10678 10679 if (!getDerived().AlwaysRebuild() && 10680 SubExpr.get() == E->getExprOperand()) 10681 return E; 10682 10683 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10684 SubExpr.get(), E->getEndLoc()); 10685 } 10686 10687 template<typename Derived> 10688 ExprResult 10689 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10690 return E; 10691 } 10692 10693 template<typename Derived> 10694 ExprResult 10695 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10696 CXXNullPtrLiteralExpr *E) { 10697 return E; 10698 } 10699 10700 template<typename Derived> 10701 ExprResult 10702 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10703 QualType T = getSema().getCurrentThisType(); 10704 10705 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10706 // Mark it referenced in the new context regardless. 10707 // FIXME: this is a bit instantiation-specific. 10708 getSema().MarkThisReferenced(E); 10709 return E; 10710 } 10711 10712 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10713 } 10714 10715 template<typename Derived> 10716 ExprResult 10717 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10718 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10719 if (SubExpr.isInvalid()) 10720 return ExprError(); 10721 10722 if (!getDerived().AlwaysRebuild() && 10723 SubExpr.get() == E->getSubExpr()) 10724 return E; 10725 10726 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10727 E->isThrownVariableInScope()); 10728 } 10729 10730 template<typename Derived> 10731 ExprResult 10732 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10733 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10734 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10735 if (!Param) 10736 return ExprError(); 10737 10738 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 10739 E->getUsedContext() == SemaRef.CurContext) 10740 return E; 10741 10742 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10743 } 10744 10745 template<typename Derived> 10746 ExprResult 10747 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10748 FieldDecl *Field = cast_or_null<FieldDecl>( 10749 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10750 if (!Field) 10751 return ExprError(); 10752 10753 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 10754 E->getUsedContext() == SemaRef.CurContext) 10755 return E; 10756 10757 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10758 } 10759 10760 template<typename Derived> 10761 ExprResult 10762 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10763 CXXScalarValueInitExpr *E) { 10764 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10765 if (!T) 10766 return ExprError(); 10767 10768 if (!getDerived().AlwaysRebuild() && 10769 T == E->getTypeSourceInfo()) 10770 return E; 10771 10772 return getDerived().RebuildCXXScalarValueInitExpr(T, 10773 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10774 E->getRParenLoc()); 10775 } 10776 10777 template<typename Derived> 10778 ExprResult 10779 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10780 // Transform the type that we're allocating 10781 TypeSourceInfo *AllocTypeInfo = 10782 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10783 if (!AllocTypeInfo) 10784 return ExprError(); 10785 10786 // Transform the size of the array we're allocating (if any). 10787 Optional<Expr *> ArraySize; 10788 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 10789 ExprResult NewArraySize; 10790 if (*OldArraySize) { 10791 NewArraySize = getDerived().TransformExpr(*OldArraySize); 10792 if (NewArraySize.isInvalid()) 10793 return ExprError(); 10794 } 10795 ArraySize = NewArraySize.get(); 10796 } 10797 10798 // Transform the placement arguments (if any). 10799 bool ArgumentChanged = false; 10800 SmallVector<Expr*, 8> PlacementArgs; 10801 if (getDerived().TransformExprs(E->getPlacementArgs(), 10802 E->getNumPlacementArgs(), true, 10803 PlacementArgs, &ArgumentChanged)) 10804 return ExprError(); 10805 10806 // Transform the initializer (if any). 10807 Expr *OldInit = E->getInitializer(); 10808 ExprResult NewInit; 10809 if (OldInit) 10810 NewInit = getDerived().TransformInitializer(OldInit, true); 10811 if (NewInit.isInvalid()) 10812 return ExprError(); 10813 10814 // Transform new operator and delete operator. 10815 FunctionDecl *OperatorNew = nullptr; 10816 if (E->getOperatorNew()) { 10817 OperatorNew = cast_or_null<FunctionDecl>( 10818 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10819 if (!OperatorNew) 10820 return ExprError(); 10821 } 10822 10823 FunctionDecl *OperatorDelete = nullptr; 10824 if (E->getOperatorDelete()) { 10825 OperatorDelete = cast_or_null<FunctionDecl>( 10826 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10827 if (!OperatorDelete) 10828 return ExprError(); 10829 } 10830 10831 if (!getDerived().AlwaysRebuild() && 10832 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10833 ArraySize == E->getArraySize() && 10834 NewInit.get() == OldInit && 10835 OperatorNew == E->getOperatorNew() && 10836 OperatorDelete == E->getOperatorDelete() && 10837 !ArgumentChanged) { 10838 // Mark any declarations we need as referenced. 10839 // FIXME: instantiation-specific. 10840 if (OperatorNew) 10841 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10842 if (OperatorDelete) 10843 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10844 10845 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10846 QualType ElementType 10847 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10848 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10849 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10850 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10851 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10852 } 10853 } 10854 } 10855 10856 return E; 10857 } 10858 10859 QualType AllocType = AllocTypeInfo->getType(); 10860 if (!ArraySize) { 10861 // If no array size was specified, but the new expression was 10862 // instantiated with an array type (e.g., "new T" where T is 10863 // instantiated with "int[4]"), extract the outer bound from the 10864 // array type as our array size. We do this with constant and 10865 // dependently-sized array types. 10866 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10867 if (!ArrayT) { 10868 // Do nothing 10869 } else if (const ConstantArrayType *ConsArrayT 10870 = dyn_cast<ConstantArrayType>(ArrayT)) { 10871 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10872 SemaRef.Context.getSizeType(), 10873 /*FIXME:*/ E->getBeginLoc()); 10874 AllocType = ConsArrayT->getElementType(); 10875 } else if (const DependentSizedArrayType *DepArrayT 10876 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10877 if (DepArrayT->getSizeExpr()) { 10878 ArraySize = DepArrayT->getSizeExpr(); 10879 AllocType = DepArrayT->getElementType(); 10880 } 10881 } 10882 } 10883 10884 return getDerived().RebuildCXXNewExpr( 10885 E->getBeginLoc(), E->isGlobalNew(), 10886 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10887 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10888 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 10889 } 10890 10891 template<typename Derived> 10892 ExprResult 10893 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10894 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10895 if (Operand.isInvalid()) 10896 return ExprError(); 10897 10898 // Transform the delete operator, if known. 10899 FunctionDecl *OperatorDelete = nullptr; 10900 if (E->getOperatorDelete()) { 10901 OperatorDelete = cast_or_null<FunctionDecl>( 10902 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10903 if (!OperatorDelete) 10904 return ExprError(); 10905 } 10906 10907 if (!getDerived().AlwaysRebuild() && 10908 Operand.get() == E->getArgument() && 10909 OperatorDelete == E->getOperatorDelete()) { 10910 // Mark any declarations we need as referenced. 10911 // FIXME: instantiation-specific. 10912 if (OperatorDelete) 10913 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10914 10915 if (!E->getArgument()->isTypeDependent()) { 10916 QualType Destroyed = SemaRef.Context.getBaseElementType( 10917 E->getDestroyedType()); 10918 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10919 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10920 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10921 SemaRef.LookupDestructor(Record)); 10922 } 10923 } 10924 10925 return E; 10926 } 10927 10928 return getDerived().RebuildCXXDeleteExpr( 10929 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10930 } 10931 10932 template<typename Derived> 10933 ExprResult 10934 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10935 CXXPseudoDestructorExpr *E) { 10936 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10937 if (Base.isInvalid()) 10938 return ExprError(); 10939 10940 ParsedType ObjectTypePtr; 10941 bool MayBePseudoDestructor = false; 10942 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10943 E->getOperatorLoc(), 10944 E->isArrow()? tok::arrow : tok::period, 10945 ObjectTypePtr, 10946 MayBePseudoDestructor); 10947 if (Base.isInvalid()) 10948 return ExprError(); 10949 10950 QualType ObjectType = ObjectTypePtr.get(); 10951 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10952 if (QualifierLoc) { 10953 QualifierLoc 10954 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10955 if (!QualifierLoc) 10956 return ExprError(); 10957 } 10958 CXXScopeSpec SS; 10959 SS.Adopt(QualifierLoc); 10960 10961 PseudoDestructorTypeStorage Destroyed; 10962 if (E->getDestroyedTypeInfo()) { 10963 TypeSourceInfo *DestroyedTypeInfo 10964 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10965 ObjectType, nullptr, SS); 10966 if (!DestroyedTypeInfo) 10967 return ExprError(); 10968 Destroyed = DestroyedTypeInfo; 10969 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10970 // We aren't likely to be able to resolve the identifier down to a type 10971 // now anyway, so just retain the identifier. 10972 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10973 E->getDestroyedTypeLoc()); 10974 } else { 10975 // Look for a destructor known with the given name. 10976 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10977 *E->getDestroyedTypeIdentifier(), 10978 E->getDestroyedTypeLoc(), 10979 /*Scope=*/nullptr, 10980 SS, ObjectTypePtr, 10981 false); 10982 if (!T) 10983 return ExprError(); 10984 10985 Destroyed 10986 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10987 E->getDestroyedTypeLoc()); 10988 } 10989 10990 TypeSourceInfo *ScopeTypeInfo = nullptr; 10991 if (E->getScopeTypeInfo()) { 10992 CXXScopeSpec EmptySS; 10993 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10994 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10995 if (!ScopeTypeInfo) 10996 return ExprError(); 10997 } 10998 10999 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11000 E->getOperatorLoc(), 11001 E->isArrow(), 11002 SS, 11003 ScopeTypeInfo, 11004 E->getColonColonLoc(), 11005 E->getTildeLoc(), 11006 Destroyed); 11007 } 11008 11009 template <typename Derived> 11010 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11011 bool RequiresADL, 11012 LookupResult &R) { 11013 // Transform all the decls. 11014 bool AllEmptyPacks = true; 11015 for (auto *OldD : Old->decls()) { 11016 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11017 if (!InstD) { 11018 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11019 // This can happen because of dependent hiding. 11020 if (isa<UsingShadowDecl>(OldD)) 11021 continue; 11022 else { 11023 R.clear(); 11024 return true; 11025 } 11026 } 11027 11028 // Expand using pack declarations. 11029 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11030 ArrayRef<NamedDecl*> Decls = SingleDecl; 11031 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11032 Decls = UPD->expansions(); 11033 11034 // Expand using declarations. 11035 for (auto *D : Decls) { 11036 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11037 for (auto *SD : UD->shadows()) 11038 R.addDecl(SD); 11039 } else { 11040 R.addDecl(D); 11041 } 11042 } 11043 11044 AllEmptyPacks &= Decls.empty(); 11045 }; 11046 11047 // C++ [temp.res]/8.4.2: 11048 // The program is ill-formed, no diagnostic required, if [...] lookup for 11049 // a name in the template definition found a using-declaration, but the 11050 // lookup in the corresponding scope in the instantiation odoes not find 11051 // any declarations because the using-declaration was a pack expansion and 11052 // the corresponding pack is empty 11053 if (AllEmptyPacks && !RequiresADL) { 11054 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11055 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11056 return true; 11057 } 11058 11059 // Resolve a kind, but don't do any further analysis. If it's 11060 // ambiguous, the callee needs to deal with it. 11061 R.resolveKind(); 11062 return false; 11063 } 11064 11065 template<typename Derived> 11066 ExprResult 11067 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11068 UnresolvedLookupExpr *Old) { 11069 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11070 Sema::LookupOrdinaryName); 11071 11072 // Transform the declaration set. 11073 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11074 return ExprError(); 11075 11076 // Rebuild the nested-name qualifier, if present. 11077 CXXScopeSpec SS; 11078 if (Old->getQualifierLoc()) { 11079 NestedNameSpecifierLoc QualifierLoc 11080 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11081 if (!QualifierLoc) 11082 return ExprError(); 11083 11084 SS.Adopt(QualifierLoc); 11085 } 11086 11087 if (Old->getNamingClass()) { 11088 CXXRecordDecl *NamingClass 11089 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11090 Old->getNameLoc(), 11091 Old->getNamingClass())); 11092 if (!NamingClass) { 11093 R.clear(); 11094 return ExprError(); 11095 } 11096 11097 R.setNamingClass(NamingClass); 11098 } 11099 11100 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11101 11102 // If we have neither explicit template arguments, nor the template keyword, 11103 // it's a normal declaration name or member reference. 11104 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11105 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11106 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11107 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11108 // give a good diagnostic. 11109 if (D && D->isCXXInstanceMember()) { 11110 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11111 /*TemplateArgs=*/nullptr, 11112 /*Scope=*/nullptr); 11113 } 11114 11115 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11116 } 11117 11118 // If we have template arguments, rebuild them, then rebuild the 11119 // templateid expression. 11120 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11121 if (Old->hasExplicitTemplateArgs() && 11122 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11123 Old->getNumTemplateArgs(), 11124 TransArgs)) { 11125 R.clear(); 11126 return ExprError(); 11127 } 11128 11129 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11130 Old->requiresADL(), &TransArgs); 11131 } 11132 11133 template<typename Derived> 11134 ExprResult 11135 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11136 bool ArgChanged = false; 11137 SmallVector<TypeSourceInfo *, 4> Args; 11138 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11139 TypeSourceInfo *From = E->getArg(I); 11140 TypeLoc FromTL = From->getTypeLoc(); 11141 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11142 TypeLocBuilder TLB; 11143 TLB.reserve(FromTL.getFullDataSize()); 11144 QualType To = getDerived().TransformType(TLB, FromTL); 11145 if (To.isNull()) 11146 return ExprError(); 11147 11148 if (To == From->getType()) 11149 Args.push_back(From); 11150 else { 11151 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11152 ArgChanged = true; 11153 } 11154 continue; 11155 } 11156 11157 ArgChanged = true; 11158 11159 // We have a pack expansion. Instantiate it. 11160 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11161 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11162 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11163 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11164 11165 // Determine whether the set of unexpanded parameter packs can and should 11166 // be expanded. 11167 bool Expand = true; 11168 bool RetainExpansion = false; 11169 Optional<unsigned> OrigNumExpansions = 11170 ExpansionTL.getTypePtr()->getNumExpansions(); 11171 Optional<unsigned> NumExpansions = OrigNumExpansions; 11172 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11173 PatternTL.getSourceRange(), 11174 Unexpanded, 11175 Expand, RetainExpansion, 11176 NumExpansions)) 11177 return ExprError(); 11178 11179 if (!Expand) { 11180 // The transform has determined that we should perform a simple 11181 // transformation on the pack expansion, producing another pack 11182 // expansion. 11183 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11184 11185 TypeLocBuilder TLB; 11186 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11187 11188 QualType To = getDerived().TransformType(TLB, PatternTL); 11189 if (To.isNull()) 11190 return ExprError(); 11191 11192 To = getDerived().RebuildPackExpansionType(To, 11193 PatternTL.getSourceRange(), 11194 ExpansionTL.getEllipsisLoc(), 11195 NumExpansions); 11196 if (To.isNull()) 11197 return ExprError(); 11198 11199 PackExpansionTypeLoc ToExpansionTL 11200 = TLB.push<PackExpansionTypeLoc>(To); 11201 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11202 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11203 continue; 11204 } 11205 11206 // Expand the pack expansion by substituting for each argument in the 11207 // pack(s). 11208 for (unsigned I = 0; I != *NumExpansions; ++I) { 11209 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11210 TypeLocBuilder TLB; 11211 TLB.reserve(PatternTL.getFullDataSize()); 11212 QualType To = getDerived().TransformType(TLB, PatternTL); 11213 if (To.isNull()) 11214 return ExprError(); 11215 11216 if (To->containsUnexpandedParameterPack()) { 11217 To = getDerived().RebuildPackExpansionType(To, 11218 PatternTL.getSourceRange(), 11219 ExpansionTL.getEllipsisLoc(), 11220 NumExpansions); 11221 if (To.isNull()) 11222 return ExprError(); 11223 11224 PackExpansionTypeLoc ToExpansionTL 11225 = TLB.push<PackExpansionTypeLoc>(To); 11226 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11227 } 11228 11229 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11230 } 11231 11232 if (!RetainExpansion) 11233 continue; 11234 11235 // If we're supposed to retain a pack expansion, do so by temporarily 11236 // forgetting the partially-substituted parameter pack. 11237 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11238 11239 TypeLocBuilder TLB; 11240 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11241 11242 QualType To = getDerived().TransformType(TLB, PatternTL); 11243 if (To.isNull()) 11244 return ExprError(); 11245 11246 To = getDerived().RebuildPackExpansionType(To, 11247 PatternTL.getSourceRange(), 11248 ExpansionTL.getEllipsisLoc(), 11249 NumExpansions); 11250 if (To.isNull()) 11251 return ExprError(); 11252 11253 PackExpansionTypeLoc ToExpansionTL 11254 = TLB.push<PackExpansionTypeLoc>(To); 11255 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11256 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11257 } 11258 11259 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11260 return E; 11261 11262 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11263 E->getEndLoc()); 11264 } 11265 11266 template<typename Derived> 11267 ExprResult 11268 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11269 ConceptSpecializationExpr *E) { 11270 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11271 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11272 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11273 Old->NumTemplateArgs, TransArgs)) 11274 return ExprError(); 11275 11276 return getDerived().RebuildConceptSpecializationExpr( 11277 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11278 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11279 &TransArgs); 11280 } 11281 11282 template<typename Derived> 11283 ExprResult 11284 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11285 SmallVector<ParmVarDecl*, 4> TransParams; 11286 SmallVector<QualType, 4> TransParamTypes; 11287 Sema::ExtParameterInfoBuilder ExtParamInfos; 11288 11289 // C++2a [expr.prim.req]p2 11290 // Expressions appearing within a requirement-body are unevaluated operands. 11291 EnterExpressionEvaluationContext Ctx( 11292 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11293 11294 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11295 getSema().Context, E->getBody()->getDeclContext(), 11296 E->getBody()->getBeginLoc()); 11297 11298 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11299 11300 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11301 E->getLocalParameters(), 11302 /*ParamTypes=*/nullptr, 11303 /*ParamInfos=*/nullptr, 11304 TransParamTypes, &TransParams, 11305 ExtParamInfos)) 11306 return ExprError(); 11307 11308 for (ParmVarDecl *Param : TransParams) 11309 Param->setDeclContext(Body); 11310 11311 SmallVector<concepts::Requirement *, 4> TransReqs; 11312 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11313 TransReqs)) 11314 return ExprError(); 11315 11316 for (concepts::Requirement *Req : TransReqs) { 11317 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11318 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11319 ER->getReturnTypeRequirement() 11320 .getTypeConstraintTemplateParameterList()->getParam(0) 11321 ->setDeclContext(Body); 11322 } 11323 } 11324 } 11325 11326 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11327 TransParams, TransReqs, 11328 E->getRBraceLoc()); 11329 } 11330 11331 template<typename Derived> 11332 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11333 ArrayRef<concepts::Requirement *> Reqs, 11334 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11335 for (concepts::Requirement *Req : Reqs) { 11336 concepts::Requirement *TransReq = nullptr; 11337 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11338 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11339 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11340 TransReq = getDerived().TransformExprRequirement(ExprReq); 11341 else 11342 TransReq = getDerived().TransformNestedRequirement( 11343 cast<concepts::NestedRequirement>(Req)); 11344 if (!TransReq) 11345 return true; 11346 Transformed.push_back(TransReq); 11347 } 11348 return false; 11349 } 11350 11351 template<typename Derived> 11352 concepts::TypeRequirement * 11353 TreeTransform<Derived>::TransformTypeRequirement( 11354 concepts::TypeRequirement *Req) { 11355 if (Req->isSubstitutionFailure()) { 11356 if (getDerived().AlwaysRebuild()) 11357 return getDerived().RebuildTypeRequirement( 11358 Req->getSubstitutionDiagnostic()); 11359 return Req; 11360 } 11361 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11362 if (!TransType) 11363 return nullptr; 11364 return getDerived().RebuildTypeRequirement(TransType); 11365 } 11366 11367 template<typename Derived> 11368 concepts::ExprRequirement * 11369 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 11370 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 11371 if (Req->isExprSubstitutionFailure()) 11372 TransExpr = Req->getExprSubstitutionDiagnostic(); 11373 else { 11374 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 11375 if (TransExprRes.isInvalid()) 11376 return nullptr; 11377 TransExpr = TransExprRes.get(); 11378 } 11379 11380 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 11381 const auto &RetReq = Req->getReturnTypeRequirement(); 11382 if (RetReq.isEmpty()) 11383 TransRetReq.emplace(); 11384 else if (RetReq.isSubstitutionFailure()) 11385 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 11386 else if (RetReq.isTypeConstraint()) { 11387 TemplateParameterList *OrigTPL = 11388 RetReq.getTypeConstraintTemplateParameterList(); 11389 TemplateParameterList *TPL = 11390 getDerived().TransformTemplateParameterList(OrigTPL); 11391 if (!TPL) 11392 return nullptr; 11393 TransRetReq.emplace(TPL); 11394 } 11395 assert(TransRetReq.hasValue() && 11396 "All code paths leading here must set TransRetReq"); 11397 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 11398 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 11399 Req->getNoexceptLoc(), 11400 std::move(*TransRetReq)); 11401 return getDerived().RebuildExprRequirement( 11402 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 11403 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 11404 } 11405 11406 template<typename Derived> 11407 concepts::NestedRequirement * 11408 TreeTransform<Derived>::TransformNestedRequirement( 11409 concepts::NestedRequirement *Req) { 11410 if (Req->isSubstitutionFailure()) { 11411 if (getDerived().AlwaysRebuild()) 11412 return getDerived().RebuildNestedRequirement( 11413 Req->getSubstitutionDiagnostic()); 11414 return Req; 11415 } 11416 ExprResult TransConstraint = 11417 getDerived().TransformExpr(Req->getConstraintExpr()); 11418 if (TransConstraint.isInvalid()) 11419 return nullptr; 11420 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 11421 } 11422 11423 template<typename Derived> 11424 ExprResult 11425 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 11426 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 11427 if (!T) 11428 return ExprError(); 11429 11430 if (!getDerived().AlwaysRebuild() && 11431 T == E->getQueriedTypeSourceInfo()) 11432 return E; 11433 11434 ExprResult SubExpr; 11435 { 11436 EnterExpressionEvaluationContext Unevaluated( 11437 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11438 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 11439 if (SubExpr.isInvalid()) 11440 return ExprError(); 11441 11442 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 11443 return E; 11444 } 11445 11446 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 11447 SubExpr.get(), E->getEndLoc()); 11448 } 11449 11450 template<typename Derived> 11451 ExprResult 11452 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 11453 ExprResult SubExpr; 11454 { 11455 EnterExpressionEvaluationContext Unevaluated( 11456 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11457 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 11458 if (SubExpr.isInvalid()) 11459 return ExprError(); 11460 11461 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 11462 return E; 11463 } 11464 11465 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 11466 SubExpr.get(), E->getEndLoc()); 11467 } 11468 11469 template <typename Derived> 11470 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 11471 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 11472 TypeSourceInfo **RecoveryTSI) { 11473 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 11474 DRE, AddrTaken, RecoveryTSI); 11475 11476 // Propagate both errors and recovered types, which return ExprEmpty. 11477 if (!NewDRE.isUsable()) 11478 return NewDRE; 11479 11480 // We got an expr, wrap it up in parens. 11481 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 11482 return PE; 11483 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 11484 PE->getRParen()); 11485 } 11486 11487 template <typename Derived> 11488 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11489 DependentScopeDeclRefExpr *E) { 11490 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 11491 nullptr); 11492 } 11493 11494 template<typename Derived> 11495 ExprResult 11496 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11497 DependentScopeDeclRefExpr *E, 11498 bool IsAddressOfOperand, 11499 TypeSourceInfo **RecoveryTSI) { 11500 assert(E->getQualifierLoc()); 11501 NestedNameSpecifierLoc QualifierLoc 11502 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11503 if (!QualifierLoc) 11504 return ExprError(); 11505 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11506 11507 // TODO: If this is a conversion-function-id, verify that the 11508 // destination type name (if present) resolves the same way after 11509 // instantiation as it did in the local scope. 11510 11511 DeclarationNameInfo NameInfo 11512 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 11513 if (!NameInfo.getName()) 11514 return ExprError(); 11515 11516 if (!E->hasExplicitTemplateArgs()) { 11517 if (!getDerived().AlwaysRebuild() && 11518 QualifierLoc == E->getQualifierLoc() && 11519 // Note: it is sufficient to compare the Name component of NameInfo: 11520 // if name has not changed, DNLoc has not changed either. 11521 NameInfo.getName() == E->getDeclName()) 11522 return E; 11523 11524 return getDerived().RebuildDependentScopeDeclRefExpr( 11525 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 11526 IsAddressOfOperand, RecoveryTSI); 11527 } 11528 11529 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11530 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11531 E->getNumTemplateArgs(), 11532 TransArgs)) 11533 return ExprError(); 11534 11535 return getDerived().RebuildDependentScopeDeclRefExpr( 11536 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 11537 RecoveryTSI); 11538 } 11539 11540 template<typename Derived> 11541 ExprResult 11542 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 11543 // CXXConstructExprs other than for list-initialization and 11544 // CXXTemporaryObjectExpr are always implicit, so when we have 11545 // a 1-argument construction we just transform that argument. 11546 if ((E->getNumArgs() == 1 || 11547 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 11548 (!getDerived().DropCallArgument(E->getArg(0))) && 11549 !E->isListInitialization()) 11550 return getDerived().TransformExpr(E->getArg(0)); 11551 11552 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 11553 11554 QualType T = getDerived().TransformType(E->getType()); 11555 if (T.isNull()) 11556 return ExprError(); 11557 11558 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11559 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11560 if (!Constructor) 11561 return ExprError(); 11562 11563 bool ArgumentChanged = false; 11564 SmallVector<Expr*, 8> Args; 11565 { 11566 EnterExpressionEvaluationContext Context( 11567 getSema(), EnterExpressionEvaluationContext::InitList, 11568 E->isListInitialization()); 11569 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11570 &ArgumentChanged)) 11571 return ExprError(); 11572 } 11573 11574 if (!getDerived().AlwaysRebuild() && 11575 T == E->getType() && 11576 Constructor == E->getConstructor() && 11577 !ArgumentChanged) { 11578 // Mark the constructor as referenced. 11579 // FIXME: Instantiation-specific 11580 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11581 return E; 11582 } 11583 11584 return getDerived().RebuildCXXConstructExpr( 11585 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 11586 E->hadMultipleCandidates(), E->isListInitialization(), 11587 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 11588 E->getConstructionKind(), E->getParenOrBraceRange()); 11589 } 11590 11591 template<typename Derived> 11592 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 11593 CXXInheritedCtorInitExpr *E) { 11594 QualType T = getDerived().TransformType(E->getType()); 11595 if (T.isNull()) 11596 return ExprError(); 11597 11598 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11599 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11600 if (!Constructor) 11601 return ExprError(); 11602 11603 if (!getDerived().AlwaysRebuild() && 11604 T == E->getType() && 11605 Constructor == E->getConstructor()) { 11606 // Mark the constructor as referenced. 11607 // FIXME: Instantiation-specific 11608 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11609 return E; 11610 } 11611 11612 return getDerived().RebuildCXXInheritedCtorInitExpr( 11613 T, E->getLocation(), Constructor, 11614 E->constructsVBase(), E->inheritedFromVBase()); 11615 } 11616 11617 /// Transform a C++ temporary-binding expression. 11618 /// 11619 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 11620 /// transform the subexpression and return that. 11621 template<typename Derived> 11622 ExprResult 11623 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 11624 return getDerived().TransformExpr(E->getSubExpr()); 11625 } 11626 11627 /// Transform a C++ expression that contains cleanups that should 11628 /// be run after the expression is evaluated. 11629 /// 11630 /// Since ExprWithCleanups nodes are implicitly generated, we 11631 /// just transform the subexpression and return that. 11632 template<typename Derived> 11633 ExprResult 11634 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11635 return getDerived().TransformExpr(E->getSubExpr()); 11636 } 11637 11638 template<typename Derived> 11639 ExprResult 11640 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11641 CXXTemporaryObjectExpr *E) { 11642 TypeSourceInfo *T = 11643 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11644 if (!T) 11645 return ExprError(); 11646 11647 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11648 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11649 if (!Constructor) 11650 return ExprError(); 11651 11652 bool ArgumentChanged = false; 11653 SmallVector<Expr*, 8> Args; 11654 Args.reserve(E->getNumArgs()); 11655 { 11656 EnterExpressionEvaluationContext Context( 11657 getSema(), EnterExpressionEvaluationContext::InitList, 11658 E->isListInitialization()); 11659 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11660 &ArgumentChanged)) 11661 return ExprError(); 11662 } 11663 11664 if (!getDerived().AlwaysRebuild() && 11665 T == E->getTypeSourceInfo() && 11666 Constructor == E->getConstructor() && 11667 !ArgumentChanged) { 11668 // FIXME: Instantiation-specific 11669 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11670 return SemaRef.MaybeBindToTemporary(E); 11671 } 11672 11673 // FIXME: We should just pass E->isListInitialization(), but we're not 11674 // prepared to handle list-initialization without a child InitListExpr. 11675 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 11676 return getDerived().RebuildCXXTemporaryObjectExpr( 11677 T, LParenLoc, Args, E->getEndLoc(), 11678 /*ListInitialization=*/LParenLoc.isInvalid()); 11679 } 11680 11681 template<typename Derived> 11682 ExprResult 11683 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 11684 // Transform any init-capture expressions before entering the scope of the 11685 // lambda body, because they are not semantically within that scope. 11686 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 11687 struct TransformedInitCapture { 11688 // The location of the ... if the result is retaining a pack expansion. 11689 SourceLocation EllipsisLoc; 11690 // Zero or more expansions of the init-capture. 11691 SmallVector<InitCaptureInfoTy, 4> Expansions; 11692 }; 11693 SmallVector<TransformedInitCapture, 4> InitCaptures; 11694 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 11695 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11696 CEnd = E->capture_end(); 11697 C != CEnd; ++C) { 11698 if (!E->isInitCapture(C)) 11699 continue; 11700 11701 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 11702 VarDecl *OldVD = C->getCapturedVar(); 11703 11704 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 11705 Optional<unsigned> NumExpansions) { 11706 ExprResult NewExprInitResult = getDerived().TransformInitializer( 11707 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 11708 11709 if (NewExprInitResult.isInvalid()) { 11710 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 11711 return; 11712 } 11713 Expr *NewExprInit = NewExprInitResult.get(); 11714 11715 QualType NewInitCaptureType = 11716 getSema().buildLambdaInitCaptureInitialization( 11717 C->getLocation(), OldVD->getType()->isReferenceType(), 11718 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 11719 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 11720 NewExprInit); 11721 Result.Expansions.push_back( 11722 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 11723 }; 11724 11725 // If this is an init-capture pack, consider expanding the pack now. 11726 if (OldVD->isParameterPack()) { 11727 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 11728 ->getTypeLoc() 11729 .castAs<PackExpansionTypeLoc>(); 11730 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11731 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 11732 11733 // Determine whether the set of unexpanded parameter packs can and should 11734 // be expanded. 11735 bool Expand = true; 11736 bool RetainExpansion = false; 11737 Optional<unsigned> OrigNumExpansions = 11738 ExpansionTL.getTypePtr()->getNumExpansions(); 11739 Optional<unsigned> NumExpansions = OrigNumExpansions; 11740 if (getDerived().TryExpandParameterPacks( 11741 ExpansionTL.getEllipsisLoc(), 11742 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 11743 RetainExpansion, NumExpansions)) 11744 return ExprError(); 11745 if (Expand) { 11746 for (unsigned I = 0; I != *NumExpansions; ++I) { 11747 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11748 SubstInitCapture(SourceLocation(), None); 11749 } 11750 } 11751 if (!Expand || RetainExpansion) { 11752 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11753 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 11754 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 11755 } 11756 } else { 11757 SubstInitCapture(SourceLocation(), None); 11758 } 11759 } 11760 11761 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11762 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11763 11764 // Transform the template parameters, and add them to the current 11765 // instantiation scope. The null case is handled correctly. 11766 auto TPL = getDerived().TransformTemplateParameterList( 11767 E->getTemplateParameterList()); 11768 LSI->GLTemplateParameterList = TPL; 11769 11770 // Transform the type of the original lambda's call operator. 11771 // The transformation MUST be done in the CurrentInstantiationScope since 11772 // it introduces a mapping of the original to the newly created 11773 // transformed parameters. 11774 TypeSourceInfo *NewCallOpTSI = nullptr; 11775 { 11776 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 11777 FunctionProtoTypeLoc OldCallOpFPTL = 11778 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11779 11780 TypeLocBuilder NewCallOpTLBuilder; 11781 SmallVector<QualType, 4> ExceptionStorage; 11782 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11783 QualType NewCallOpType = TransformFunctionProtoType( 11784 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 11785 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11786 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11787 ExceptionStorage, Changed); 11788 }); 11789 if (NewCallOpType.isNull()) 11790 return ExprError(); 11791 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11792 NewCallOpType); 11793 } 11794 11795 // Transform the trailing requires clause 11796 ExprResult NewTrailingRequiresClause; 11797 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 11798 // FIXME: Concepts: Substitution into requires clause should only happen 11799 // when checking satisfaction. 11800 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 11801 11802 // Create the local class that will describe the lambda. 11803 // FIXME: KnownDependent below is wrong when substituting inside a templated 11804 // context that isn't a DeclContext (such as a variable template). 11805 CXXRecordDecl *OldClass = E->getLambdaClass(); 11806 CXXRecordDecl *Class 11807 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11808 NewCallOpTSI, 11809 /*KnownDependent=*/false, 11810 E->getCaptureDefault()); 11811 getDerived().transformedLocalDecl(OldClass, {Class}); 11812 11813 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 11814 if (getDerived().ReplacingOriginal()) 11815 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 11816 OldClass->hasKnownLambdaInternalLinkage(), 11817 OldClass->getLambdaContextDecl()); 11818 11819 // Build the call operator. 11820 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11821 Class, E->getIntroducerRange(), NewCallOpTSI, 11822 E->getCallOperator()->getEndLoc(), 11823 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11824 E->getCallOperator()->getConstexprKind(), 11825 NewTrailingRequiresClause.get()); 11826 11827 LSI->CallOperator = NewCallOperator; 11828 11829 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11830 I != NumParams; ++I) { 11831 auto *P = NewCallOperator->getParamDecl(I); 11832 if (P->hasUninstantiatedDefaultArg()) { 11833 EnterExpressionEvaluationContext Eval( 11834 getSema(), 11835 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11836 ExprResult R = getDerived().TransformExpr( 11837 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11838 P->setDefaultArg(R.get()); 11839 } 11840 } 11841 11842 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11843 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 11844 11845 // Number the lambda for linkage purposes if necessary. 11846 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 11847 11848 // Introduce the context of the call operator. 11849 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11850 /*NewThisContext*/false); 11851 11852 // Enter the scope of the lambda. 11853 getSema().buildLambdaScope(LSI, NewCallOperator, 11854 E->getIntroducerRange(), 11855 E->getCaptureDefault(), 11856 E->getCaptureDefaultLoc(), 11857 E->hasExplicitParameters(), 11858 E->hasExplicitResultType(), 11859 E->isMutable()); 11860 11861 bool Invalid = false; 11862 11863 // Transform captures. 11864 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11865 CEnd = E->capture_end(); 11866 C != CEnd; ++C) { 11867 // When we hit the first implicit capture, tell Sema that we've finished 11868 // the list of explicit captures. 11869 if (C->isImplicit()) 11870 break; 11871 11872 // Capturing 'this' is trivial. 11873 if (C->capturesThis()) { 11874 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11875 /*BuildAndDiagnose*/ true, nullptr, 11876 C->getCaptureKind() == LCK_StarThis); 11877 continue; 11878 } 11879 // Captured expression will be recaptured during captured variables 11880 // rebuilding. 11881 if (C->capturesVLAType()) 11882 continue; 11883 11884 // Rebuild init-captures, including the implied field declaration. 11885 if (E->isInitCapture(C)) { 11886 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 11887 11888 VarDecl *OldVD = C->getCapturedVar(); 11889 llvm::SmallVector<Decl*, 4> NewVDs; 11890 11891 for (InitCaptureInfoTy &Info : NewC.Expansions) { 11892 ExprResult Init = Info.first; 11893 QualType InitQualType = Info.second; 11894 if (Init.isInvalid() || InitQualType.isNull()) { 11895 Invalid = true; 11896 break; 11897 } 11898 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11899 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 11900 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 11901 if (!NewVD) { 11902 Invalid = true; 11903 break; 11904 } 11905 NewVDs.push_back(NewVD); 11906 getSema().addInitCapture(LSI, NewVD); 11907 } 11908 11909 if (Invalid) 11910 break; 11911 11912 getDerived().transformedLocalDecl(OldVD, NewVDs); 11913 continue; 11914 } 11915 11916 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11917 11918 // Determine the capture kind for Sema. 11919 Sema::TryCaptureKind Kind 11920 = C->isImplicit()? Sema::TryCapture_Implicit 11921 : C->getCaptureKind() == LCK_ByCopy 11922 ? Sema::TryCapture_ExplicitByVal 11923 : Sema::TryCapture_ExplicitByRef; 11924 SourceLocation EllipsisLoc; 11925 if (C->isPackExpansion()) { 11926 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11927 bool ShouldExpand = false; 11928 bool RetainExpansion = false; 11929 Optional<unsigned> NumExpansions; 11930 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11931 C->getLocation(), 11932 Unexpanded, 11933 ShouldExpand, RetainExpansion, 11934 NumExpansions)) { 11935 Invalid = true; 11936 continue; 11937 } 11938 11939 if (ShouldExpand) { 11940 // The transform has determined that we should perform an expansion; 11941 // transform and capture each of the arguments. 11942 // expansion of the pattern. Do so. 11943 VarDecl *Pack = C->getCapturedVar(); 11944 for (unsigned I = 0; I != *NumExpansions; ++I) { 11945 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11946 VarDecl *CapturedVar 11947 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11948 Pack)); 11949 if (!CapturedVar) { 11950 Invalid = true; 11951 continue; 11952 } 11953 11954 // Capture the transformed variable. 11955 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11956 } 11957 11958 // FIXME: Retain a pack expansion if RetainExpansion is true. 11959 11960 continue; 11961 } 11962 11963 EllipsisLoc = C->getEllipsisLoc(); 11964 } 11965 11966 // Transform the captured variable. 11967 VarDecl *CapturedVar 11968 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11969 C->getCapturedVar())); 11970 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11971 Invalid = true; 11972 continue; 11973 } 11974 11975 // Capture the transformed variable. 11976 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 11977 EllipsisLoc); 11978 } 11979 getSema().finishLambdaExplicitCaptures(LSI); 11980 11981 // FIXME: Sema's lambda-building mechanism expects us to push an expression 11982 // evaluation context even if we're not transforming the function body. 11983 getSema().PushExpressionEvaluationContext( 11984 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 11985 11986 // Instantiate the body of the lambda expression. 11987 StmtResult Body = 11988 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 11989 11990 // ActOnLambda* will pop the function scope for us. 11991 FuncScopeCleanup.disable(); 11992 11993 if (Body.isInvalid()) { 11994 SavedContext.pop(); 11995 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 11996 /*IsInstantiation=*/true); 11997 return ExprError(); 11998 } 11999 12000 // Copy the LSI before ActOnFinishFunctionBody removes it. 12001 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12002 // the call operator. 12003 auto LSICopy = *LSI; 12004 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12005 /*IsInstantiation*/ true); 12006 SavedContext.pop(); 12007 12008 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12009 &LSICopy); 12010 } 12011 12012 template<typename Derived> 12013 StmtResult 12014 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12015 return TransformStmt(S); 12016 } 12017 12018 template<typename Derived> 12019 StmtResult 12020 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12021 // Transform captures. 12022 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12023 CEnd = E->capture_end(); 12024 C != CEnd; ++C) { 12025 // When we hit the first implicit capture, tell Sema that we've finished 12026 // the list of explicit captures. 12027 if (!C->isImplicit()) 12028 continue; 12029 12030 // Capturing 'this' is trivial. 12031 if (C->capturesThis()) { 12032 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12033 /*BuildAndDiagnose*/ true, nullptr, 12034 C->getCaptureKind() == LCK_StarThis); 12035 continue; 12036 } 12037 // Captured expression will be recaptured during captured variables 12038 // rebuilding. 12039 if (C->capturesVLAType()) 12040 continue; 12041 12042 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12043 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12044 12045 // Transform the captured variable. 12046 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12047 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12048 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12049 return StmtError(); 12050 12051 // Capture the transformed variable. 12052 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12053 } 12054 12055 return S; 12056 } 12057 12058 template<typename Derived> 12059 ExprResult 12060 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12061 CXXUnresolvedConstructExpr *E) { 12062 TypeSourceInfo *T = 12063 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12064 if (!T) 12065 return ExprError(); 12066 12067 bool ArgumentChanged = false; 12068 SmallVector<Expr*, 8> Args; 12069 Args.reserve(E->arg_size()); 12070 { 12071 EnterExpressionEvaluationContext Context( 12072 getSema(), EnterExpressionEvaluationContext::InitList, 12073 E->isListInitialization()); 12074 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12075 &ArgumentChanged)) 12076 return ExprError(); 12077 } 12078 12079 if (!getDerived().AlwaysRebuild() && 12080 T == E->getTypeSourceInfo() && 12081 !ArgumentChanged) 12082 return E; 12083 12084 // FIXME: we're faking the locations of the commas 12085 return getDerived().RebuildCXXUnresolvedConstructExpr( 12086 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12087 } 12088 12089 template<typename Derived> 12090 ExprResult 12091 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12092 CXXDependentScopeMemberExpr *E) { 12093 // Transform the base of the expression. 12094 ExprResult Base((Expr*) nullptr); 12095 Expr *OldBase; 12096 QualType BaseType; 12097 QualType ObjectType; 12098 if (!E->isImplicitAccess()) { 12099 OldBase = E->getBase(); 12100 Base = getDerived().TransformExpr(OldBase); 12101 if (Base.isInvalid()) 12102 return ExprError(); 12103 12104 // Start the member reference and compute the object's type. 12105 ParsedType ObjectTy; 12106 bool MayBePseudoDestructor = false; 12107 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12108 E->getOperatorLoc(), 12109 E->isArrow()? tok::arrow : tok::period, 12110 ObjectTy, 12111 MayBePseudoDestructor); 12112 if (Base.isInvalid()) 12113 return ExprError(); 12114 12115 ObjectType = ObjectTy.get(); 12116 BaseType = ((Expr*) Base.get())->getType(); 12117 } else { 12118 OldBase = nullptr; 12119 BaseType = getDerived().TransformType(E->getBaseType()); 12120 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12121 } 12122 12123 // Transform the first part of the nested-name-specifier that qualifies 12124 // the member name. 12125 NamedDecl *FirstQualifierInScope 12126 = getDerived().TransformFirstQualifierInScope( 12127 E->getFirstQualifierFoundInScope(), 12128 E->getQualifierLoc().getBeginLoc()); 12129 12130 NestedNameSpecifierLoc QualifierLoc; 12131 if (E->getQualifier()) { 12132 QualifierLoc 12133 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12134 ObjectType, 12135 FirstQualifierInScope); 12136 if (!QualifierLoc) 12137 return ExprError(); 12138 } 12139 12140 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12141 12142 // TODO: If this is a conversion-function-id, verify that the 12143 // destination type name (if present) resolves the same way after 12144 // instantiation as it did in the local scope. 12145 12146 DeclarationNameInfo NameInfo 12147 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12148 if (!NameInfo.getName()) 12149 return ExprError(); 12150 12151 if (!E->hasExplicitTemplateArgs()) { 12152 // This is a reference to a member without an explicitly-specified 12153 // template argument list. Optimize for this common case. 12154 if (!getDerived().AlwaysRebuild() && 12155 Base.get() == OldBase && 12156 BaseType == E->getBaseType() && 12157 QualifierLoc == E->getQualifierLoc() && 12158 NameInfo.getName() == E->getMember() && 12159 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12160 return E; 12161 12162 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12163 BaseType, 12164 E->isArrow(), 12165 E->getOperatorLoc(), 12166 QualifierLoc, 12167 TemplateKWLoc, 12168 FirstQualifierInScope, 12169 NameInfo, 12170 /*TemplateArgs*/nullptr); 12171 } 12172 12173 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12174 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12175 E->getNumTemplateArgs(), 12176 TransArgs)) 12177 return ExprError(); 12178 12179 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12180 BaseType, 12181 E->isArrow(), 12182 E->getOperatorLoc(), 12183 QualifierLoc, 12184 TemplateKWLoc, 12185 FirstQualifierInScope, 12186 NameInfo, 12187 &TransArgs); 12188 } 12189 12190 template<typename Derived> 12191 ExprResult 12192 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12193 // Transform the base of the expression. 12194 ExprResult Base((Expr*) nullptr); 12195 QualType BaseType; 12196 if (!Old->isImplicitAccess()) { 12197 Base = getDerived().TransformExpr(Old->getBase()); 12198 if (Base.isInvalid()) 12199 return ExprError(); 12200 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12201 Old->isArrow()); 12202 if (Base.isInvalid()) 12203 return ExprError(); 12204 BaseType = Base.get()->getType(); 12205 } else { 12206 BaseType = getDerived().TransformType(Old->getBaseType()); 12207 } 12208 12209 NestedNameSpecifierLoc QualifierLoc; 12210 if (Old->getQualifierLoc()) { 12211 QualifierLoc 12212 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12213 if (!QualifierLoc) 12214 return ExprError(); 12215 } 12216 12217 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12218 12219 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12220 Sema::LookupOrdinaryName); 12221 12222 // Transform the declaration set. 12223 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12224 return ExprError(); 12225 12226 // Determine the naming class. 12227 if (Old->getNamingClass()) { 12228 CXXRecordDecl *NamingClass 12229 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12230 Old->getMemberLoc(), 12231 Old->getNamingClass())); 12232 if (!NamingClass) 12233 return ExprError(); 12234 12235 R.setNamingClass(NamingClass); 12236 } 12237 12238 TemplateArgumentListInfo TransArgs; 12239 if (Old->hasExplicitTemplateArgs()) { 12240 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12241 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12242 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12243 Old->getNumTemplateArgs(), 12244 TransArgs)) 12245 return ExprError(); 12246 } 12247 12248 // FIXME: to do this check properly, we will need to preserve the 12249 // first-qualifier-in-scope here, just in case we had a dependent 12250 // base (and therefore couldn't do the check) and a 12251 // nested-name-qualifier (and therefore could do the lookup). 12252 NamedDecl *FirstQualifierInScope = nullptr; 12253 12254 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12255 BaseType, 12256 Old->getOperatorLoc(), 12257 Old->isArrow(), 12258 QualifierLoc, 12259 TemplateKWLoc, 12260 FirstQualifierInScope, 12261 R, 12262 (Old->hasExplicitTemplateArgs() 12263 ? &TransArgs : nullptr)); 12264 } 12265 12266 template<typename Derived> 12267 ExprResult 12268 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12269 EnterExpressionEvaluationContext Unevaluated( 12270 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12271 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12272 if (SubExpr.isInvalid()) 12273 return ExprError(); 12274 12275 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12276 return E; 12277 12278 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12279 } 12280 12281 template<typename Derived> 12282 ExprResult 12283 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12284 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12285 if (Pattern.isInvalid()) 12286 return ExprError(); 12287 12288 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12289 return E; 12290 12291 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12292 E->getNumExpansions()); 12293 } 12294 12295 template<typename Derived> 12296 ExprResult 12297 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12298 // If E is not value-dependent, then nothing will change when we transform it. 12299 // Note: This is an instantiation-centric view. 12300 if (!E->isValueDependent()) 12301 return E; 12302 12303 EnterExpressionEvaluationContext Unevaluated( 12304 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12305 12306 ArrayRef<TemplateArgument> PackArgs; 12307 TemplateArgument ArgStorage; 12308 12309 // Find the argument list to transform. 12310 if (E->isPartiallySubstituted()) { 12311 PackArgs = E->getPartialArguments(); 12312 } else if (E->isValueDependent()) { 12313 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12314 bool ShouldExpand = false; 12315 bool RetainExpansion = false; 12316 Optional<unsigned> NumExpansions; 12317 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12318 Unexpanded, 12319 ShouldExpand, RetainExpansion, 12320 NumExpansions)) 12321 return ExprError(); 12322 12323 // If we need to expand the pack, build a template argument from it and 12324 // expand that. 12325 if (ShouldExpand) { 12326 auto *Pack = E->getPack(); 12327 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12328 ArgStorage = getSema().Context.getPackExpansionType( 12329 getSema().Context.getTypeDeclType(TTPD), None); 12330 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12331 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12332 } else { 12333 auto *VD = cast<ValueDecl>(Pack); 12334 ExprResult DRE = getSema().BuildDeclRefExpr( 12335 VD, VD->getType().getNonLValueExprType(getSema().Context), 12336 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12337 E->getPackLoc()); 12338 if (DRE.isInvalid()) 12339 return ExprError(); 12340 ArgStorage = new (getSema().Context) PackExpansionExpr( 12341 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12342 } 12343 PackArgs = ArgStorage; 12344 } 12345 } 12346 12347 // If we're not expanding the pack, just transform the decl. 12348 if (!PackArgs.size()) { 12349 auto *Pack = cast_or_null<NamedDecl>( 12350 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12351 if (!Pack) 12352 return ExprError(); 12353 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12354 E->getPackLoc(), 12355 E->getRParenLoc(), None, None); 12356 } 12357 12358 // Try to compute the result without performing a partial substitution. 12359 Optional<unsigned> Result = 0; 12360 for (const TemplateArgument &Arg : PackArgs) { 12361 if (!Arg.isPackExpansion()) { 12362 Result = *Result + 1; 12363 continue; 12364 } 12365 12366 TemplateArgumentLoc ArgLoc; 12367 InventTemplateArgumentLoc(Arg, ArgLoc); 12368 12369 // Find the pattern of the pack expansion. 12370 SourceLocation Ellipsis; 12371 Optional<unsigned> OrigNumExpansions; 12372 TemplateArgumentLoc Pattern = 12373 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12374 OrigNumExpansions); 12375 12376 // Substitute under the pack expansion. Do not expand the pack (yet). 12377 TemplateArgumentLoc OutPattern; 12378 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12379 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 12380 /*Uneval*/ true)) 12381 return true; 12382 12383 // See if we can determine the number of arguments from the result. 12384 Optional<unsigned> NumExpansions = 12385 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 12386 if (!NumExpansions) { 12387 // No: we must be in an alias template expansion, and we're going to need 12388 // to actually expand the packs. 12389 Result = None; 12390 break; 12391 } 12392 12393 Result = *Result + *NumExpansions; 12394 } 12395 12396 // Common case: we could determine the number of expansions without 12397 // substituting. 12398 if (Result) 12399 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12400 E->getPackLoc(), 12401 E->getRParenLoc(), *Result, None); 12402 12403 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 12404 E->getPackLoc()); 12405 { 12406 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 12407 typedef TemplateArgumentLocInventIterator< 12408 Derived, const TemplateArgument*> PackLocIterator; 12409 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 12410 PackLocIterator(*this, PackArgs.end()), 12411 TransformedPackArgs, /*Uneval*/true)) 12412 return ExprError(); 12413 } 12414 12415 // Check whether we managed to fully-expand the pack. 12416 // FIXME: Is it possible for us to do so and not hit the early exit path? 12417 SmallVector<TemplateArgument, 8> Args; 12418 bool PartialSubstitution = false; 12419 for (auto &Loc : TransformedPackArgs.arguments()) { 12420 Args.push_back(Loc.getArgument()); 12421 if (Loc.getArgument().isPackExpansion()) 12422 PartialSubstitution = true; 12423 } 12424 12425 if (PartialSubstitution) 12426 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12427 E->getPackLoc(), 12428 E->getRParenLoc(), None, Args); 12429 12430 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12431 E->getPackLoc(), E->getRParenLoc(), 12432 Args.size(), None); 12433 } 12434 12435 template<typename Derived> 12436 ExprResult 12437 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 12438 SubstNonTypeTemplateParmPackExpr *E) { 12439 // Default behavior is to do nothing with this transformation. 12440 return E; 12441 } 12442 12443 template<typename Derived> 12444 ExprResult 12445 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 12446 SubstNonTypeTemplateParmExpr *E) { 12447 // Default behavior is to do nothing with this transformation. 12448 return E; 12449 } 12450 12451 template<typename Derived> 12452 ExprResult 12453 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 12454 // Default behavior is to do nothing with this transformation. 12455 return E; 12456 } 12457 12458 template<typename Derived> 12459 ExprResult 12460 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 12461 MaterializeTemporaryExpr *E) { 12462 return getDerived().TransformExpr(E->getSubExpr()); 12463 } 12464 12465 template<typename Derived> 12466 ExprResult 12467 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 12468 Expr *Pattern = E->getPattern(); 12469 12470 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12471 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 12472 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12473 12474 // Determine whether the set of unexpanded parameter packs can and should 12475 // be expanded. 12476 bool Expand = true; 12477 bool RetainExpansion = false; 12478 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 12479 NumExpansions = OrigNumExpansions; 12480 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 12481 Pattern->getSourceRange(), 12482 Unexpanded, 12483 Expand, RetainExpansion, 12484 NumExpansions)) 12485 return true; 12486 12487 if (!Expand) { 12488 // Do not expand any packs here, just transform and rebuild a fold 12489 // expression. 12490 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12491 12492 ExprResult LHS = 12493 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 12494 if (LHS.isInvalid()) 12495 return true; 12496 12497 ExprResult RHS = 12498 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 12499 if (RHS.isInvalid()) 12500 return true; 12501 12502 if (!getDerived().AlwaysRebuild() && 12503 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 12504 return E; 12505 12506 return getDerived().RebuildCXXFoldExpr( 12507 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 12508 RHS.get(), E->getEndLoc(), NumExpansions); 12509 } 12510 12511 // The transform has determined that we should perform an elementwise 12512 // expansion of the pattern. Do so. 12513 ExprResult Result = getDerived().TransformExpr(E->getInit()); 12514 if (Result.isInvalid()) 12515 return true; 12516 bool LeftFold = E->isLeftFold(); 12517 12518 // If we're retaining an expansion for a right fold, it is the innermost 12519 // component and takes the init (if any). 12520 if (!LeftFold && RetainExpansion) { 12521 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12522 12523 ExprResult Out = getDerived().TransformExpr(Pattern); 12524 if (Out.isInvalid()) 12525 return true; 12526 12527 Result = getDerived().RebuildCXXFoldExpr( 12528 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 12529 Result.get(), E->getEndLoc(), OrigNumExpansions); 12530 if (Result.isInvalid()) 12531 return true; 12532 } 12533 12534 for (unsigned I = 0; I != *NumExpansions; ++I) { 12535 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 12536 getSema(), LeftFold ? I : *NumExpansions - I - 1); 12537 ExprResult Out = getDerived().TransformExpr(Pattern); 12538 if (Out.isInvalid()) 12539 return true; 12540 12541 if (Out.get()->containsUnexpandedParameterPack()) { 12542 // We still have a pack; retain a pack expansion for this slice. 12543 Result = getDerived().RebuildCXXFoldExpr( 12544 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 12545 E->getOperator(), E->getEllipsisLoc(), 12546 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 12547 OrigNumExpansions); 12548 } else if (Result.isUsable()) { 12549 // We've got down to a single element; build a binary operator. 12550 Result = getDerived().RebuildBinaryOperator( 12551 E->getEllipsisLoc(), E->getOperator(), 12552 LeftFold ? Result.get() : Out.get(), 12553 LeftFold ? Out.get() : Result.get()); 12554 } else 12555 Result = Out; 12556 12557 if (Result.isInvalid()) 12558 return true; 12559 } 12560 12561 // If we're retaining an expansion for a left fold, it is the outermost 12562 // component and takes the complete expansion so far as its init (if any). 12563 if (LeftFold && RetainExpansion) { 12564 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12565 12566 ExprResult Out = getDerived().TransformExpr(Pattern); 12567 if (Out.isInvalid()) 12568 return true; 12569 12570 Result = getDerived().RebuildCXXFoldExpr( 12571 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 12572 Out.get(), E->getEndLoc(), OrigNumExpansions); 12573 if (Result.isInvalid()) 12574 return true; 12575 } 12576 12577 // If we had no init and an empty pack, and we're not retaining an expansion, 12578 // then produce a fallback value or error. 12579 if (Result.isUnset()) 12580 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 12581 E->getOperator()); 12582 12583 return Result; 12584 } 12585 12586 template<typename Derived> 12587 ExprResult 12588 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 12589 CXXStdInitializerListExpr *E) { 12590 return getDerived().TransformExpr(E->getSubExpr()); 12591 } 12592 12593 template<typename Derived> 12594 ExprResult 12595 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 12596 return SemaRef.MaybeBindToTemporary(E); 12597 } 12598 12599 template<typename Derived> 12600 ExprResult 12601 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 12602 return E; 12603 } 12604 12605 template<typename Derived> 12606 ExprResult 12607 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 12608 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12609 if (SubExpr.isInvalid()) 12610 return ExprError(); 12611 12612 if (!getDerived().AlwaysRebuild() && 12613 SubExpr.get() == E->getSubExpr()) 12614 return E; 12615 12616 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 12617 } 12618 12619 template<typename Derived> 12620 ExprResult 12621 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 12622 // Transform each of the elements. 12623 SmallVector<Expr *, 8> Elements; 12624 bool ArgChanged = false; 12625 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 12626 /*IsCall=*/false, Elements, &ArgChanged)) 12627 return ExprError(); 12628 12629 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12630 return SemaRef.MaybeBindToTemporary(E); 12631 12632 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 12633 Elements.data(), 12634 Elements.size()); 12635 } 12636 12637 template<typename Derived> 12638 ExprResult 12639 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 12640 ObjCDictionaryLiteral *E) { 12641 // Transform each of the elements. 12642 SmallVector<ObjCDictionaryElement, 8> Elements; 12643 bool ArgChanged = false; 12644 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 12645 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 12646 12647 if (OrigElement.isPackExpansion()) { 12648 // This key/value element is a pack expansion. 12649 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12650 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 12651 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 12652 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12653 12654 // Determine whether the set of unexpanded parameter packs can 12655 // and should be expanded. 12656 bool Expand = true; 12657 bool RetainExpansion = false; 12658 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 12659 Optional<unsigned> NumExpansions = OrigNumExpansions; 12660 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 12661 OrigElement.Value->getEndLoc()); 12662 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 12663 PatternRange, Unexpanded, Expand, 12664 RetainExpansion, NumExpansions)) 12665 return ExprError(); 12666 12667 if (!Expand) { 12668 // The transform has determined that we should perform a simple 12669 // transformation on the pack expansion, producing another pack 12670 // expansion. 12671 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12672 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12673 if (Key.isInvalid()) 12674 return ExprError(); 12675 12676 if (Key.get() != OrigElement.Key) 12677 ArgChanged = true; 12678 12679 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 12680 if (Value.isInvalid()) 12681 return ExprError(); 12682 12683 if (Value.get() != OrigElement.Value) 12684 ArgChanged = true; 12685 12686 ObjCDictionaryElement Expansion = { 12687 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 12688 }; 12689 Elements.push_back(Expansion); 12690 continue; 12691 } 12692 12693 // Record right away that the argument was changed. This needs 12694 // to happen even if the array expands to nothing. 12695 ArgChanged = true; 12696 12697 // The transform has determined that we should perform an elementwise 12698 // expansion of the pattern. Do so. 12699 for (unsigned I = 0; I != *NumExpansions; ++I) { 12700 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12701 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12702 if (Key.isInvalid()) 12703 return ExprError(); 12704 12705 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 12706 if (Value.isInvalid()) 12707 return ExprError(); 12708 12709 ObjCDictionaryElement Element = { 12710 Key.get(), Value.get(), SourceLocation(), NumExpansions 12711 }; 12712 12713 // If any unexpanded parameter packs remain, we still have a 12714 // pack expansion. 12715 // FIXME: Can this really happen? 12716 if (Key.get()->containsUnexpandedParameterPack() || 12717 Value.get()->containsUnexpandedParameterPack()) 12718 Element.EllipsisLoc = OrigElement.EllipsisLoc; 12719 12720 Elements.push_back(Element); 12721 } 12722 12723 // FIXME: Retain a pack expansion if RetainExpansion is true. 12724 12725 // We've finished with this pack expansion. 12726 continue; 12727 } 12728 12729 // Transform and check key. 12730 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12731 if (Key.isInvalid()) 12732 return ExprError(); 12733 12734 if (Key.get() != OrigElement.Key) 12735 ArgChanged = true; 12736 12737 // Transform and check value. 12738 ExprResult Value 12739 = getDerived().TransformExpr(OrigElement.Value); 12740 if (Value.isInvalid()) 12741 return ExprError(); 12742 12743 if (Value.get() != OrigElement.Value) 12744 ArgChanged = true; 12745 12746 ObjCDictionaryElement Element = { 12747 Key.get(), Value.get(), SourceLocation(), None 12748 }; 12749 Elements.push_back(Element); 12750 } 12751 12752 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12753 return SemaRef.MaybeBindToTemporary(E); 12754 12755 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 12756 Elements); 12757 } 12758 12759 template<typename Derived> 12760 ExprResult 12761 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 12762 TypeSourceInfo *EncodedTypeInfo 12763 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 12764 if (!EncodedTypeInfo) 12765 return ExprError(); 12766 12767 if (!getDerived().AlwaysRebuild() && 12768 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 12769 return E; 12770 12771 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 12772 EncodedTypeInfo, 12773 E->getRParenLoc()); 12774 } 12775 12776 template<typename Derived> 12777 ExprResult TreeTransform<Derived>:: 12778 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 12779 // This is a kind of implicit conversion, and it needs to get dropped 12780 // and recomputed for the same general reasons that ImplicitCastExprs 12781 // do, as well a more specific one: this expression is only valid when 12782 // it appears *immediately* as an argument expression. 12783 return getDerived().TransformExpr(E->getSubExpr()); 12784 } 12785 12786 template<typename Derived> 12787 ExprResult TreeTransform<Derived>:: 12788 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 12789 TypeSourceInfo *TSInfo 12790 = getDerived().TransformType(E->getTypeInfoAsWritten()); 12791 if (!TSInfo) 12792 return ExprError(); 12793 12794 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 12795 if (Result.isInvalid()) 12796 return ExprError(); 12797 12798 if (!getDerived().AlwaysRebuild() && 12799 TSInfo == E->getTypeInfoAsWritten() && 12800 Result.get() == E->getSubExpr()) 12801 return E; 12802 12803 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 12804 E->getBridgeKeywordLoc(), TSInfo, 12805 Result.get()); 12806 } 12807 12808 template <typename Derived> 12809 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 12810 ObjCAvailabilityCheckExpr *E) { 12811 return E; 12812 } 12813 12814 template<typename Derived> 12815 ExprResult 12816 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 12817 // Transform arguments. 12818 bool ArgChanged = false; 12819 SmallVector<Expr*, 8> Args; 12820 Args.reserve(E->getNumArgs()); 12821 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 12822 &ArgChanged)) 12823 return ExprError(); 12824 12825 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 12826 // Class message: transform the receiver type. 12827 TypeSourceInfo *ReceiverTypeInfo 12828 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 12829 if (!ReceiverTypeInfo) 12830 return ExprError(); 12831 12832 // If nothing changed, just retain the existing message send. 12833 if (!getDerived().AlwaysRebuild() && 12834 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 12835 return SemaRef.MaybeBindToTemporary(E); 12836 12837 // Build a new class message send. 12838 SmallVector<SourceLocation, 16> SelLocs; 12839 E->getSelectorLocs(SelLocs); 12840 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 12841 E->getSelector(), 12842 SelLocs, 12843 E->getMethodDecl(), 12844 E->getLeftLoc(), 12845 Args, 12846 E->getRightLoc()); 12847 } 12848 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12849 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12850 if (!E->getMethodDecl()) 12851 return ExprError(); 12852 12853 // Build a new class message send to 'super'. 12854 SmallVector<SourceLocation, 16> SelLocs; 12855 E->getSelectorLocs(SelLocs); 12856 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12857 E->getSelector(), 12858 SelLocs, 12859 E->getReceiverType(), 12860 E->getMethodDecl(), 12861 E->getLeftLoc(), 12862 Args, 12863 E->getRightLoc()); 12864 } 12865 12866 // Instance message: transform the receiver 12867 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12868 "Only class and instance messages may be instantiated"); 12869 ExprResult Receiver 12870 = getDerived().TransformExpr(E->getInstanceReceiver()); 12871 if (Receiver.isInvalid()) 12872 return ExprError(); 12873 12874 // If nothing changed, just retain the existing message send. 12875 if (!getDerived().AlwaysRebuild() && 12876 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12877 return SemaRef.MaybeBindToTemporary(E); 12878 12879 // Build a new instance message send. 12880 SmallVector<SourceLocation, 16> SelLocs; 12881 E->getSelectorLocs(SelLocs); 12882 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12883 E->getSelector(), 12884 SelLocs, 12885 E->getMethodDecl(), 12886 E->getLeftLoc(), 12887 Args, 12888 E->getRightLoc()); 12889 } 12890 12891 template<typename Derived> 12892 ExprResult 12893 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12894 return E; 12895 } 12896 12897 template<typename Derived> 12898 ExprResult 12899 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12900 return E; 12901 } 12902 12903 template<typename Derived> 12904 ExprResult 12905 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12906 // Transform the base expression. 12907 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12908 if (Base.isInvalid()) 12909 return ExprError(); 12910 12911 // We don't need to transform the ivar; it will never change. 12912 12913 // If nothing changed, just retain the existing expression. 12914 if (!getDerived().AlwaysRebuild() && 12915 Base.get() == E->getBase()) 12916 return E; 12917 12918 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12919 E->getLocation(), 12920 E->isArrow(), E->isFreeIvar()); 12921 } 12922 12923 template<typename Derived> 12924 ExprResult 12925 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12926 // 'super' and types never change. Property never changes. Just 12927 // retain the existing expression. 12928 if (!E->isObjectReceiver()) 12929 return E; 12930 12931 // Transform the base expression. 12932 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12933 if (Base.isInvalid()) 12934 return ExprError(); 12935 12936 // We don't need to transform the property; it will never change. 12937 12938 // If nothing changed, just retain the existing expression. 12939 if (!getDerived().AlwaysRebuild() && 12940 Base.get() == E->getBase()) 12941 return E; 12942 12943 if (E->isExplicitProperty()) 12944 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12945 E->getExplicitProperty(), 12946 E->getLocation()); 12947 12948 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12949 SemaRef.Context.PseudoObjectTy, 12950 E->getImplicitPropertyGetter(), 12951 E->getImplicitPropertySetter(), 12952 E->getLocation()); 12953 } 12954 12955 template<typename Derived> 12956 ExprResult 12957 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12958 // Transform the base expression. 12959 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12960 if (Base.isInvalid()) 12961 return ExprError(); 12962 12963 // Transform the key expression. 12964 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12965 if (Key.isInvalid()) 12966 return ExprError(); 12967 12968 // If nothing changed, just retain the existing expression. 12969 if (!getDerived().AlwaysRebuild() && 12970 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12971 return E; 12972 12973 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 12974 Base.get(), Key.get(), 12975 E->getAtIndexMethodDecl(), 12976 E->setAtIndexMethodDecl()); 12977 } 12978 12979 template<typename Derived> 12980 ExprResult 12981 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 12982 // Transform the base expression. 12983 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12984 if (Base.isInvalid()) 12985 return ExprError(); 12986 12987 // If nothing changed, just retain the existing expression. 12988 if (!getDerived().AlwaysRebuild() && 12989 Base.get() == E->getBase()) 12990 return E; 12991 12992 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 12993 E->getOpLoc(), 12994 E->isArrow()); 12995 } 12996 12997 template<typename Derived> 12998 ExprResult 12999 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13000 bool ArgumentChanged = false; 13001 SmallVector<Expr*, 8> SubExprs; 13002 SubExprs.reserve(E->getNumSubExprs()); 13003 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13004 SubExprs, &ArgumentChanged)) 13005 return ExprError(); 13006 13007 if (!getDerived().AlwaysRebuild() && 13008 !ArgumentChanged) 13009 return E; 13010 13011 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13012 SubExprs, 13013 E->getRParenLoc()); 13014 } 13015 13016 template<typename Derived> 13017 ExprResult 13018 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13019 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13020 if (SrcExpr.isInvalid()) 13021 return ExprError(); 13022 13023 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13024 if (!Type) 13025 return ExprError(); 13026 13027 if (!getDerived().AlwaysRebuild() && 13028 Type == E->getTypeSourceInfo() && 13029 SrcExpr.get() == E->getSrcExpr()) 13030 return E; 13031 13032 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13033 SrcExpr.get(), Type, 13034 E->getRParenLoc()); 13035 } 13036 13037 template<typename Derived> 13038 ExprResult 13039 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13040 BlockDecl *oldBlock = E->getBlockDecl(); 13041 13042 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13043 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13044 13045 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13046 blockScope->TheDecl->setBlockMissingReturnType( 13047 oldBlock->blockMissingReturnType()); 13048 13049 SmallVector<ParmVarDecl*, 4> params; 13050 SmallVector<QualType, 4> paramTypes; 13051 13052 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13053 13054 // Parameter substitution. 13055 Sema::ExtParameterInfoBuilder extParamInfos; 13056 if (getDerived().TransformFunctionTypeParams( 13057 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13058 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13059 extParamInfos)) { 13060 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13061 return ExprError(); 13062 } 13063 13064 QualType exprResultType = 13065 getDerived().TransformType(exprFunctionType->getReturnType()); 13066 13067 auto epi = exprFunctionType->getExtProtoInfo(); 13068 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13069 13070 QualType functionType = 13071 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13072 blockScope->FunctionType = functionType; 13073 13074 // Set the parameters on the block decl. 13075 if (!params.empty()) 13076 blockScope->TheDecl->setParams(params); 13077 13078 if (!oldBlock->blockMissingReturnType()) { 13079 blockScope->HasImplicitReturnType = false; 13080 blockScope->ReturnType = exprResultType; 13081 } 13082 13083 // Transform the body 13084 StmtResult body = getDerived().TransformStmt(E->getBody()); 13085 if (body.isInvalid()) { 13086 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13087 return ExprError(); 13088 } 13089 13090 #ifndef NDEBUG 13091 // In builds with assertions, make sure that we captured everything we 13092 // captured before. 13093 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13094 for (const auto &I : oldBlock->captures()) { 13095 VarDecl *oldCapture = I.getVariable(); 13096 13097 // Ignore parameter packs. 13098 if (oldCapture->isParameterPack()) 13099 continue; 13100 13101 VarDecl *newCapture = 13102 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13103 oldCapture)); 13104 assert(blockScope->CaptureMap.count(newCapture)); 13105 } 13106 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13107 } 13108 #endif 13109 13110 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13111 /*Scope=*/nullptr); 13112 } 13113 13114 template<typename Derived> 13115 ExprResult 13116 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13117 llvm_unreachable("Cannot transform asType expressions yet"); 13118 } 13119 13120 template<typename Derived> 13121 ExprResult 13122 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13123 bool ArgumentChanged = false; 13124 SmallVector<Expr*, 8> SubExprs; 13125 SubExprs.reserve(E->getNumSubExprs()); 13126 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13127 SubExprs, &ArgumentChanged)) 13128 return ExprError(); 13129 13130 if (!getDerived().AlwaysRebuild() && 13131 !ArgumentChanged) 13132 return E; 13133 13134 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13135 E->getOp(), E->getRParenLoc()); 13136 } 13137 13138 //===----------------------------------------------------------------------===// 13139 // Type reconstruction 13140 //===----------------------------------------------------------------------===// 13141 13142 template<typename Derived> 13143 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13144 SourceLocation Star) { 13145 return SemaRef.BuildPointerType(PointeeType, Star, 13146 getDerived().getBaseEntity()); 13147 } 13148 13149 template<typename Derived> 13150 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13151 SourceLocation Star) { 13152 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13153 getDerived().getBaseEntity()); 13154 } 13155 13156 template<typename Derived> 13157 QualType 13158 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13159 bool WrittenAsLValue, 13160 SourceLocation Sigil) { 13161 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13162 Sigil, getDerived().getBaseEntity()); 13163 } 13164 13165 template<typename Derived> 13166 QualType 13167 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13168 QualType ClassType, 13169 SourceLocation Sigil) { 13170 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13171 getDerived().getBaseEntity()); 13172 } 13173 13174 template<typename Derived> 13175 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13176 const ObjCTypeParamDecl *Decl, 13177 SourceLocation ProtocolLAngleLoc, 13178 ArrayRef<ObjCProtocolDecl *> Protocols, 13179 ArrayRef<SourceLocation> ProtocolLocs, 13180 SourceLocation ProtocolRAngleLoc) { 13181 return SemaRef.BuildObjCTypeParamType(Decl, 13182 ProtocolLAngleLoc, Protocols, 13183 ProtocolLocs, ProtocolRAngleLoc, 13184 /*FailOnError=*/true); 13185 } 13186 13187 template<typename Derived> 13188 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13189 QualType BaseType, 13190 SourceLocation Loc, 13191 SourceLocation TypeArgsLAngleLoc, 13192 ArrayRef<TypeSourceInfo *> TypeArgs, 13193 SourceLocation TypeArgsRAngleLoc, 13194 SourceLocation ProtocolLAngleLoc, 13195 ArrayRef<ObjCProtocolDecl *> Protocols, 13196 ArrayRef<SourceLocation> ProtocolLocs, 13197 SourceLocation ProtocolRAngleLoc) { 13198 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13199 TypeArgs, TypeArgsRAngleLoc, 13200 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13201 ProtocolRAngleLoc, 13202 /*FailOnError=*/true); 13203 } 13204 13205 template<typename Derived> 13206 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13207 QualType PointeeType, 13208 SourceLocation Star) { 13209 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13210 } 13211 13212 template<typename Derived> 13213 QualType 13214 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13215 ArrayType::ArraySizeModifier SizeMod, 13216 const llvm::APInt *Size, 13217 Expr *SizeExpr, 13218 unsigned IndexTypeQuals, 13219 SourceRange BracketsRange) { 13220 if (SizeExpr || !Size) 13221 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13222 IndexTypeQuals, BracketsRange, 13223 getDerived().getBaseEntity()); 13224 13225 QualType Types[] = { 13226 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13227 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13228 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13229 }; 13230 const unsigned NumTypes = llvm::array_lengthof(Types); 13231 QualType SizeType; 13232 for (unsigned I = 0; I != NumTypes; ++I) 13233 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13234 SizeType = Types[I]; 13235 break; 13236 } 13237 13238 // Note that we can return a VariableArrayType here in the case where 13239 // the element type was a dependent VariableArrayType. 13240 IntegerLiteral *ArraySize 13241 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13242 /*FIXME*/BracketsRange.getBegin()); 13243 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13244 IndexTypeQuals, BracketsRange, 13245 getDerived().getBaseEntity()); 13246 } 13247 13248 template<typename Derived> 13249 QualType 13250 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13251 ArrayType::ArraySizeModifier SizeMod, 13252 const llvm::APInt &Size, 13253 Expr *SizeExpr, 13254 unsigned IndexTypeQuals, 13255 SourceRange BracketsRange) { 13256 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13257 IndexTypeQuals, BracketsRange); 13258 } 13259 13260 template<typename Derived> 13261 QualType 13262 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13263 ArrayType::ArraySizeModifier SizeMod, 13264 unsigned IndexTypeQuals, 13265 SourceRange BracketsRange) { 13266 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13267 IndexTypeQuals, BracketsRange); 13268 } 13269 13270 template<typename Derived> 13271 QualType 13272 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13273 ArrayType::ArraySizeModifier SizeMod, 13274 Expr *SizeExpr, 13275 unsigned IndexTypeQuals, 13276 SourceRange BracketsRange) { 13277 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13278 SizeExpr, 13279 IndexTypeQuals, BracketsRange); 13280 } 13281 13282 template<typename Derived> 13283 QualType 13284 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13285 ArrayType::ArraySizeModifier SizeMod, 13286 Expr *SizeExpr, 13287 unsigned IndexTypeQuals, 13288 SourceRange BracketsRange) { 13289 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13290 SizeExpr, 13291 IndexTypeQuals, BracketsRange); 13292 } 13293 13294 template <typename Derived> 13295 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13296 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13297 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13298 AttributeLoc); 13299 } 13300 13301 template <typename Derived> 13302 QualType 13303 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13304 unsigned NumElements, 13305 VectorType::VectorKind VecKind) { 13306 // FIXME: semantic checking! 13307 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13308 } 13309 13310 template <typename Derived> 13311 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13312 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13313 VectorType::VectorKind VecKind) { 13314 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13315 } 13316 13317 template<typename Derived> 13318 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13319 unsigned NumElements, 13320 SourceLocation AttributeLoc) { 13321 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13322 NumElements, true); 13323 IntegerLiteral *VectorSize 13324 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13325 AttributeLoc); 13326 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13327 } 13328 13329 template<typename Derived> 13330 QualType 13331 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13332 Expr *SizeExpr, 13333 SourceLocation AttributeLoc) { 13334 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13335 } 13336 13337 template<typename Derived> 13338 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13339 QualType T, 13340 MutableArrayRef<QualType> ParamTypes, 13341 const FunctionProtoType::ExtProtoInfo &EPI) { 13342 return SemaRef.BuildFunctionType(T, ParamTypes, 13343 getDerived().getBaseLocation(), 13344 getDerived().getBaseEntity(), 13345 EPI); 13346 } 13347 13348 template<typename Derived> 13349 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13350 return SemaRef.Context.getFunctionNoProtoType(T); 13351 } 13352 13353 template<typename Derived> 13354 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13355 Decl *D) { 13356 assert(D && "no decl found"); 13357 if (D->isInvalidDecl()) return QualType(); 13358 13359 // FIXME: Doesn't account for ObjCInterfaceDecl! 13360 TypeDecl *Ty; 13361 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 13362 // A valid resolved using typename pack expansion decl can have multiple 13363 // UsingDecls, but they must each have exactly one type, and it must be 13364 // the same type in every case. But we must have at least one expansion! 13365 if (UPD->expansions().empty()) { 13366 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 13367 << UPD->isCXXClassMember() << UPD; 13368 return QualType(); 13369 } 13370 13371 // We might still have some unresolved types. Try to pick a resolved type 13372 // if we can. The final instantiation will check that the remaining 13373 // unresolved types instantiate to the type we pick. 13374 QualType FallbackT; 13375 QualType T; 13376 for (auto *E : UPD->expansions()) { 13377 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 13378 if (ThisT.isNull()) 13379 continue; 13380 else if (ThisT->getAs<UnresolvedUsingType>()) 13381 FallbackT = ThisT; 13382 else if (T.isNull()) 13383 T = ThisT; 13384 else 13385 assert(getSema().Context.hasSameType(ThisT, T) && 13386 "mismatched resolved types in using pack expansion"); 13387 } 13388 return T.isNull() ? FallbackT : T; 13389 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 13390 assert(Using->hasTypename() && 13391 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 13392 13393 // A valid resolved using typename decl points to exactly one type decl. 13394 assert(++Using->shadow_begin() == Using->shadow_end()); 13395 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 13396 } else { 13397 assert(isa<UnresolvedUsingTypenameDecl>(D) && 13398 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 13399 Ty = cast<UnresolvedUsingTypenameDecl>(D); 13400 } 13401 13402 return SemaRef.Context.getTypeDeclType(Ty); 13403 } 13404 13405 template<typename Derived> 13406 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 13407 SourceLocation Loc) { 13408 return SemaRef.BuildTypeofExprType(E, Loc); 13409 } 13410 13411 template<typename Derived> 13412 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 13413 return SemaRef.Context.getTypeOfType(Underlying); 13414 } 13415 13416 template<typename Derived> 13417 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 13418 SourceLocation Loc) { 13419 return SemaRef.BuildDecltypeType(E, Loc); 13420 } 13421 13422 template<typename Derived> 13423 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 13424 UnaryTransformType::UTTKind UKind, 13425 SourceLocation Loc) { 13426 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 13427 } 13428 13429 template<typename Derived> 13430 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 13431 TemplateName Template, 13432 SourceLocation TemplateNameLoc, 13433 TemplateArgumentListInfo &TemplateArgs) { 13434 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 13435 } 13436 13437 template<typename Derived> 13438 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 13439 SourceLocation KWLoc) { 13440 return SemaRef.BuildAtomicType(ValueType, KWLoc); 13441 } 13442 13443 template<typename Derived> 13444 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 13445 SourceLocation KWLoc, 13446 bool isReadPipe) { 13447 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 13448 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 13449 } 13450 13451 template<typename Derived> 13452 TemplateName 13453 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13454 bool TemplateKW, 13455 TemplateDecl *Template) { 13456 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 13457 Template); 13458 } 13459 13460 template<typename Derived> 13461 TemplateName 13462 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13463 SourceLocation TemplateKWLoc, 13464 const IdentifierInfo &Name, 13465 SourceLocation NameLoc, 13466 QualType ObjectType, 13467 NamedDecl *FirstQualifierInScope, 13468 bool AllowInjectedClassName) { 13469 UnqualifiedId TemplateName; 13470 TemplateName.setIdentifier(&Name, NameLoc); 13471 Sema::TemplateTy Template; 13472 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 13473 SS, TemplateKWLoc, TemplateName, 13474 ParsedType::make(ObjectType), 13475 /*EnteringContext=*/false, 13476 Template, AllowInjectedClassName); 13477 return Template.get(); 13478 } 13479 13480 template<typename Derived> 13481 TemplateName 13482 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13483 SourceLocation TemplateKWLoc, 13484 OverloadedOperatorKind Operator, 13485 SourceLocation NameLoc, 13486 QualType ObjectType, 13487 bool AllowInjectedClassName) { 13488 UnqualifiedId Name; 13489 // FIXME: Bogus location information. 13490 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 13491 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 13492 Sema::TemplateTy Template; 13493 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 13494 SS, TemplateKWLoc, Name, 13495 ParsedType::make(ObjectType), 13496 /*EnteringContext=*/false, 13497 Template, AllowInjectedClassName); 13498 return Template.get(); 13499 } 13500 13501 template<typename Derived> 13502 ExprResult 13503 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 13504 SourceLocation OpLoc, 13505 Expr *OrigCallee, 13506 Expr *First, 13507 Expr *Second) { 13508 Expr *Callee = OrigCallee->IgnoreParenCasts(); 13509 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 13510 13511 if (First->getObjectKind() == OK_ObjCProperty) { 13512 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13513 if (BinaryOperator::isAssignmentOp(Opc)) 13514 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 13515 First, Second); 13516 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 13517 if (Result.isInvalid()) 13518 return ExprError(); 13519 First = Result.get(); 13520 } 13521 13522 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 13523 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 13524 if (Result.isInvalid()) 13525 return ExprError(); 13526 Second = Result.get(); 13527 } 13528 13529 // Determine whether this should be a builtin operation. 13530 if (Op == OO_Subscript) { 13531 if (!First->getType()->isOverloadableType() && 13532 !Second->getType()->isOverloadableType()) 13533 return getSema().CreateBuiltinArraySubscriptExpr( 13534 First, Callee->getBeginLoc(), Second, OpLoc); 13535 } else if (Op == OO_Arrow) { 13536 // -> is never a builtin operation. 13537 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 13538 } else if (Second == nullptr || isPostIncDec) { 13539 if (!First->getType()->isOverloadableType() || 13540 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 13541 // The argument is not of overloadable type, or this is an expression 13542 // of the form &Class::member, so try to create a built-in unary 13543 // operation. 13544 UnaryOperatorKind Opc 13545 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13546 13547 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 13548 } 13549 } else { 13550 if (!First->getType()->isOverloadableType() && 13551 !Second->getType()->isOverloadableType()) { 13552 // Neither of the arguments is an overloadable type, so try to 13553 // create a built-in binary operation. 13554 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13555 ExprResult Result 13556 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 13557 if (Result.isInvalid()) 13558 return ExprError(); 13559 13560 return Result; 13561 } 13562 } 13563 13564 // Compute the transformed set of functions (and function templates) to be 13565 // used during overload resolution. 13566 UnresolvedSet<16> Functions; 13567 bool RequiresADL; 13568 13569 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 13570 Functions.append(ULE->decls_begin(), ULE->decls_end()); 13571 // If the overload could not be resolved in the template definition 13572 // (because we had a dependent argument), ADL is performed as part of 13573 // template instantiation. 13574 RequiresADL = ULE->requiresADL(); 13575 } else { 13576 // If we've resolved this to a particular non-member function, just call 13577 // that function. If we resolved it to a member function, 13578 // CreateOverloaded* will find that function for us. 13579 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 13580 if (!isa<CXXMethodDecl>(ND)) 13581 Functions.addDecl(ND); 13582 RequiresADL = false; 13583 } 13584 13585 // Add any functions found via argument-dependent lookup. 13586 Expr *Args[2] = { First, Second }; 13587 unsigned NumArgs = 1 + (Second != nullptr); 13588 13589 // Create the overloaded operator invocation for unary operators. 13590 if (NumArgs == 1 || isPostIncDec) { 13591 UnaryOperatorKind Opc 13592 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13593 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 13594 RequiresADL); 13595 } 13596 13597 if (Op == OO_Subscript) { 13598 SourceLocation LBrace; 13599 SourceLocation RBrace; 13600 13601 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 13602 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 13603 LBrace = SourceLocation::getFromRawEncoding( 13604 NameLoc.CXXOperatorName.BeginOpNameLoc); 13605 RBrace = SourceLocation::getFromRawEncoding( 13606 NameLoc.CXXOperatorName.EndOpNameLoc); 13607 } else { 13608 LBrace = Callee->getBeginLoc(); 13609 RBrace = OpLoc; 13610 } 13611 13612 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 13613 First, Second); 13614 } 13615 13616 // Create the overloaded operator invocation for binary operators. 13617 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13618 ExprResult Result = SemaRef.CreateOverloadedBinOp( 13619 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 13620 if (Result.isInvalid()) 13621 return ExprError(); 13622 13623 return Result; 13624 } 13625 13626 template<typename Derived> 13627 ExprResult 13628 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 13629 SourceLocation OperatorLoc, 13630 bool isArrow, 13631 CXXScopeSpec &SS, 13632 TypeSourceInfo *ScopeType, 13633 SourceLocation CCLoc, 13634 SourceLocation TildeLoc, 13635 PseudoDestructorTypeStorage Destroyed) { 13636 QualType BaseType = Base->getType(); 13637 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 13638 (!isArrow && !BaseType->getAs<RecordType>()) || 13639 (isArrow && BaseType->getAs<PointerType>() && 13640 !BaseType->castAs<PointerType>()->getPointeeType() 13641 ->template getAs<RecordType>())){ 13642 // This pseudo-destructor expression is still a pseudo-destructor. 13643 return SemaRef.BuildPseudoDestructorExpr( 13644 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 13645 CCLoc, TildeLoc, Destroyed); 13646 } 13647 13648 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 13649 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 13650 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 13651 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 13652 NameInfo.setNamedTypeInfo(DestroyedType); 13653 13654 // The scope type is now known to be a valid nested name specifier 13655 // component. Tack it on to the end of the nested name specifier. 13656 if (ScopeType) { 13657 if (!ScopeType->getType()->getAs<TagType>()) { 13658 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 13659 diag::err_expected_class_or_namespace) 13660 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 13661 return ExprError(); 13662 } 13663 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 13664 CCLoc); 13665 } 13666 13667 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 13668 return getSema().BuildMemberReferenceExpr(Base, BaseType, 13669 OperatorLoc, isArrow, 13670 SS, TemplateKWLoc, 13671 /*FIXME: FirstQualifier*/ nullptr, 13672 NameInfo, 13673 /*TemplateArgs*/ nullptr, 13674 /*S*/nullptr); 13675 } 13676 13677 template<typename Derived> 13678 StmtResult 13679 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 13680 SourceLocation Loc = S->getBeginLoc(); 13681 CapturedDecl *CD = S->getCapturedDecl(); 13682 unsigned NumParams = CD->getNumParams(); 13683 unsigned ContextParamPos = CD->getContextParamPosition(); 13684 SmallVector<Sema::CapturedParamNameType, 4> Params; 13685 for (unsigned I = 0; I < NumParams; ++I) { 13686 if (I != ContextParamPos) { 13687 Params.push_back( 13688 std::make_pair( 13689 CD->getParam(I)->getName(), 13690 getDerived().TransformType(CD->getParam(I)->getType()))); 13691 } else { 13692 Params.push_back(std::make_pair(StringRef(), QualType())); 13693 } 13694 } 13695 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 13696 S->getCapturedRegionKind(), Params); 13697 StmtResult Body; 13698 { 13699 Sema::CompoundScopeRAII CompoundScope(getSema()); 13700 Body = getDerived().TransformStmt(S->getCapturedStmt()); 13701 } 13702 13703 if (Body.isInvalid()) { 13704 getSema().ActOnCapturedRegionError(); 13705 return StmtError(); 13706 } 13707 13708 return getSema().ActOnCapturedRegionEnd(Body.get()); 13709 } 13710 13711 } // end namespace clang 13712 13713 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 13714