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