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>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8817 // No need to rebuild this clause, no template-dependent parameters. 8818 return C; 8819 } 8820 8821 template <typename Derived> 8822 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8823 // No need to rebuild this clause, no template-dependent parameters. 8824 return C; 8825 } 8826 8827 template <typename Derived> 8828 OMPClause * 8829 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8830 // No need to rebuild this clause, no template-dependent parameters. 8831 return C; 8832 } 8833 8834 template <typename Derived> 8835 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8836 OMPUnifiedAddressClause *C) { 8837 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8838 } 8839 8840 template <typename Derived> 8841 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8842 OMPUnifiedSharedMemoryClause *C) { 8843 llvm_unreachable( 8844 "unified_shared_memory clause cannot appear in dependent context"); 8845 } 8846 8847 template <typename Derived> 8848 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8849 OMPReverseOffloadClause *C) { 8850 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8851 } 8852 8853 template <typename Derived> 8854 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8855 OMPDynamicAllocatorsClause *C) { 8856 llvm_unreachable( 8857 "dynamic_allocators clause cannot appear in dependent context"); 8858 } 8859 8860 template <typename Derived> 8861 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 8862 OMPAtomicDefaultMemOrderClause *C) { 8863 llvm_unreachable( 8864 "atomic_default_mem_order clause cannot appear in dependent context"); 8865 } 8866 8867 template <typename Derived> 8868 OMPClause * 8869 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8870 llvm::SmallVector<Expr *, 16> Vars; 8871 Vars.reserve(C->varlist_size()); 8872 for (auto *VE : C->varlists()) { 8873 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8874 if (EVar.isInvalid()) 8875 return nullptr; 8876 Vars.push_back(EVar.get()); 8877 } 8878 return getDerived().RebuildOMPPrivateClause( 8879 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8880 } 8881 8882 template <typename Derived> 8883 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8884 OMPFirstprivateClause *C) { 8885 llvm::SmallVector<Expr *, 16> Vars; 8886 Vars.reserve(C->varlist_size()); 8887 for (auto *VE : C->varlists()) { 8888 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8889 if (EVar.isInvalid()) 8890 return nullptr; 8891 Vars.push_back(EVar.get()); 8892 } 8893 return getDerived().RebuildOMPFirstprivateClause( 8894 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8895 } 8896 8897 template <typename Derived> 8898 OMPClause * 8899 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8900 llvm::SmallVector<Expr *, 16> Vars; 8901 Vars.reserve(C->varlist_size()); 8902 for (auto *VE : C->varlists()) { 8903 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8904 if (EVar.isInvalid()) 8905 return nullptr; 8906 Vars.push_back(EVar.get()); 8907 } 8908 return getDerived().RebuildOMPLastprivateClause( 8909 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 8910 C->getLParenLoc(), C->getEndLoc()); 8911 } 8912 8913 template <typename Derived> 8914 OMPClause * 8915 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8916 llvm::SmallVector<Expr *, 16> Vars; 8917 Vars.reserve(C->varlist_size()); 8918 for (auto *VE : C->varlists()) { 8919 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8920 if (EVar.isInvalid()) 8921 return nullptr; 8922 Vars.push_back(EVar.get()); 8923 } 8924 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 8925 C->getLParenLoc(), C->getEndLoc()); 8926 } 8927 8928 template <typename Derived> 8929 OMPClause * 8930 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8931 llvm::SmallVector<Expr *, 16> Vars; 8932 Vars.reserve(C->varlist_size()); 8933 for (auto *VE : C->varlists()) { 8934 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8935 if (EVar.isInvalid()) 8936 return nullptr; 8937 Vars.push_back(EVar.get()); 8938 } 8939 CXXScopeSpec ReductionIdScopeSpec; 8940 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8941 8942 DeclarationNameInfo NameInfo = C->getNameInfo(); 8943 if (NameInfo.getName()) { 8944 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8945 if (!NameInfo.getName()) 8946 return nullptr; 8947 } 8948 // Build a list of all UDR decls with the same names ranged by the Scopes. 8949 // The Scope boundary is a duplication of the previous decl. 8950 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8951 for (auto *E : C->reduction_ops()) { 8952 // Transform all the decls. 8953 if (E) { 8954 auto *ULE = cast<UnresolvedLookupExpr>(E); 8955 UnresolvedSet<8> Decls; 8956 for (auto *D : ULE->decls()) { 8957 NamedDecl *InstD = 8958 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8959 Decls.addDecl(InstD, InstD->getAccess()); 8960 } 8961 UnresolvedReductions.push_back( 8962 UnresolvedLookupExpr::Create( 8963 SemaRef.Context, /*NamingClass=*/nullptr, 8964 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8965 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8966 Decls.begin(), Decls.end())); 8967 } else 8968 UnresolvedReductions.push_back(nullptr); 8969 } 8970 return getDerived().RebuildOMPReductionClause( 8971 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 8972 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8973 } 8974 8975 template <typename Derived> 8976 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 8977 OMPTaskReductionClause *C) { 8978 llvm::SmallVector<Expr *, 16> Vars; 8979 Vars.reserve(C->varlist_size()); 8980 for (auto *VE : C->varlists()) { 8981 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8982 if (EVar.isInvalid()) 8983 return nullptr; 8984 Vars.push_back(EVar.get()); 8985 } 8986 CXXScopeSpec ReductionIdScopeSpec; 8987 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8988 8989 DeclarationNameInfo NameInfo = C->getNameInfo(); 8990 if (NameInfo.getName()) { 8991 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8992 if (!NameInfo.getName()) 8993 return nullptr; 8994 } 8995 // Build a list of all UDR decls with the same names ranged by the Scopes. 8996 // The Scope boundary is a duplication of the previous decl. 8997 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8998 for (auto *E : C->reduction_ops()) { 8999 // Transform all the decls. 9000 if (E) { 9001 auto *ULE = cast<UnresolvedLookupExpr>(E); 9002 UnresolvedSet<8> Decls; 9003 for (auto *D : ULE->decls()) { 9004 NamedDecl *InstD = 9005 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9006 Decls.addDecl(InstD, InstD->getAccess()); 9007 } 9008 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9009 SemaRef.Context, /*NamingClass=*/nullptr, 9010 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9011 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9012 } else 9013 UnresolvedReductions.push_back(nullptr); 9014 } 9015 return getDerived().RebuildOMPTaskReductionClause( 9016 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9017 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9018 } 9019 9020 template <typename Derived> 9021 OMPClause * 9022 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9023 llvm::SmallVector<Expr *, 16> Vars; 9024 Vars.reserve(C->varlist_size()); 9025 for (auto *VE : C->varlists()) { 9026 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9027 if (EVar.isInvalid()) 9028 return nullptr; 9029 Vars.push_back(EVar.get()); 9030 } 9031 CXXScopeSpec ReductionIdScopeSpec; 9032 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9033 9034 DeclarationNameInfo NameInfo = C->getNameInfo(); 9035 if (NameInfo.getName()) { 9036 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9037 if (!NameInfo.getName()) 9038 return nullptr; 9039 } 9040 // Build a list of all UDR decls with the same names ranged by the Scopes. 9041 // The Scope boundary is a duplication of the previous decl. 9042 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9043 for (auto *E : C->reduction_ops()) { 9044 // Transform all the decls. 9045 if (E) { 9046 auto *ULE = cast<UnresolvedLookupExpr>(E); 9047 UnresolvedSet<8> Decls; 9048 for (auto *D : ULE->decls()) { 9049 NamedDecl *InstD = 9050 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9051 Decls.addDecl(InstD, InstD->getAccess()); 9052 } 9053 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9054 SemaRef.Context, /*NamingClass=*/nullptr, 9055 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9056 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9057 } else 9058 UnresolvedReductions.push_back(nullptr); 9059 } 9060 return getDerived().RebuildOMPInReductionClause( 9061 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9062 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9063 } 9064 9065 template <typename Derived> 9066 OMPClause * 9067 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9068 llvm::SmallVector<Expr *, 16> Vars; 9069 Vars.reserve(C->varlist_size()); 9070 for (auto *VE : C->varlists()) { 9071 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9072 if (EVar.isInvalid()) 9073 return nullptr; 9074 Vars.push_back(EVar.get()); 9075 } 9076 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9077 if (Step.isInvalid()) 9078 return nullptr; 9079 return getDerived().RebuildOMPLinearClause( 9080 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9081 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9082 } 9083 9084 template <typename Derived> 9085 OMPClause * 9086 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9087 llvm::SmallVector<Expr *, 16> Vars; 9088 Vars.reserve(C->varlist_size()); 9089 for (auto *VE : C->varlists()) { 9090 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9091 if (EVar.isInvalid()) 9092 return nullptr; 9093 Vars.push_back(EVar.get()); 9094 } 9095 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9096 if (Alignment.isInvalid()) 9097 return nullptr; 9098 return getDerived().RebuildOMPAlignedClause( 9099 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9100 C->getColonLoc(), C->getEndLoc()); 9101 } 9102 9103 template <typename Derived> 9104 OMPClause * 9105 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9106 llvm::SmallVector<Expr *, 16> Vars; 9107 Vars.reserve(C->varlist_size()); 9108 for (auto *VE : C->varlists()) { 9109 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9110 if (EVar.isInvalid()) 9111 return nullptr; 9112 Vars.push_back(EVar.get()); 9113 } 9114 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9115 C->getLParenLoc(), C->getEndLoc()); 9116 } 9117 9118 template <typename Derived> 9119 OMPClause * 9120 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9121 llvm::SmallVector<Expr *, 16> Vars; 9122 Vars.reserve(C->varlist_size()); 9123 for (auto *VE : C->varlists()) { 9124 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9125 if (EVar.isInvalid()) 9126 return nullptr; 9127 Vars.push_back(EVar.get()); 9128 } 9129 return getDerived().RebuildOMPCopyprivateClause( 9130 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9131 } 9132 9133 template <typename Derived> 9134 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9135 llvm::SmallVector<Expr *, 16> Vars; 9136 Vars.reserve(C->varlist_size()); 9137 for (auto *VE : C->varlists()) { 9138 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9139 if (EVar.isInvalid()) 9140 return nullptr; 9141 Vars.push_back(EVar.get()); 9142 } 9143 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9144 C->getLParenLoc(), C->getEndLoc()); 9145 } 9146 9147 template <typename Derived> 9148 OMPClause * 9149 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9150 llvm::SmallVector<Expr *, 16> Vars; 9151 Vars.reserve(C->varlist_size()); 9152 for (auto *VE : C->varlists()) { 9153 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9154 if (EVar.isInvalid()) 9155 return nullptr; 9156 Vars.push_back(EVar.get()); 9157 } 9158 return getDerived().RebuildOMPDependClause( 9159 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 9160 C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9161 } 9162 9163 template <typename Derived> 9164 OMPClause * 9165 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9166 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9167 if (E.isInvalid()) 9168 return nullptr; 9169 return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(), 9170 C->getLParenLoc(), C->getEndLoc()); 9171 } 9172 9173 template <typename Derived, class T> 9174 bool transformOMPMappableExprListClause( 9175 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9176 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9177 DeclarationNameInfo &MapperIdInfo, 9178 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9179 // Transform expressions in the list. 9180 Vars.reserve(C->varlist_size()); 9181 for (auto *VE : C->varlists()) { 9182 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9183 if (EVar.isInvalid()) 9184 return true; 9185 Vars.push_back(EVar.get()); 9186 } 9187 // Transform mapper scope specifier and identifier. 9188 NestedNameSpecifierLoc QualifierLoc; 9189 if (C->getMapperQualifierLoc()) { 9190 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9191 C->getMapperQualifierLoc()); 9192 if (!QualifierLoc) 9193 return true; 9194 } 9195 MapperIdScopeSpec.Adopt(QualifierLoc); 9196 MapperIdInfo = C->getMapperIdInfo(); 9197 if (MapperIdInfo.getName()) { 9198 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9199 if (!MapperIdInfo.getName()) 9200 return true; 9201 } 9202 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9203 // the previous user-defined mapper lookup in dependent environment. 9204 for (auto *E : C->mapperlists()) { 9205 // Transform all the decls. 9206 if (E) { 9207 auto *ULE = cast<UnresolvedLookupExpr>(E); 9208 UnresolvedSet<8> Decls; 9209 for (auto *D : ULE->decls()) { 9210 NamedDecl *InstD = 9211 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9212 Decls.addDecl(InstD, InstD->getAccess()); 9213 } 9214 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9215 TT.getSema().Context, /*NamingClass=*/nullptr, 9216 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9217 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9218 Decls.end())); 9219 } else { 9220 UnresolvedMappers.push_back(nullptr); 9221 } 9222 } 9223 return false; 9224 } 9225 9226 template <typename Derived> 9227 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9228 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9229 llvm::SmallVector<Expr *, 16> Vars; 9230 CXXScopeSpec MapperIdScopeSpec; 9231 DeclarationNameInfo MapperIdInfo; 9232 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9233 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9234 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9235 return nullptr; 9236 return getDerived().RebuildOMPMapClause( 9237 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9238 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9239 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9240 } 9241 9242 template <typename Derived> 9243 OMPClause * 9244 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9245 Expr *Allocator = C->getAllocator(); 9246 if (Allocator) { 9247 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9248 if (AllocatorRes.isInvalid()) 9249 return nullptr; 9250 Allocator = AllocatorRes.get(); 9251 } 9252 llvm::SmallVector<Expr *, 16> Vars; 9253 Vars.reserve(C->varlist_size()); 9254 for (auto *VE : C->varlists()) { 9255 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9256 if (EVar.isInvalid()) 9257 return nullptr; 9258 Vars.push_back(EVar.get()); 9259 } 9260 return getDerived().RebuildOMPAllocateClause( 9261 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9262 C->getEndLoc()); 9263 } 9264 9265 template <typename Derived> 9266 OMPClause * 9267 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9268 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9269 if (E.isInvalid()) 9270 return nullptr; 9271 return getDerived().RebuildOMPNumTeamsClause( 9272 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9273 } 9274 9275 template <typename Derived> 9276 OMPClause * 9277 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9278 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9279 if (E.isInvalid()) 9280 return nullptr; 9281 return getDerived().RebuildOMPThreadLimitClause( 9282 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9283 } 9284 9285 template <typename Derived> 9286 OMPClause * 9287 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9288 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9289 if (E.isInvalid()) 9290 return nullptr; 9291 return getDerived().RebuildOMPPriorityClause( 9292 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9293 } 9294 9295 template <typename Derived> 9296 OMPClause * 9297 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9298 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9299 if (E.isInvalid()) 9300 return nullptr; 9301 return getDerived().RebuildOMPGrainsizeClause( 9302 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9303 } 9304 9305 template <typename Derived> 9306 OMPClause * 9307 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9308 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9309 if (E.isInvalid()) 9310 return nullptr; 9311 return getDerived().RebuildOMPNumTasksClause( 9312 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9313 } 9314 9315 template <typename Derived> 9316 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9317 ExprResult E = getDerived().TransformExpr(C->getHint()); 9318 if (E.isInvalid()) 9319 return nullptr; 9320 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9321 C->getLParenLoc(), C->getEndLoc()); 9322 } 9323 9324 template <typename Derived> 9325 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9326 OMPDistScheduleClause *C) { 9327 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9328 if (E.isInvalid()) 9329 return nullptr; 9330 return getDerived().RebuildOMPDistScheduleClause( 9331 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9332 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9333 } 9334 9335 template <typename Derived> 9336 OMPClause * 9337 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9338 // Rebuild Defaultmap Clause since we need to invoke the checking of 9339 // defaultmap(none:variable-category) after template initialization. 9340 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9341 C->getDefaultmapKind(), 9342 C->getBeginLoc(), 9343 C->getLParenLoc(), 9344 C->getDefaultmapModifierLoc(), 9345 C->getDefaultmapKindLoc(), 9346 C->getEndLoc()); 9347 } 9348 9349 template <typename Derived> 9350 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9351 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9352 llvm::SmallVector<Expr *, 16> Vars; 9353 CXXScopeSpec MapperIdScopeSpec; 9354 DeclarationNameInfo MapperIdInfo; 9355 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9356 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9357 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9358 return nullptr; 9359 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9360 Locs, UnresolvedMappers); 9361 } 9362 9363 template <typename Derived> 9364 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9365 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9366 llvm::SmallVector<Expr *, 16> Vars; 9367 CXXScopeSpec MapperIdScopeSpec; 9368 DeclarationNameInfo MapperIdInfo; 9369 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9370 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9371 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9372 return nullptr; 9373 return getDerived().RebuildOMPFromClause( 9374 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9375 } 9376 9377 template <typename Derived> 9378 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9379 OMPUseDevicePtrClause *C) { 9380 llvm::SmallVector<Expr *, 16> Vars; 9381 Vars.reserve(C->varlist_size()); 9382 for (auto *VE : C->varlists()) { 9383 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9384 if (EVar.isInvalid()) 9385 return nullptr; 9386 Vars.push_back(EVar.get()); 9387 } 9388 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9389 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9390 } 9391 9392 template <typename Derived> 9393 OMPClause * 9394 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9395 llvm::SmallVector<Expr *, 16> Vars; 9396 Vars.reserve(C->varlist_size()); 9397 for (auto *VE : C->varlists()) { 9398 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9399 if (EVar.isInvalid()) 9400 return nullptr; 9401 Vars.push_back(EVar.get()); 9402 } 9403 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9404 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9405 } 9406 9407 template <typename Derived> 9408 OMPClause * 9409 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9410 llvm::SmallVector<Expr *, 16> Vars; 9411 Vars.reserve(C->varlist_size()); 9412 for (auto *VE : C->varlists()) { 9413 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9414 if (EVar.isInvalid()) 9415 return nullptr; 9416 Vars.push_back(EVar.get()); 9417 } 9418 return getDerived().RebuildOMPNontemporalClause( 9419 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9420 } 9421 9422 template <typename Derived> 9423 OMPClause * 9424 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9425 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9426 C->getBeginLoc(), C->getLParenLoc(), 9427 C->getEndLoc()); 9428 } 9429 9430 //===----------------------------------------------------------------------===// 9431 // Expression transformation 9432 //===----------------------------------------------------------------------===// 9433 template<typename Derived> 9434 ExprResult 9435 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9436 return TransformExpr(E->getSubExpr()); 9437 } 9438 9439 template<typename Derived> 9440 ExprResult 9441 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9442 if (!E->isTypeDependent()) 9443 return E; 9444 9445 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9446 E->getIdentKind()); 9447 } 9448 9449 template<typename Derived> 9450 ExprResult 9451 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9452 NestedNameSpecifierLoc QualifierLoc; 9453 if (E->getQualifierLoc()) { 9454 QualifierLoc 9455 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9456 if (!QualifierLoc) 9457 return ExprError(); 9458 } 9459 9460 ValueDecl *ND 9461 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9462 E->getDecl())); 9463 if (!ND) 9464 return ExprError(); 9465 9466 NamedDecl *Found = ND; 9467 if (E->getFoundDecl() != E->getDecl()) { 9468 Found = cast_or_null<NamedDecl>( 9469 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9470 if (!Found) 9471 return ExprError(); 9472 } 9473 9474 DeclarationNameInfo NameInfo = E->getNameInfo(); 9475 if (NameInfo.getName()) { 9476 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9477 if (!NameInfo.getName()) 9478 return ExprError(); 9479 } 9480 9481 if (!getDerived().AlwaysRebuild() && 9482 QualifierLoc == E->getQualifierLoc() && 9483 ND == E->getDecl() && 9484 Found == E->getFoundDecl() && 9485 NameInfo.getName() == E->getDecl()->getDeclName() && 9486 !E->hasExplicitTemplateArgs()) { 9487 9488 // Mark it referenced in the new context regardless. 9489 // FIXME: this is a bit instantiation-specific. 9490 SemaRef.MarkDeclRefReferenced(E); 9491 9492 return E; 9493 } 9494 9495 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9496 if (E->hasExplicitTemplateArgs()) { 9497 TemplateArgs = &TransArgs; 9498 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9499 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9500 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9501 E->getNumTemplateArgs(), 9502 TransArgs)) 9503 return ExprError(); 9504 } 9505 9506 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9507 Found, TemplateArgs); 9508 } 9509 9510 template<typename Derived> 9511 ExprResult 9512 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9513 return E; 9514 } 9515 9516 template <typename Derived> 9517 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9518 FixedPointLiteral *E) { 9519 return E; 9520 } 9521 9522 template<typename Derived> 9523 ExprResult 9524 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9525 return E; 9526 } 9527 9528 template<typename Derived> 9529 ExprResult 9530 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9531 return E; 9532 } 9533 9534 template<typename Derived> 9535 ExprResult 9536 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9537 return E; 9538 } 9539 9540 template<typename Derived> 9541 ExprResult 9542 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9543 return E; 9544 } 9545 9546 template<typename Derived> 9547 ExprResult 9548 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9549 if (FunctionDecl *FD = E->getDirectCallee()) 9550 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9551 return SemaRef.MaybeBindToTemporary(E); 9552 } 9553 9554 template<typename Derived> 9555 ExprResult 9556 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9557 ExprResult ControllingExpr = 9558 getDerived().TransformExpr(E->getControllingExpr()); 9559 if (ControllingExpr.isInvalid()) 9560 return ExprError(); 9561 9562 SmallVector<Expr *, 4> AssocExprs; 9563 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9564 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 9565 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9566 if (TSI) { 9567 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9568 if (!AssocType) 9569 return ExprError(); 9570 AssocTypes.push_back(AssocType); 9571 } else { 9572 AssocTypes.push_back(nullptr); 9573 } 9574 9575 ExprResult AssocExpr = 9576 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9577 if (AssocExpr.isInvalid()) 9578 return ExprError(); 9579 AssocExprs.push_back(AssocExpr.get()); 9580 } 9581 9582 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9583 E->getDefaultLoc(), 9584 E->getRParenLoc(), 9585 ControllingExpr.get(), 9586 AssocTypes, 9587 AssocExprs); 9588 } 9589 9590 template<typename Derived> 9591 ExprResult 9592 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9593 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9594 if (SubExpr.isInvalid()) 9595 return ExprError(); 9596 9597 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9598 return E; 9599 9600 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9601 E->getRParen()); 9602 } 9603 9604 /// The operand of a unary address-of operator has special rules: it's 9605 /// allowed to refer to a non-static member of a class even if there's no 'this' 9606 /// object available. 9607 template<typename Derived> 9608 ExprResult 9609 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9610 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9611 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9612 else 9613 return getDerived().TransformExpr(E); 9614 } 9615 9616 template<typename Derived> 9617 ExprResult 9618 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9619 ExprResult SubExpr; 9620 if (E->getOpcode() == UO_AddrOf) 9621 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9622 else 9623 SubExpr = TransformExpr(E->getSubExpr()); 9624 if (SubExpr.isInvalid()) 9625 return ExprError(); 9626 9627 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9628 return E; 9629 9630 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9631 E->getOpcode(), 9632 SubExpr.get()); 9633 } 9634 9635 template<typename Derived> 9636 ExprResult 9637 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9638 // Transform the type. 9639 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9640 if (!Type) 9641 return ExprError(); 9642 9643 // Transform all of the components into components similar to what the 9644 // parser uses. 9645 // FIXME: It would be slightly more efficient in the non-dependent case to 9646 // just map FieldDecls, rather than requiring the rebuilder to look for 9647 // the fields again. However, __builtin_offsetof is rare enough in 9648 // template code that we don't care. 9649 bool ExprChanged = false; 9650 typedef Sema::OffsetOfComponent Component; 9651 SmallVector<Component, 4> Components; 9652 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9653 const OffsetOfNode &ON = E->getComponent(I); 9654 Component Comp; 9655 Comp.isBrackets = true; 9656 Comp.LocStart = ON.getSourceRange().getBegin(); 9657 Comp.LocEnd = ON.getSourceRange().getEnd(); 9658 switch (ON.getKind()) { 9659 case OffsetOfNode::Array: { 9660 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9661 ExprResult Index = getDerived().TransformExpr(FromIndex); 9662 if (Index.isInvalid()) 9663 return ExprError(); 9664 9665 ExprChanged = ExprChanged || Index.get() != FromIndex; 9666 Comp.isBrackets = true; 9667 Comp.U.E = Index.get(); 9668 break; 9669 } 9670 9671 case OffsetOfNode::Field: 9672 case OffsetOfNode::Identifier: 9673 Comp.isBrackets = false; 9674 Comp.U.IdentInfo = ON.getFieldName(); 9675 if (!Comp.U.IdentInfo) 9676 continue; 9677 9678 break; 9679 9680 case OffsetOfNode::Base: 9681 // Will be recomputed during the rebuild. 9682 continue; 9683 } 9684 9685 Components.push_back(Comp); 9686 } 9687 9688 // If nothing changed, retain the existing expression. 9689 if (!getDerived().AlwaysRebuild() && 9690 Type == E->getTypeSourceInfo() && 9691 !ExprChanged) 9692 return E; 9693 9694 // Build a new offsetof expression. 9695 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9696 Components, E->getRParenLoc()); 9697 } 9698 9699 template<typename Derived> 9700 ExprResult 9701 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9702 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9703 "opaque value expression requires transformation"); 9704 return E; 9705 } 9706 9707 template<typename Derived> 9708 ExprResult 9709 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9710 return E; 9711 } 9712 9713 template<typename Derived> 9714 ExprResult 9715 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9716 // Rebuild the syntactic form. The original syntactic form has 9717 // opaque-value expressions in it, so strip those away and rebuild 9718 // the result. This is a really awful way of doing this, but the 9719 // better solution (rebuilding the semantic expressions and 9720 // rebinding OVEs as necessary) doesn't work; we'd need 9721 // TreeTransform to not strip away implicit conversions. 9722 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9723 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9724 if (result.isInvalid()) return ExprError(); 9725 9726 // If that gives us a pseudo-object result back, the pseudo-object 9727 // expression must have been an lvalue-to-rvalue conversion which we 9728 // should reapply. 9729 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9730 result = SemaRef.checkPseudoObjectRValue(result.get()); 9731 9732 return result; 9733 } 9734 9735 template<typename Derived> 9736 ExprResult 9737 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9738 UnaryExprOrTypeTraitExpr *E) { 9739 if (E->isArgumentType()) { 9740 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9741 9742 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9743 if (!NewT) 9744 return ExprError(); 9745 9746 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9747 return E; 9748 9749 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9750 E->getKind(), 9751 E->getSourceRange()); 9752 } 9753 9754 // C++0x [expr.sizeof]p1: 9755 // The operand is either an expression, which is an unevaluated operand 9756 // [...] 9757 EnterExpressionEvaluationContext Unevaluated( 9758 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9759 Sema::ReuseLambdaContextDecl); 9760 9761 // Try to recover if we have something like sizeof(T::X) where X is a type. 9762 // Notably, there must be *exactly* one set of parens if X is a type. 9763 TypeSourceInfo *RecoveryTSI = nullptr; 9764 ExprResult SubExpr; 9765 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9766 if (auto *DRE = 9767 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9768 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9769 PE, DRE, false, &RecoveryTSI); 9770 else 9771 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9772 9773 if (RecoveryTSI) { 9774 return getDerived().RebuildUnaryExprOrTypeTrait( 9775 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9776 } else if (SubExpr.isInvalid()) 9777 return ExprError(); 9778 9779 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9780 return E; 9781 9782 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9783 E->getOperatorLoc(), 9784 E->getKind(), 9785 E->getSourceRange()); 9786 } 9787 9788 template<typename Derived> 9789 ExprResult 9790 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 9791 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9792 if (LHS.isInvalid()) 9793 return ExprError(); 9794 9795 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9796 if (RHS.isInvalid()) 9797 return ExprError(); 9798 9799 9800 if (!getDerived().AlwaysRebuild() && 9801 LHS.get() == E->getLHS() && 9802 RHS.get() == E->getRHS()) 9803 return E; 9804 9805 return getDerived().RebuildArraySubscriptExpr( 9806 LHS.get(), 9807 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 9808 } 9809 9810 template <typename Derived> 9811 ExprResult 9812 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9813 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9814 if (Base.isInvalid()) 9815 return ExprError(); 9816 9817 ExprResult LowerBound; 9818 if (E->getLowerBound()) { 9819 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9820 if (LowerBound.isInvalid()) 9821 return ExprError(); 9822 } 9823 9824 ExprResult Length; 9825 if (E->getLength()) { 9826 Length = getDerived().TransformExpr(E->getLength()); 9827 if (Length.isInvalid()) 9828 return ExprError(); 9829 } 9830 9831 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9832 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9833 return E; 9834 9835 return getDerived().RebuildOMPArraySectionExpr( 9836 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 9837 Length.get(), E->getRBracketLoc()); 9838 } 9839 9840 template<typename Derived> 9841 ExprResult 9842 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9843 // Transform the callee. 9844 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9845 if (Callee.isInvalid()) 9846 return ExprError(); 9847 9848 // Transform arguments. 9849 bool ArgChanged = false; 9850 SmallVector<Expr*, 8> Args; 9851 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9852 &ArgChanged)) 9853 return ExprError(); 9854 9855 if (!getDerived().AlwaysRebuild() && 9856 Callee.get() == E->getCallee() && 9857 !ArgChanged) 9858 return SemaRef.MaybeBindToTemporary(E); 9859 9860 // FIXME: Wrong source location information for the '('. 9861 SourceLocation FakeLParenLoc 9862 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9863 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9864 Args, 9865 E->getRParenLoc()); 9866 } 9867 9868 template<typename Derived> 9869 ExprResult 9870 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9871 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9872 if (Base.isInvalid()) 9873 return ExprError(); 9874 9875 NestedNameSpecifierLoc QualifierLoc; 9876 if (E->hasQualifier()) { 9877 QualifierLoc 9878 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9879 9880 if (!QualifierLoc) 9881 return ExprError(); 9882 } 9883 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9884 9885 ValueDecl *Member 9886 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9887 E->getMemberDecl())); 9888 if (!Member) 9889 return ExprError(); 9890 9891 NamedDecl *FoundDecl = E->getFoundDecl(); 9892 if (FoundDecl == E->getMemberDecl()) { 9893 FoundDecl = Member; 9894 } else { 9895 FoundDecl = cast_or_null<NamedDecl>( 9896 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9897 if (!FoundDecl) 9898 return ExprError(); 9899 } 9900 9901 if (!getDerived().AlwaysRebuild() && 9902 Base.get() == E->getBase() && 9903 QualifierLoc == E->getQualifierLoc() && 9904 Member == E->getMemberDecl() && 9905 FoundDecl == E->getFoundDecl() && 9906 !E->hasExplicitTemplateArgs()) { 9907 9908 // Mark it referenced in the new context regardless. 9909 // FIXME: this is a bit instantiation-specific. 9910 SemaRef.MarkMemberReferenced(E); 9911 9912 return E; 9913 } 9914 9915 TemplateArgumentListInfo TransArgs; 9916 if (E->hasExplicitTemplateArgs()) { 9917 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9918 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9919 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9920 E->getNumTemplateArgs(), 9921 TransArgs)) 9922 return ExprError(); 9923 } 9924 9925 // FIXME: Bogus source location for the operator 9926 SourceLocation FakeOperatorLoc = 9927 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9928 9929 // FIXME: to do this check properly, we will need to preserve the 9930 // first-qualifier-in-scope here, just in case we had a dependent 9931 // base (and therefore couldn't do the check) and a 9932 // nested-name-qualifier (and therefore could do the lookup). 9933 NamedDecl *FirstQualifierInScope = nullptr; 9934 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9935 if (MemberNameInfo.getName()) { 9936 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9937 if (!MemberNameInfo.getName()) 9938 return ExprError(); 9939 } 9940 9941 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9942 E->isArrow(), 9943 QualifierLoc, 9944 TemplateKWLoc, 9945 MemberNameInfo, 9946 Member, 9947 FoundDecl, 9948 (E->hasExplicitTemplateArgs() 9949 ? &TransArgs : nullptr), 9950 FirstQualifierInScope); 9951 } 9952 9953 template<typename Derived> 9954 ExprResult 9955 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9956 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9957 if (LHS.isInvalid()) 9958 return ExprError(); 9959 9960 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9961 if (RHS.isInvalid()) 9962 return ExprError(); 9963 9964 if (!getDerived().AlwaysRebuild() && 9965 LHS.get() == E->getLHS() && 9966 RHS.get() == E->getRHS()) 9967 return E; 9968 9969 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 9970 getSema().FPFeatures = E->getFPFeatures(); 9971 9972 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9973 LHS.get(), RHS.get()); 9974 } 9975 9976 template <typename Derived> 9977 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 9978 CXXRewrittenBinaryOperator *E) { 9979 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 9980 9981 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 9982 if (LHS.isInvalid()) 9983 return ExprError(); 9984 9985 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 9986 if (RHS.isInvalid()) 9987 return ExprError(); 9988 9989 if (!getDerived().AlwaysRebuild() && 9990 LHS.get() == Decomp.LHS && 9991 RHS.get() == Decomp.RHS) 9992 return E; 9993 9994 // Extract the already-resolved callee declarations so that we can restrict 9995 // ourselves to using them as the unqualified lookup results when rebuilding. 9996 UnresolvedSet<2> UnqualLookups; 9997 Expr *PossibleBinOps[] = {E->getSemanticForm(), 9998 const_cast<Expr *>(Decomp.InnerBinOp)}; 9999 for (Expr *PossibleBinOp : PossibleBinOps) { 10000 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10001 if (!Op) 10002 continue; 10003 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10004 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10005 continue; 10006 10007 // Transform the callee in case we built a call to a local extern 10008 // declaration. 10009 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10010 E->getOperatorLoc(), Callee->getFoundDecl())); 10011 if (!Found) 10012 return ExprError(); 10013 UnqualLookups.addDecl(Found); 10014 } 10015 10016 return getDerived().RebuildCXXRewrittenBinaryOperator( 10017 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10018 } 10019 10020 template<typename Derived> 10021 ExprResult 10022 TreeTransform<Derived>::TransformCompoundAssignOperator( 10023 CompoundAssignOperator *E) { 10024 return getDerived().TransformBinaryOperator(E); 10025 } 10026 10027 template<typename Derived> 10028 ExprResult TreeTransform<Derived>:: 10029 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10030 // Just rebuild the common and RHS expressions and see whether we 10031 // get any changes. 10032 10033 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10034 if (commonExpr.isInvalid()) 10035 return ExprError(); 10036 10037 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10038 if (rhs.isInvalid()) 10039 return ExprError(); 10040 10041 if (!getDerived().AlwaysRebuild() && 10042 commonExpr.get() == e->getCommon() && 10043 rhs.get() == e->getFalseExpr()) 10044 return e; 10045 10046 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10047 e->getQuestionLoc(), 10048 nullptr, 10049 e->getColonLoc(), 10050 rhs.get()); 10051 } 10052 10053 template<typename Derived> 10054 ExprResult 10055 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10056 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10057 if (Cond.isInvalid()) 10058 return ExprError(); 10059 10060 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10061 if (LHS.isInvalid()) 10062 return ExprError(); 10063 10064 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10065 if (RHS.isInvalid()) 10066 return ExprError(); 10067 10068 if (!getDerived().AlwaysRebuild() && 10069 Cond.get() == E->getCond() && 10070 LHS.get() == E->getLHS() && 10071 RHS.get() == E->getRHS()) 10072 return E; 10073 10074 return getDerived().RebuildConditionalOperator(Cond.get(), 10075 E->getQuestionLoc(), 10076 LHS.get(), 10077 E->getColonLoc(), 10078 RHS.get()); 10079 } 10080 10081 template<typename Derived> 10082 ExprResult 10083 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10084 // Implicit casts are eliminated during transformation, since they 10085 // will be recomputed by semantic analysis after transformation. 10086 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10087 } 10088 10089 template<typename Derived> 10090 ExprResult 10091 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10092 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10093 if (!Type) 10094 return ExprError(); 10095 10096 ExprResult SubExpr 10097 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10098 if (SubExpr.isInvalid()) 10099 return ExprError(); 10100 10101 if (!getDerived().AlwaysRebuild() && 10102 Type == E->getTypeInfoAsWritten() && 10103 SubExpr.get() == E->getSubExpr()) 10104 return E; 10105 10106 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10107 Type, 10108 E->getRParenLoc(), 10109 SubExpr.get()); 10110 } 10111 10112 template<typename Derived> 10113 ExprResult 10114 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10115 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10116 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10117 if (!NewT) 10118 return ExprError(); 10119 10120 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10121 if (Init.isInvalid()) 10122 return ExprError(); 10123 10124 if (!getDerived().AlwaysRebuild() && 10125 OldT == NewT && 10126 Init.get() == E->getInitializer()) 10127 return SemaRef.MaybeBindToTemporary(E); 10128 10129 // Note: the expression type doesn't necessarily match the 10130 // type-as-written, but that's okay, because it should always be 10131 // derivable from the initializer. 10132 10133 return getDerived().RebuildCompoundLiteralExpr( 10134 E->getLParenLoc(), NewT, 10135 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10136 } 10137 10138 template<typename Derived> 10139 ExprResult 10140 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10141 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10142 if (Base.isInvalid()) 10143 return ExprError(); 10144 10145 if (!getDerived().AlwaysRebuild() && 10146 Base.get() == E->getBase()) 10147 return E; 10148 10149 // FIXME: Bad source location 10150 SourceLocation FakeOperatorLoc = 10151 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10152 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10153 E->getAccessorLoc(), 10154 E->getAccessor()); 10155 } 10156 10157 template<typename Derived> 10158 ExprResult 10159 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10160 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10161 E = Syntactic; 10162 10163 bool InitChanged = false; 10164 10165 EnterExpressionEvaluationContext Context( 10166 getSema(), EnterExpressionEvaluationContext::InitList); 10167 10168 SmallVector<Expr*, 4> Inits; 10169 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10170 Inits, &InitChanged)) 10171 return ExprError(); 10172 10173 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10174 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10175 // in some cases. We can't reuse it in general, because the syntactic and 10176 // semantic forms are linked, and we can't know that semantic form will 10177 // match even if the syntactic form does. 10178 } 10179 10180 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10181 E->getRBraceLoc()); 10182 } 10183 10184 template<typename Derived> 10185 ExprResult 10186 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10187 Designation Desig; 10188 10189 // transform the initializer value 10190 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10191 if (Init.isInvalid()) 10192 return ExprError(); 10193 10194 // transform the designators. 10195 SmallVector<Expr*, 4> ArrayExprs; 10196 bool ExprChanged = false; 10197 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10198 if (D.isFieldDesignator()) { 10199 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10200 D.getDotLoc(), 10201 D.getFieldLoc())); 10202 if (D.getField()) { 10203 FieldDecl *Field = cast_or_null<FieldDecl>( 10204 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10205 if (Field != D.getField()) 10206 // Rebuild the expression when the transformed FieldDecl is 10207 // different to the already assigned FieldDecl. 10208 ExprChanged = true; 10209 } else { 10210 // Ensure that the designator expression is rebuilt when there isn't 10211 // a resolved FieldDecl in the designator as we don't want to assign 10212 // a FieldDecl to a pattern designator that will be instantiated again. 10213 ExprChanged = true; 10214 } 10215 continue; 10216 } 10217 10218 if (D.isArrayDesignator()) { 10219 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10220 if (Index.isInvalid()) 10221 return ExprError(); 10222 10223 Desig.AddDesignator( 10224 Designator::getArray(Index.get(), D.getLBracketLoc())); 10225 10226 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10227 ArrayExprs.push_back(Index.get()); 10228 continue; 10229 } 10230 10231 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10232 ExprResult Start 10233 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10234 if (Start.isInvalid()) 10235 return ExprError(); 10236 10237 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10238 if (End.isInvalid()) 10239 return ExprError(); 10240 10241 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10242 End.get(), 10243 D.getLBracketLoc(), 10244 D.getEllipsisLoc())); 10245 10246 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10247 End.get() != E->getArrayRangeEnd(D); 10248 10249 ArrayExprs.push_back(Start.get()); 10250 ArrayExprs.push_back(End.get()); 10251 } 10252 10253 if (!getDerived().AlwaysRebuild() && 10254 Init.get() == E->getInit() && 10255 !ExprChanged) 10256 return E; 10257 10258 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10259 E->getEqualOrColonLoc(), 10260 E->usesGNUSyntax(), Init.get()); 10261 } 10262 10263 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10264 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10265 template<typename Derived> 10266 ExprResult 10267 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10268 DesignatedInitUpdateExpr *E) { 10269 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10270 "initializer"); 10271 return ExprError(); 10272 } 10273 10274 template<typename Derived> 10275 ExprResult 10276 TreeTransform<Derived>::TransformNoInitExpr( 10277 NoInitExpr *E) { 10278 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10279 return ExprError(); 10280 } 10281 10282 template<typename Derived> 10283 ExprResult 10284 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10285 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10286 return ExprError(); 10287 } 10288 10289 template<typename Derived> 10290 ExprResult 10291 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10292 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10293 return ExprError(); 10294 } 10295 10296 template<typename Derived> 10297 ExprResult 10298 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10299 ImplicitValueInitExpr *E) { 10300 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10301 10302 // FIXME: Will we ever have proper type location here? Will we actually 10303 // need to transform the type? 10304 QualType T = getDerived().TransformType(E->getType()); 10305 if (T.isNull()) 10306 return ExprError(); 10307 10308 if (!getDerived().AlwaysRebuild() && 10309 T == E->getType()) 10310 return E; 10311 10312 return getDerived().RebuildImplicitValueInitExpr(T); 10313 } 10314 10315 template<typename Derived> 10316 ExprResult 10317 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10318 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10319 if (!TInfo) 10320 return ExprError(); 10321 10322 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10323 if (SubExpr.isInvalid()) 10324 return ExprError(); 10325 10326 if (!getDerived().AlwaysRebuild() && 10327 TInfo == E->getWrittenTypeInfo() && 10328 SubExpr.get() == E->getSubExpr()) 10329 return E; 10330 10331 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10332 TInfo, E->getRParenLoc()); 10333 } 10334 10335 template<typename Derived> 10336 ExprResult 10337 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10338 bool ArgumentChanged = false; 10339 SmallVector<Expr*, 4> Inits; 10340 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10341 &ArgumentChanged)) 10342 return ExprError(); 10343 10344 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10345 Inits, 10346 E->getRParenLoc()); 10347 } 10348 10349 /// Transform an address-of-label expression. 10350 /// 10351 /// By default, the transformation of an address-of-label expression always 10352 /// rebuilds the expression, so that the label identifier can be resolved to 10353 /// the corresponding label statement by semantic analysis. 10354 template<typename Derived> 10355 ExprResult 10356 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10357 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10358 E->getLabel()); 10359 if (!LD) 10360 return ExprError(); 10361 10362 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10363 cast<LabelDecl>(LD)); 10364 } 10365 10366 template<typename Derived> 10367 ExprResult 10368 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10369 SemaRef.ActOnStartStmtExpr(); 10370 StmtResult SubStmt 10371 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10372 if (SubStmt.isInvalid()) { 10373 SemaRef.ActOnStmtExprError(); 10374 return ExprError(); 10375 } 10376 10377 if (!getDerived().AlwaysRebuild() && 10378 SubStmt.get() == E->getSubStmt()) { 10379 // Calling this an 'error' is unintuitive, but it does the right thing. 10380 SemaRef.ActOnStmtExprError(); 10381 return SemaRef.MaybeBindToTemporary(E); 10382 } 10383 10384 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 10385 SubStmt.get(), 10386 E->getRParenLoc()); 10387 } 10388 10389 template<typename Derived> 10390 ExprResult 10391 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10392 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10393 if (Cond.isInvalid()) 10394 return ExprError(); 10395 10396 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10397 if (LHS.isInvalid()) 10398 return ExprError(); 10399 10400 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10401 if (RHS.isInvalid()) 10402 return ExprError(); 10403 10404 if (!getDerived().AlwaysRebuild() && 10405 Cond.get() == E->getCond() && 10406 LHS.get() == E->getLHS() && 10407 RHS.get() == E->getRHS()) 10408 return E; 10409 10410 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10411 Cond.get(), LHS.get(), RHS.get(), 10412 E->getRParenLoc()); 10413 } 10414 10415 template<typename Derived> 10416 ExprResult 10417 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10418 return E; 10419 } 10420 10421 template<typename Derived> 10422 ExprResult 10423 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10424 switch (E->getOperator()) { 10425 case OO_New: 10426 case OO_Delete: 10427 case OO_Array_New: 10428 case OO_Array_Delete: 10429 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10430 10431 case OO_Call: { 10432 // This is a call to an object's operator(). 10433 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10434 10435 // Transform the object itself. 10436 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10437 if (Object.isInvalid()) 10438 return ExprError(); 10439 10440 // FIXME: Poor location information 10441 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10442 static_cast<Expr *>(Object.get())->getEndLoc()); 10443 10444 // Transform the call arguments. 10445 SmallVector<Expr*, 8> Args; 10446 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10447 Args)) 10448 return ExprError(); 10449 10450 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10451 E->getEndLoc()); 10452 } 10453 10454 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10455 case OO_##Name: 10456 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10457 #include "clang/Basic/OperatorKinds.def" 10458 case OO_Subscript: 10459 // Handled below. 10460 break; 10461 10462 case OO_Conditional: 10463 llvm_unreachable("conditional operator is not actually overloadable"); 10464 10465 case OO_None: 10466 case NUM_OVERLOADED_OPERATORS: 10467 llvm_unreachable("not an overloaded operator?"); 10468 } 10469 10470 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10471 if (Callee.isInvalid()) 10472 return ExprError(); 10473 10474 ExprResult First; 10475 if (E->getOperator() == OO_Amp) 10476 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10477 else 10478 First = getDerived().TransformExpr(E->getArg(0)); 10479 if (First.isInvalid()) 10480 return ExprError(); 10481 10482 ExprResult Second; 10483 if (E->getNumArgs() == 2) { 10484 Second = getDerived().TransformExpr(E->getArg(1)); 10485 if (Second.isInvalid()) 10486 return ExprError(); 10487 } 10488 10489 if (!getDerived().AlwaysRebuild() && 10490 Callee.get() == E->getCallee() && 10491 First.get() == E->getArg(0) && 10492 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10493 return SemaRef.MaybeBindToTemporary(E); 10494 10495 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10496 getSema().FPFeatures = E->getFPFeatures(); 10497 10498 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10499 E->getOperatorLoc(), 10500 Callee.get(), 10501 First.get(), 10502 Second.get()); 10503 } 10504 10505 template<typename Derived> 10506 ExprResult 10507 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10508 return getDerived().TransformCallExpr(E); 10509 } 10510 10511 template <typename Derived> 10512 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 10513 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 10514 getSema().CurContext != E->getParentContext(); 10515 10516 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 10517 return E; 10518 10519 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 10520 E->getEndLoc(), 10521 getSema().CurContext); 10522 } 10523 10524 template<typename Derived> 10525 ExprResult 10526 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10527 // Transform the callee. 10528 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10529 if (Callee.isInvalid()) 10530 return ExprError(); 10531 10532 // Transform exec config. 10533 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10534 if (EC.isInvalid()) 10535 return ExprError(); 10536 10537 // Transform arguments. 10538 bool ArgChanged = false; 10539 SmallVector<Expr*, 8> Args; 10540 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10541 &ArgChanged)) 10542 return ExprError(); 10543 10544 if (!getDerived().AlwaysRebuild() && 10545 Callee.get() == E->getCallee() && 10546 !ArgChanged) 10547 return SemaRef.MaybeBindToTemporary(E); 10548 10549 // FIXME: Wrong source location information for the '('. 10550 SourceLocation FakeLParenLoc 10551 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10552 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10553 Args, 10554 E->getRParenLoc(), EC.get()); 10555 } 10556 10557 template<typename Derived> 10558 ExprResult 10559 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10560 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10561 if (!Type) 10562 return ExprError(); 10563 10564 ExprResult SubExpr 10565 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10566 if (SubExpr.isInvalid()) 10567 return ExprError(); 10568 10569 if (!getDerived().AlwaysRebuild() && 10570 Type == E->getTypeInfoAsWritten() && 10571 SubExpr.get() == E->getSubExpr()) 10572 return E; 10573 return getDerived().RebuildCXXNamedCastExpr( 10574 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10575 Type, E->getAngleBrackets().getEnd(), 10576 // FIXME. this should be '(' location 10577 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10578 } 10579 10580 template<typename Derived> 10581 ExprResult 10582 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 10583 TypeSourceInfo *TSI = 10584 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 10585 if (!TSI) 10586 return ExprError(); 10587 10588 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 10589 if (Sub.isInvalid()) 10590 return ExprError(); 10591 10592 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 10593 Sub.get(), BCE->getEndLoc()); 10594 } 10595 10596 template<typename Derived> 10597 ExprResult 10598 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10599 return getDerived().TransformCXXNamedCastExpr(E); 10600 } 10601 10602 template<typename Derived> 10603 ExprResult 10604 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10605 return getDerived().TransformCXXNamedCastExpr(E); 10606 } 10607 10608 template<typename Derived> 10609 ExprResult 10610 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10611 CXXReinterpretCastExpr *E) { 10612 return getDerived().TransformCXXNamedCastExpr(E); 10613 } 10614 10615 template<typename Derived> 10616 ExprResult 10617 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10618 return getDerived().TransformCXXNamedCastExpr(E); 10619 } 10620 10621 template<typename Derived> 10622 ExprResult 10623 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10624 CXXFunctionalCastExpr *E) { 10625 TypeSourceInfo *Type = 10626 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10627 if (!Type) 10628 return ExprError(); 10629 10630 ExprResult SubExpr 10631 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10632 if (SubExpr.isInvalid()) 10633 return ExprError(); 10634 10635 if (!getDerived().AlwaysRebuild() && 10636 Type == E->getTypeInfoAsWritten() && 10637 SubExpr.get() == E->getSubExpr()) 10638 return E; 10639 10640 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10641 E->getLParenLoc(), 10642 SubExpr.get(), 10643 E->getRParenLoc(), 10644 E->isListInitialization()); 10645 } 10646 10647 template<typename Derived> 10648 ExprResult 10649 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10650 if (E->isTypeOperand()) { 10651 TypeSourceInfo *TInfo 10652 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10653 if (!TInfo) 10654 return ExprError(); 10655 10656 if (!getDerived().AlwaysRebuild() && 10657 TInfo == E->getTypeOperandSourceInfo()) 10658 return E; 10659 10660 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10661 TInfo, E->getEndLoc()); 10662 } 10663 10664 // We don't know whether the subexpression is potentially evaluated until 10665 // after we perform semantic analysis. We speculatively assume it is 10666 // unevaluated; it will get fixed later if the subexpression is in fact 10667 // potentially evaluated. 10668 EnterExpressionEvaluationContext Unevaluated( 10669 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10670 Sema::ReuseLambdaContextDecl); 10671 10672 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10673 if (SubExpr.isInvalid()) 10674 return ExprError(); 10675 10676 if (!getDerived().AlwaysRebuild() && 10677 SubExpr.get() == E->getExprOperand()) 10678 return E; 10679 10680 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10681 SubExpr.get(), E->getEndLoc()); 10682 } 10683 10684 template<typename Derived> 10685 ExprResult 10686 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10687 if (E->isTypeOperand()) { 10688 TypeSourceInfo *TInfo 10689 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10690 if (!TInfo) 10691 return ExprError(); 10692 10693 if (!getDerived().AlwaysRebuild() && 10694 TInfo == E->getTypeOperandSourceInfo()) 10695 return E; 10696 10697 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10698 TInfo, E->getEndLoc()); 10699 } 10700 10701 EnterExpressionEvaluationContext Unevaluated( 10702 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10703 10704 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10705 if (SubExpr.isInvalid()) 10706 return ExprError(); 10707 10708 if (!getDerived().AlwaysRebuild() && 10709 SubExpr.get() == E->getExprOperand()) 10710 return E; 10711 10712 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10713 SubExpr.get(), E->getEndLoc()); 10714 } 10715 10716 template<typename Derived> 10717 ExprResult 10718 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 10719 return E; 10720 } 10721 10722 template<typename Derived> 10723 ExprResult 10724 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 10725 CXXNullPtrLiteralExpr *E) { 10726 return E; 10727 } 10728 10729 template<typename Derived> 10730 ExprResult 10731 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 10732 QualType T = getSema().getCurrentThisType(); 10733 10734 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 10735 // Mark it referenced in the new context regardless. 10736 // FIXME: this is a bit instantiation-specific. 10737 getSema().MarkThisReferenced(E); 10738 return E; 10739 } 10740 10741 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 10742 } 10743 10744 template<typename Derived> 10745 ExprResult 10746 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 10747 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10748 if (SubExpr.isInvalid()) 10749 return ExprError(); 10750 10751 if (!getDerived().AlwaysRebuild() && 10752 SubExpr.get() == E->getSubExpr()) 10753 return E; 10754 10755 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 10756 E->isThrownVariableInScope()); 10757 } 10758 10759 template<typename Derived> 10760 ExprResult 10761 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 10762 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 10763 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 10764 if (!Param) 10765 return ExprError(); 10766 10767 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 10768 E->getUsedContext() == SemaRef.CurContext) 10769 return E; 10770 10771 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 10772 } 10773 10774 template<typename Derived> 10775 ExprResult 10776 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 10777 FieldDecl *Field = cast_or_null<FieldDecl>( 10778 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 10779 if (!Field) 10780 return ExprError(); 10781 10782 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 10783 E->getUsedContext() == SemaRef.CurContext) 10784 return E; 10785 10786 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 10787 } 10788 10789 template<typename Derived> 10790 ExprResult 10791 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 10792 CXXScalarValueInitExpr *E) { 10793 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 10794 if (!T) 10795 return ExprError(); 10796 10797 if (!getDerived().AlwaysRebuild() && 10798 T == E->getTypeSourceInfo()) 10799 return E; 10800 10801 return getDerived().RebuildCXXScalarValueInitExpr(T, 10802 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10803 E->getRParenLoc()); 10804 } 10805 10806 template<typename Derived> 10807 ExprResult 10808 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 10809 // Transform the type that we're allocating 10810 TypeSourceInfo *AllocTypeInfo = 10811 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 10812 if (!AllocTypeInfo) 10813 return ExprError(); 10814 10815 // Transform the size of the array we're allocating (if any). 10816 Optional<Expr *> ArraySize; 10817 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 10818 ExprResult NewArraySize; 10819 if (*OldArraySize) { 10820 NewArraySize = getDerived().TransformExpr(*OldArraySize); 10821 if (NewArraySize.isInvalid()) 10822 return ExprError(); 10823 } 10824 ArraySize = NewArraySize.get(); 10825 } 10826 10827 // Transform the placement arguments (if any). 10828 bool ArgumentChanged = false; 10829 SmallVector<Expr*, 8> PlacementArgs; 10830 if (getDerived().TransformExprs(E->getPlacementArgs(), 10831 E->getNumPlacementArgs(), true, 10832 PlacementArgs, &ArgumentChanged)) 10833 return ExprError(); 10834 10835 // Transform the initializer (if any). 10836 Expr *OldInit = E->getInitializer(); 10837 ExprResult NewInit; 10838 if (OldInit) 10839 NewInit = getDerived().TransformInitializer(OldInit, true); 10840 if (NewInit.isInvalid()) 10841 return ExprError(); 10842 10843 // Transform new operator and delete operator. 10844 FunctionDecl *OperatorNew = nullptr; 10845 if (E->getOperatorNew()) { 10846 OperatorNew = cast_or_null<FunctionDecl>( 10847 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 10848 if (!OperatorNew) 10849 return ExprError(); 10850 } 10851 10852 FunctionDecl *OperatorDelete = nullptr; 10853 if (E->getOperatorDelete()) { 10854 OperatorDelete = cast_or_null<FunctionDecl>( 10855 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10856 if (!OperatorDelete) 10857 return ExprError(); 10858 } 10859 10860 if (!getDerived().AlwaysRebuild() && 10861 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 10862 ArraySize == E->getArraySize() && 10863 NewInit.get() == OldInit && 10864 OperatorNew == E->getOperatorNew() && 10865 OperatorDelete == E->getOperatorDelete() && 10866 !ArgumentChanged) { 10867 // Mark any declarations we need as referenced. 10868 // FIXME: instantiation-specific. 10869 if (OperatorNew) 10870 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 10871 if (OperatorDelete) 10872 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10873 10874 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10875 QualType ElementType 10876 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10877 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10878 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10879 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10880 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 10881 } 10882 } 10883 } 10884 10885 return E; 10886 } 10887 10888 QualType AllocType = AllocTypeInfo->getType(); 10889 if (!ArraySize) { 10890 // If no array size was specified, but the new expression was 10891 // instantiated with an array type (e.g., "new T" where T is 10892 // instantiated with "int[4]"), extract the outer bound from the 10893 // array type as our array size. We do this with constant and 10894 // dependently-sized array types. 10895 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10896 if (!ArrayT) { 10897 // Do nothing 10898 } else if (const ConstantArrayType *ConsArrayT 10899 = dyn_cast<ConstantArrayType>(ArrayT)) { 10900 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10901 SemaRef.Context.getSizeType(), 10902 /*FIXME:*/ E->getBeginLoc()); 10903 AllocType = ConsArrayT->getElementType(); 10904 } else if (const DependentSizedArrayType *DepArrayT 10905 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10906 if (DepArrayT->getSizeExpr()) { 10907 ArraySize = DepArrayT->getSizeExpr(); 10908 AllocType = DepArrayT->getElementType(); 10909 } 10910 } 10911 } 10912 10913 return getDerived().RebuildCXXNewExpr( 10914 E->getBeginLoc(), E->isGlobalNew(), 10915 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 10916 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 10917 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 10918 } 10919 10920 template<typename Derived> 10921 ExprResult 10922 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10923 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10924 if (Operand.isInvalid()) 10925 return ExprError(); 10926 10927 // Transform the delete operator, if known. 10928 FunctionDecl *OperatorDelete = nullptr; 10929 if (E->getOperatorDelete()) { 10930 OperatorDelete = cast_or_null<FunctionDecl>( 10931 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 10932 if (!OperatorDelete) 10933 return ExprError(); 10934 } 10935 10936 if (!getDerived().AlwaysRebuild() && 10937 Operand.get() == E->getArgument() && 10938 OperatorDelete == E->getOperatorDelete()) { 10939 // Mark any declarations we need as referenced. 10940 // FIXME: instantiation-specific. 10941 if (OperatorDelete) 10942 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 10943 10944 if (!E->getArgument()->isTypeDependent()) { 10945 QualType Destroyed = SemaRef.Context.getBaseElementType( 10946 E->getDestroyedType()); 10947 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10948 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10949 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 10950 SemaRef.LookupDestructor(Record)); 10951 } 10952 } 10953 10954 return E; 10955 } 10956 10957 return getDerived().RebuildCXXDeleteExpr( 10958 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 10959 } 10960 10961 template<typename Derived> 10962 ExprResult 10963 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10964 CXXPseudoDestructorExpr *E) { 10965 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10966 if (Base.isInvalid()) 10967 return ExprError(); 10968 10969 ParsedType ObjectTypePtr; 10970 bool MayBePseudoDestructor = false; 10971 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10972 E->getOperatorLoc(), 10973 E->isArrow()? tok::arrow : tok::period, 10974 ObjectTypePtr, 10975 MayBePseudoDestructor); 10976 if (Base.isInvalid()) 10977 return ExprError(); 10978 10979 QualType ObjectType = ObjectTypePtr.get(); 10980 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10981 if (QualifierLoc) { 10982 QualifierLoc 10983 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10984 if (!QualifierLoc) 10985 return ExprError(); 10986 } 10987 CXXScopeSpec SS; 10988 SS.Adopt(QualifierLoc); 10989 10990 PseudoDestructorTypeStorage Destroyed; 10991 if (E->getDestroyedTypeInfo()) { 10992 TypeSourceInfo *DestroyedTypeInfo 10993 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10994 ObjectType, nullptr, SS); 10995 if (!DestroyedTypeInfo) 10996 return ExprError(); 10997 Destroyed = DestroyedTypeInfo; 10998 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10999 // We aren't likely to be able to resolve the identifier down to a type 11000 // now anyway, so just retain the identifier. 11001 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11002 E->getDestroyedTypeLoc()); 11003 } else { 11004 // Look for a destructor known with the given name. 11005 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11006 *E->getDestroyedTypeIdentifier(), 11007 E->getDestroyedTypeLoc(), 11008 /*Scope=*/nullptr, 11009 SS, ObjectTypePtr, 11010 false); 11011 if (!T) 11012 return ExprError(); 11013 11014 Destroyed 11015 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11016 E->getDestroyedTypeLoc()); 11017 } 11018 11019 TypeSourceInfo *ScopeTypeInfo = nullptr; 11020 if (E->getScopeTypeInfo()) { 11021 CXXScopeSpec EmptySS; 11022 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11023 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11024 if (!ScopeTypeInfo) 11025 return ExprError(); 11026 } 11027 11028 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11029 E->getOperatorLoc(), 11030 E->isArrow(), 11031 SS, 11032 ScopeTypeInfo, 11033 E->getColonColonLoc(), 11034 E->getTildeLoc(), 11035 Destroyed); 11036 } 11037 11038 template <typename Derived> 11039 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11040 bool RequiresADL, 11041 LookupResult &R) { 11042 // Transform all the decls. 11043 bool AllEmptyPacks = true; 11044 for (auto *OldD : Old->decls()) { 11045 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11046 if (!InstD) { 11047 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11048 // This can happen because of dependent hiding. 11049 if (isa<UsingShadowDecl>(OldD)) 11050 continue; 11051 else { 11052 R.clear(); 11053 return true; 11054 } 11055 } 11056 11057 // Expand using pack declarations. 11058 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11059 ArrayRef<NamedDecl*> Decls = SingleDecl; 11060 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11061 Decls = UPD->expansions(); 11062 11063 // Expand using declarations. 11064 for (auto *D : Decls) { 11065 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11066 for (auto *SD : UD->shadows()) 11067 R.addDecl(SD); 11068 } else { 11069 R.addDecl(D); 11070 } 11071 } 11072 11073 AllEmptyPacks &= Decls.empty(); 11074 }; 11075 11076 // C++ [temp.res]/8.4.2: 11077 // The program is ill-formed, no diagnostic required, if [...] lookup for 11078 // a name in the template definition found a using-declaration, but the 11079 // lookup in the corresponding scope in the instantiation odoes not find 11080 // any declarations because the using-declaration was a pack expansion and 11081 // the corresponding pack is empty 11082 if (AllEmptyPacks && !RequiresADL) { 11083 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11084 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11085 return true; 11086 } 11087 11088 // Resolve a kind, but don't do any further analysis. If it's 11089 // ambiguous, the callee needs to deal with it. 11090 R.resolveKind(); 11091 return false; 11092 } 11093 11094 template<typename Derived> 11095 ExprResult 11096 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11097 UnresolvedLookupExpr *Old) { 11098 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11099 Sema::LookupOrdinaryName); 11100 11101 // Transform the declaration set. 11102 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11103 return ExprError(); 11104 11105 // Rebuild the nested-name qualifier, if present. 11106 CXXScopeSpec SS; 11107 if (Old->getQualifierLoc()) { 11108 NestedNameSpecifierLoc QualifierLoc 11109 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11110 if (!QualifierLoc) 11111 return ExprError(); 11112 11113 SS.Adopt(QualifierLoc); 11114 } 11115 11116 if (Old->getNamingClass()) { 11117 CXXRecordDecl *NamingClass 11118 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11119 Old->getNameLoc(), 11120 Old->getNamingClass())); 11121 if (!NamingClass) { 11122 R.clear(); 11123 return ExprError(); 11124 } 11125 11126 R.setNamingClass(NamingClass); 11127 } 11128 11129 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11130 11131 // If we have neither explicit template arguments, nor the template keyword, 11132 // it's a normal declaration name or member reference. 11133 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11134 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11135 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11136 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11137 // give a good diagnostic. 11138 if (D && D->isCXXInstanceMember()) { 11139 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11140 /*TemplateArgs=*/nullptr, 11141 /*Scope=*/nullptr); 11142 } 11143 11144 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11145 } 11146 11147 // If we have template arguments, rebuild them, then rebuild the 11148 // templateid expression. 11149 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11150 if (Old->hasExplicitTemplateArgs() && 11151 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11152 Old->getNumTemplateArgs(), 11153 TransArgs)) { 11154 R.clear(); 11155 return ExprError(); 11156 } 11157 11158 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11159 Old->requiresADL(), &TransArgs); 11160 } 11161 11162 template<typename Derived> 11163 ExprResult 11164 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11165 bool ArgChanged = false; 11166 SmallVector<TypeSourceInfo *, 4> Args; 11167 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11168 TypeSourceInfo *From = E->getArg(I); 11169 TypeLoc FromTL = From->getTypeLoc(); 11170 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11171 TypeLocBuilder TLB; 11172 TLB.reserve(FromTL.getFullDataSize()); 11173 QualType To = getDerived().TransformType(TLB, FromTL); 11174 if (To.isNull()) 11175 return ExprError(); 11176 11177 if (To == From->getType()) 11178 Args.push_back(From); 11179 else { 11180 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11181 ArgChanged = true; 11182 } 11183 continue; 11184 } 11185 11186 ArgChanged = true; 11187 11188 // We have a pack expansion. Instantiate it. 11189 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11190 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11191 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11192 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11193 11194 // Determine whether the set of unexpanded parameter packs can and should 11195 // be expanded. 11196 bool Expand = true; 11197 bool RetainExpansion = false; 11198 Optional<unsigned> OrigNumExpansions = 11199 ExpansionTL.getTypePtr()->getNumExpansions(); 11200 Optional<unsigned> NumExpansions = OrigNumExpansions; 11201 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11202 PatternTL.getSourceRange(), 11203 Unexpanded, 11204 Expand, RetainExpansion, 11205 NumExpansions)) 11206 return ExprError(); 11207 11208 if (!Expand) { 11209 // The transform has determined that we should perform a simple 11210 // transformation on the pack expansion, producing another pack 11211 // expansion. 11212 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11213 11214 TypeLocBuilder TLB; 11215 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11216 11217 QualType To = getDerived().TransformType(TLB, PatternTL); 11218 if (To.isNull()) 11219 return ExprError(); 11220 11221 To = getDerived().RebuildPackExpansionType(To, 11222 PatternTL.getSourceRange(), 11223 ExpansionTL.getEllipsisLoc(), 11224 NumExpansions); 11225 if (To.isNull()) 11226 return ExprError(); 11227 11228 PackExpansionTypeLoc ToExpansionTL 11229 = TLB.push<PackExpansionTypeLoc>(To); 11230 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11231 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11232 continue; 11233 } 11234 11235 // Expand the pack expansion by substituting for each argument in the 11236 // pack(s). 11237 for (unsigned I = 0; I != *NumExpansions; ++I) { 11238 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11239 TypeLocBuilder TLB; 11240 TLB.reserve(PatternTL.getFullDataSize()); 11241 QualType To = getDerived().TransformType(TLB, PatternTL); 11242 if (To.isNull()) 11243 return ExprError(); 11244 11245 if (To->containsUnexpandedParameterPack()) { 11246 To = getDerived().RebuildPackExpansionType(To, 11247 PatternTL.getSourceRange(), 11248 ExpansionTL.getEllipsisLoc(), 11249 NumExpansions); 11250 if (To.isNull()) 11251 return ExprError(); 11252 11253 PackExpansionTypeLoc ToExpansionTL 11254 = TLB.push<PackExpansionTypeLoc>(To); 11255 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11256 } 11257 11258 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11259 } 11260 11261 if (!RetainExpansion) 11262 continue; 11263 11264 // If we're supposed to retain a pack expansion, do so by temporarily 11265 // forgetting the partially-substituted parameter pack. 11266 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11267 11268 TypeLocBuilder TLB; 11269 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11270 11271 QualType To = getDerived().TransformType(TLB, PatternTL); 11272 if (To.isNull()) 11273 return ExprError(); 11274 11275 To = getDerived().RebuildPackExpansionType(To, 11276 PatternTL.getSourceRange(), 11277 ExpansionTL.getEllipsisLoc(), 11278 NumExpansions); 11279 if (To.isNull()) 11280 return ExprError(); 11281 11282 PackExpansionTypeLoc ToExpansionTL 11283 = TLB.push<PackExpansionTypeLoc>(To); 11284 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11285 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11286 } 11287 11288 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11289 return E; 11290 11291 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11292 E->getEndLoc()); 11293 } 11294 11295 template<typename Derived> 11296 ExprResult 11297 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11298 ConceptSpecializationExpr *E) { 11299 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11300 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11301 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11302 Old->NumTemplateArgs, TransArgs)) 11303 return ExprError(); 11304 11305 return getDerived().RebuildConceptSpecializationExpr( 11306 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11307 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11308 &TransArgs); 11309 } 11310 11311 template<typename Derived> 11312 ExprResult 11313 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11314 SmallVector<ParmVarDecl*, 4> TransParams; 11315 SmallVector<QualType, 4> TransParamTypes; 11316 Sema::ExtParameterInfoBuilder ExtParamInfos; 11317 11318 // C++2a [expr.prim.req]p2 11319 // Expressions appearing within a requirement-body are unevaluated operands. 11320 EnterExpressionEvaluationContext Ctx( 11321 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11322 11323 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11324 getSema().Context, E->getBody()->getDeclContext(), 11325 E->getBody()->getBeginLoc()); 11326 11327 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11328 11329 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11330 E->getLocalParameters(), 11331 /*ParamTypes=*/nullptr, 11332 /*ParamInfos=*/nullptr, 11333 TransParamTypes, &TransParams, 11334 ExtParamInfos)) 11335 return ExprError(); 11336 11337 for (ParmVarDecl *Param : TransParams) 11338 Param->setDeclContext(Body); 11339 11340 SmallVector<concepts::Requirement *, 4> TransReqs; 11341 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11342 TransReqs)) 11343 return ExprError(); 11344 11345 for (concepts::Requirement *Req : TransReqs) { 11346 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11347 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11348 ER->getReturnTypeRequirement() 11349 .getTypeConstraintTemplateParameterList()->getParam(0) 11350 ->setDeclContext(Body); 11351 } 11352 } 11353 } 11354 11355 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11356 TransParams, TransReqs, 11357 E->getRBraceLoc()); 11358 } 11359 11360 template<typename Derived> 11361 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11362 ArrayRef<concepts::Requirement *> Reqs, 11363 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11364 for (concepts::Requirement *Req : Reqs) { 11365 concepts::Requirement *TransReq = nullptr; 11366 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11367 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11368 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11369 TransReq = getDerived().TransformExprRequirement(ExprReq); 11370 else 11371 TransReq = getDerived().TransformNestedRequirement( 11372 cast<concepts::NestedRequirement>(Req)); 11373 if (!TransReq) 11374 return true; 11375 Transformed.push_back(TransReq); 11376 } 11377 return false; 11378 } 11379 11380 template<typename Derived> 11381 concepts::TypeRequirement * 11382 TreeTransform<Derived>::TransformTypeRequirement( 11383 concepts::TypeRequirement *Req) { 11384 if (Req->isSubstitutionFailure()) { 11385 if (getDerived().AlwaysRebuild()) 11386 return getDerived().RebuildTypeRequirement( 11387 Req->getSubstitutionDiagnostic()); 11388 return Req; 11389 } 11390 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11391 if (!TransType) 11392 return nullptr; 11393 return getDerived().RebuildTypeRequirement(TransType); 11394 } 11395 11396 template<typename Derived> 11397 concepts::ExprRequirement * 11398 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 11399 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 11400 if (Req->isExprSubstitutionFailure()) 11401 TransExpr = Req->getExprSubstitutionDiagnostic(); 11402 else { 11403 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 11404 if (TransExprRes.isInvalid()) 11405 return nullptr; 11406 TransExpr = TransExprRes.get(); 11407 } 11408 11409 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 11410 const auto &RetReq = Req->getReturnTypeRequirement(); 11411 if (RetReq.isEmpty()) 11412 TransRetReq.emplace(); 11413 else if (RetReq.isSubstitutionFailure()) 11414 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 11415 else if (RetReq.isTypeConstraint()) { 11416 TemplateParameterList *OrigTPL = 11417 RetReq.getTypeConstraintTemplateParameterList(); 11418 TemplateParameterList *TPL = 11419 getDerived().TransformTemplateParameterList(OrigTPL); 11420 if (!TPL) 11421 return nullptr; 11422 TransRetReq.emplace(TPL); 11423 } 11424 assert(TransRetReq.hasValue() && 11425 "All code paths leading here must set TransRetReq"); 11426 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 11427 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 11428 Req->getNoexceptLoc(), 11429 std::move(*TransRetReq)); 11430 return getDerived().RebuildExprRequirement( 11431 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 11432 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 11433 } 11434 11435 template<typename Derived> 11436 concepts::NestedRequirement * 11437 TreeTransform<Derived>::TransformNestedRequirement( 11438 concepts::NestedRequirement *Req) { 11439 if (Req->isSubstitutionFailure()) { 11440 if (getDerived().AlwaysRebuild()) 11441 return getDerived().RebuildNestedRequirement( 11442 Req->getSubstitutionDiagnostic()); 11443 return Req; 11444 } 11445 ExprResult TransConstraint = 11446 getDerived().TransformExpr(Req->getConstraintExpr()); 11447 if (TransConstraint.isInvalid()) 11448 return nullptr; 11449 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 11450 } 11451 11452 template<typename Derived> 11453 ExprResult 11454 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 11455 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 11456 if (!T) 11457 return ExprError(); 11458 11459 if (!getDerived().AlwaysRebuild() && 11460 T == E->getQueriedTypeSourceInfo()) 11461 return E; 11462 11463 ExprResult SubExpr; 11464 { 11465 EnterExpressionEvaluationContext Unevaluated( 11466 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11467 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 11468 if (SubExpr.isInvalid()) 11469 return ExprError(); 11470 11471 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 11472 return E; 11473 } 11474 11475 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 11476 SubExpr.get(), E->getEndLoc()); 11477 } 11478 11479 template<typename Derived> 11480 ExprResult 11481 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 11482 ExprResult SubExpr; 11483 { 11484 EnterExpressionEvaluationContext Unevaluated( 11485 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11486 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 11487 if (SubExpr.isInvalid()) 11488 return ExprError(); 11489 11490 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 11491 return E; 11492 } 11493 11494 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 11495 SubExpr.get(), E->getEndLoc()); 11496 } 11497 11498 template <typename Derived> 11499 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 11500 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 11501 TypeSourceInfo **RecoveryTSI) { 11502 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 11503 DRE, AddrTaken, RecoveryTSI); 11504 11505 // Propagate both errors and recovered types, which return ExprEmpty. 11506 if (!NewDRE.isUsable()) 11507 return NewDRE; 11508 11509 // We got an expr, wrap it up in parens. 11510 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 11511 return PE; 11512 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 11513 PE->getRParen()); 11514 } 11515 11516 template <typename Derived> 11517 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11518 DependentScopeDeclRefExpr *E) { 11519 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 11520 nullptr); 11521 } 11522 11523 template<typename Derived> 11524 ExprResult 11525 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11526 DependentScopeDeclRefExpr *E, 11527 bool IsAddressOfOperand, 11528 TypeSourceInfo **RecoveryTSI) { 11529 assert(E->getQualifierLoc()); 11530 NestedNameSpecifierLoc QualifierLoc 11531 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11532 if (!QualifierLoc) 11533 return ExprError(); 11534 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11535 11536 // TODO: If this is a conversion-function-id, verify that the 11537 // destination type name (if present) resolves the same way after 11538 // instantiation as it did in the local scope. 11539 11540 DeclarationNameInfo NameInfo 11541 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 11542 if (!NameInfo.getName()) 11543 return ExprError(); 11544 11545 if (!E->hasExplicitTemplateArgs()) { 11546 if (!getDerived().AlwaysRebuild() && 11547 QualifierLoc == E->getQualifierLoc() && 11548 // Note: it is sufficient to compare the Name component of NameInfo: 11549 // if name has not changed, DNLoc has not changed either. 11550 NameInfo.getName() == E->getDeclName()) 11551 return E; 11552 11553 return getDerived().RebuildDependentScopeDeclRefExpr( 11554 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 11555 IsAddressOfOperand, RecoveryTSI); 11556 } 11557 11558 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11559 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11560 E->getNumTemplateArgs(), 11561 TransArgs)) 11562 return ExprError(); 11563 11564 return getDerived().RebuildDependentScopeDeclRefExpr( 11565 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 11566 RecoveryTSI); 11567 } 11568 11569 template<typename Derived> 11570 ExprResult 11571 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 11572 // CXXConstructExprs other than for list-initialization and 11573 // CXXTemporaryObjectExpr are always implicit, so when we have 11574 // a 1-argument construction we just transform that argument. 11575 if ((E->getNumArgs() == 1 || 11576 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 11577 (!getDerived().DropCallArgument(E->getArg(0))) && 11578 !E->isListInitialization()) 11579 return getDerived().TransformExpr(E->getArg(0)); 11580 11581 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 11582 11583 QualType T = getDerived().TransformType(E->getType()); 11584 if (T.isNull()) 11585 return ExprError(); 11586 11587 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11588 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11589 if (!Constructor) 11590 return ExprError(); 11591 11592 bool ArgumentChanged = false; 11593 SmallVector<Expr*, 8> Args; 11594 { 11595 EnterExpressionEvaluationContext Context( 11596 getSema(), EnterExpressionEvaluationContext::InitList, 11597 E->isListInitialization()); 11598 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11599 &ArgumentChanged)) 11600 return ExprError(); 11601 } 11602 11603 if (!getDerived().AlwaysRebuild() && 11604 T == E->getType() && 11605 Constructor == E->getConstructor() && 11606 !ArgumentChanged) { 11607 // Mark the constructor as referenced. 11608 // FIXME: Instantiation-specific 11609 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11610 return E; 11611 } 11612 11613 return getDerived().RebuildCXXConstructExpr( 11614 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 11615 E->hadMultipleCandidates(), E->isListInitialization(), 11616 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 11617 E->getConstructionKind(), E->getParenOrBraceRange()); 11618 } 11619 11620 template<typename Derived> 11621 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 11622 CXXInheritedCtorInitExpr *E) { 11623 QualType T = getDerived().TransformType(E->getType()); 11624 if (T.isNull()) 11625 return ExprError(); 11626 11627 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11628 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11629 if (!Constructor) 11630 return ExprError(); 11631 11632 if (!getDerived().AlwaysRebuild() && 11633 T == E->getType() && 11634 Constructor == E->getConstructor()) { 11635 // Mark the constructor as referenced. 11636 // FIXME: Instantiation-specific 11637 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11638 return E; 11639 } 11640 11641 return getDerived().RebuildCXXInheritedCtorInitExpr( 11642 T, E->getLocation(), Constructor, 11643 E->constructsVBase(), E->inheritedFromVBase()); 11644 } 11645 11646 /// Transform a C++ temporary-binding expression. 11647 /// 11648 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 11649 /// transform the subexpression and return that. 11650 template<typename Derived> 11651 ExprResult 11652 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 11653 return getDerived().TransformExpr(E->getSubExpr()); 11654 } 11655 11656 /// Transform a C++ expression that contains cleanups that should 11657 /// be run after the expression is evaluated. 11658 /// 11659 /// Since ExprWithCleanups nodes are implicitly generated, we 11660 /// just transform the subexpression and return that. 11661 template<typename Derived> 11662 ExprResult 11663 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11664 return getDerived().TransformExpr(E->getSubExpr()); 11665 } 11666 11667 template<typename Derived> 11668 ExprResult 11669 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11670 CXXTemporaryObjectExpr *E) { 11671 TypeSourceInfo *T = 11672 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11673 if (!T) 11674 return ExprError(); 11675 11676 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11677 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11678 if (!Constructor) 11679 return ExprError(); 11680 11681 bool ArgumentChanged = false; 11682 SmallVector<Expr*, 8> Args; 11683 Args.reserve(E->getNumArgs()); 11684 { 11685 EnterExpressionEvaluationContext Context( 11686 getSema(), EnterExpressionEvaluationContext::InitList, 11687 E->isListInitialization()); 11688 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11689 &ArgumentChanged)) 11690 return ExprError(); 11691 } 11692 11693 if (!getDerived().AlwaysRebuild() && 11694 T == E->getTypeSourceInfo() && 11695 Constructor == E->getConstructor() && 11696 !ArgumentChanged) { 11697 // FIXME: Instantiation-specific 11698 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11699 return SemaRef.MaybeBindToTemporary(E); 11700 } 11701 11702 // FIXME: We should just pass E->isListInitialization(), but we're not 11703 // prepared to handle list-initialization without a child InitListExpr. 11704 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 11705 return getDerived().RebuildCXXTemporaryObjectExpr( 11706 T, LParenLoc, Args, E->getEndLoc(), 11707 /*ListInitialization=*/LParenLoc.isInvalid()); 11708 } 11709 11710 template<typename Derived> 11711 ExprResult 11712 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 11713 // Transform any init-capture expressions before entering the scope of the 11714 // lambda body, because they are not semantically within that scope. 11715 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 11716 struct TransformedInitCapture { 11717 // The location of the ... if the result is retaining a pack expansion. 11718 SourceLocation EllipsisLoc; 11719 // Zero or more expansions of the init-capture. 11720 SmallVector<InitCaptureInfoTy, 4> Expansions; 11721 }; 11722 SmallVector<TransformedInitCapture, 4> InitCaptures; 11723 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 11724 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11725 CEnd = E->capture_end(); 11726 C != CEnd; ++C) { 11727 if (!E->isInitCapture(C)) 11728 continue; 11729 11730 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 11731 VarDecl *OldVD = C->getCapturedVar(); 11732 11733 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 11734 Optional<unsigned> NumExpansions) { 11735 ExprResult NewExprInitResult = getDerived().TransformInitializer( 11736 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 11737 11738 if (NewExprInitResult.isInvalid()) { 11739 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 11740 return; 11741 } 11742 Expr *NewExprInit = NewExprInitResult.get(); 11743 11744 QualType NewInitCaptureType = 11745 getSema().buildLambdaInitCaptureInitialization( 11746 C->getLocation(), OldVD->getType()->isReferenceType(), 11747 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 11748 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 11749 NewExprInit); 11750 Result.Expansions.push_back( 11751 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 11752 }; 11753 11754 // If this is an init-capture pack, consider expanding the pack now. 11755 if (OldVD->isParameterPack()) { 11756 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 11757 ->getTypeLoc() 11758 .castAs<PackExpansionTypeLoc>(); 11759 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11760 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 11761 11762 // Determine whether the set of unexpanded parameter packs can and should 11763 // be expanded. 11764 bool Expand = true; 11765 bool RetainExpansion = false; 11766 Optional<unsigned> OrigNumExpansions = 11767 ExpansionTL.getTypePtr()->getNumExpansions(); 11768 Optional<unsigned> NumExpansions = OrigNumExpansions; 11769 if (getDerived().TryExpandParameterPacks( 11770 ExpansionTL.getEllipsisLoc(), 11771 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 11772 RetainExpansion, NumExpansions)) 11773 return ExprError(); 11774 if (Expand) { 11775 for (unsigned I = 0; I != *NumExpansions; ++I) { 11776 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11777 SubstInitCapture(SourceLocation(), None); 11778 } 11779 } 11780 if (!Expand || RetainExpansion) { 11781 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11782 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 11783 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 11784 } 11785 } else { 11786 SubstInitCapture(SourceLocation(), None); 11787 } 11788 } 11789 11790 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 11791 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 11792 11793 // Transform the template parameters, and add them to the current 11794 // instantiation scope. The null case is handled correctly. 11795 auto TPL = getDerived().TransformTemplateParameterList( 11796 E->getTemplateParameterList()); 11797 LSI->GLTemplateParameterList = TPL; 11798 11799 // Transform the type of the original lambda's call operator. 11800 // The transformation MUST be done in the CurrentInstantiationScope since 11801 // it introduces a mapping of the original to the newly created 11802 // transformed parameters. 11803 TypeSourceInfo *NewCallOpTSI = nullptr; 11804 { 11805 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 11806 FunctionProtoTypeLoc OldCallOpFPTL = 11807 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 11808 11809 TypeLocBuilder NewCallOpTLBuilder; 11810 SmallVector<QualType, 4> ExceptionStorage; 11811 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 11812 QualType NewCallOpType = TransformFunctionProtoType( 11813 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 11814 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 11815 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 11816 ExceptionStorage, Changed); 11817 }); 11818 if (NewCallOpType.isNull()) 11819 return ExprError(); 11820 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 11821 NewCallOpType); 11822 } 11823 11824 // Transform the trailing requires clause 11825 ExprResult NewTrailingRequiresClause; 11826 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 11827 // FIXME: Concepts: Substitution into requires clause should only happen 11828 // when checking satisfaction. 11829 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 11830 11831 // Create the local class that will describe the lambda. 11832 CXXRecordDecl *OldClass = E->getLambdaClass(); 11833 CXXRecordDecl *Class 11834 = getSema().createLambdaClosureType(E->getIntroducerRange(), 11835 NewCallOpTSI, 11836 /*KnownDependent=*/false, 11837 E->getCaptureDefault()); 11838 getDerived().transformedLocalDecl(OldClass, {Class}); 11839 11840 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 11841 if (getDerived().ReplacingOriginal()) 11842 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 11843 OldClass->hasKnownLambdaInternalLinkage(), 11844 OldClass->getLambdaContextDecl()); 11845 11846 // Build the call operator. 11847 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 11848 Class, E->getIntroducerRange(), NewCallOpTSI, 11849 E->getCallOperator()->getEndLoc(), 11850 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 11851 E->getCallOperator()->getConstexprKind(), 11852 NewTrailingRequiresClause.get()); 11853 11854 LSI->CallOperator = NewCallOperator; 11855 11856 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 11857 I != NumParams; ++I) { 11858 auto *P = NewCallOperator->getParamDecl(I); 11859 if (P->hasUninstantiatedDefaultArg()) { 11860 EnterExpressionEvaluationContext Eval( 11861 getSema(), 11862 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 11863 ExprResult R = getDerived().TransformExpr( 11864 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 11865 P->setDefaultArg(R.get()); 11866 } 11867 } 11868 11869 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 11870 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 11871 11872 // Number the lambda for linkage purposes if necessary. 11873 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 11874 11875 // Introduce the context of the call operator. 11876 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 11877 /*NewThisContext*/false); 11878 11879 // Enter the scope of the lambda. 11880 getSema().buildLambdaScope(LSI, NewCallOperator, 11881 E->getIntroducerRange(), 11882 E->getCaptureDefault(), 11883 E->getCaptureDefaultLoc(), 11884 E->hasExplicitParameters(), 11885 E->hasExplicitResultType(), 11886 E->isMutable()); 11887 11888 bool Invalid = false; 11889 11890 // Transform captures. 11891 for (LambdaExpr::capture_iterator C = E->capture_begin(), 11892 CEnd = E->capture_end(); 11893 C != CEnd; ++C) { 11894 // When we hit the first implicit capture, tell Sema that we've finished 11895 // the list of explicit captures. 11896 if (C->isImplicit()) 11897 break; 11898 11899 // Capturing 'this' is trivial. 11900 if (C->capturesThis()) { 11901 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 11902 /*BuildAndDiagnose*/ true, nullptr, 11903 C->getCaptureKind() == LCK_StarThis); 11904 continue; 11905 } 11906 // Captured expression will be recaptured during captured variables 11907 // rebuilding. 11908 if (C->capturesVLAType()) 11909 continue; 11910 11911 // Rebuild init-captures, including the implied field declaration. 11912 if (E->isInitCapture(C)) { 11913 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 11914 11915 VarDecl *OldVD = C->getCapturedVar(); 11916 llvm::SmallVector<Decl*, 4> NewVDs; 11917 11918 for (InitCaptureInfoTy &Info : NewC.Expansions) { 11919 ExprResult Init = Info.first; 11920 QualType InitQualType = Info.second; 11921 if (Init.isInvalid() || InitQualType.isNull()) { 11922 Invalid = true; 11923 break; 11924 } 11925 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 11926 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 11927 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 11928 if (!NewVD) { 11929 Invalid = true; 11930 break; 11931 } 11932 NewVDs.push_back(NewVD); 11933 getSema().addInitCapture(LSI, NewVD); 11934 } 11935 11936 if (Invalid) 11937 break; 11938 11939 getDerived().transformedLocalDecl(OldVD, NewVDs); 11940 continue; 11941 } 11942 11943 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 11944 11945 // Determine the capture kind for Sema. 11946 Sema::TryCaptureKind Kind 11947 = C->isImplicit()? Sema::TryCapture_Implicit 11948 : C->getCaptureKind() == LCK_ByCopy 11949 ? Sema::TryCapture_ExplicitByVal 11950 : Sema::TryCapture_ExplicitByRef; 11951 SourceLocation EllipsisLoc; 11952 if (C->isPackExpansion()) { 11953 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 11954 bool ShouldExpand = false; 11955 bool RetainExpansion = false; 11956 Optional<unsigned> NumExpansions; 11957 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 11958 C->getLocation(), 11959 Unexpanded, 11960 ShouldExpand, RetainExpansion, 11961 NumExpansions)) { 11962 Invalid = true; 11963 continue; 11964 } 11965 11966 if (ShouldExpand) { 11967 // The transform has determined that we should perform an expansion; 11968 // transform and capture each of the arguments. 11969 // expansion of the pattern. Do so. 11970 VarDecl *Pack = C->getCapturedVar(); 11971 for (unsigned I = 0; I != *NumExpansions; ++I) { 11972 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11973 VarDecl *CapturedVar 11974 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11975 Pack)); 11976 if (!CapturedVar) { 11977 Invalid = true; 11978 continue; 11979 } 11980 11981 // Capture the transformed variable. 11982 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 11983 } 11984 11985 // FIXME: Retain a pack expansion if RetainExpansion is true. 11986 11987 continue; 11988 } 11989 11990 EllipsisLoc = C->getEllipsisLoc(); 11991 } 11992 11993 // Transform the captured variable. 11994 VarDecl *CapturedVar 11995 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 11996 C->getCapturedVar())); 11997 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 11998 Invalid = true; 11999 continue; 12000 } 12001 12002 // Capture the transformed variable. 12003 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12004 EllipsisLoc); 12005 } 12006 getSema().finishLambdaExplicitCaptures(LSI); 12007 12008 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12009 // evaluation context even if we're not transforming the function body. 12010 getSema().PushExpressionEvaluationContext( 12011 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12012 12013 // Instantiate the body of the lambda expression. 12014 StmtResult Body = 12015 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12016 12017 // ActOnLambda* will pop the function scope for us. 12018 FuncScopeCleanup.disable(); 12019 12020 if (Body.isInvalid()) { 12021 SavedContext.pop(); 12022 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12023 /*IsInstantiation=*/true); 12024 return ExprError(); 12025 } 12026 12027 // Copy the LSI before ActOnFinishFunctionBody removes it. 12028 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12029 // the call operator. 12030 auto LSICopy = *LSI; 12031 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12032 /*IsInstantiation*/ true); 12033 SavedContext.pop(); 12034 12035 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12036 &LSICopy); 12037 } 12038 12039 template<typename Derived> 12040 StmtResult 12041 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12042 return TransformStmt(S); 12043 } 12044 12045 template<typename Derived> 12046 StmtResult 12047 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12048 // Transform captures. 12049 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12050 CEnd = E->capture_end(); 12051 C != CEnd; ++C) { 12052 // When we hit the first implicit capture, tell Sema that we've finished 12053 // the list of explicit captures. 12054 if (!C->isImplicit()) 12055 continue; 12056 12057 // Capturing 'this' is trivial. 12058 if (C->capturesThis()) { 12059 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12060 /*BuildAndDiagnose*/ true, nullptr, 12061 C->getCaptureKind() == LCK_StarThis); 12062 continue; 12063 } 12064 // Captured expression will be recaptured during captured variables 12065 // rebuilding. 12066 if (C->capturesVLAType()) 12067 continue; 12068 12069 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12070 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12071 12072 // Transform the captured variable. 12073 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12074 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12075 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12076 return StmtError(); 12077 12078 // Capture the transformed variable. 12079 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12080 } 12081 12082 return S; 12083 } 12084 12085 template<typename Derived> 12086 ExprResult 12087 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12088 CXXUnresolvedConstructExpr *E) { 12089 TypeSourceInfo *T = 12090 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12091 if (!T) 12092 return ExprError(); 12093 12094 bool ArgumentChanged = false; 12095 SmallVector<Expr*, 8> Args; 12096 Args.reserve(E->arg_size()); 12097 { 12098 EnterExpressionEvaluationContext Context( 12099 getSema(), EnterExpressionEvaluationContext::InitList, 12100 E->isListInitialization()); 12101 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12102 &ArgumentChanged)) 12103 return ExprError(); 12104 } 12105 12106 if (!getDerived().AlwaysRebuild() && 12107 T == E->getTypeSourceInfo() && 12108 !ArgumentChanged) 12109 return E; 12110 12111 // FIXME: we're faking the locations of the commas 12112 return getDerived().RebuildCXXUnresolvedConstructExpr( 12113 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12114 } 12115 12116 template<typename Derived> 12117 ExprResult 12118 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12119 CXXDependentScopeMemberExpr *E) { 12120 // Transform the base of the expression. 12121 ExprResult Base((Expr*) nullptr); 12122 Expr *OldBase; 12123 QualType BaseType; 12124 QualType ObjectType; 12125 if (!E->isImplicitAccess()) { 12126 OldBase = E->getBase(); 12127 Base = getDerived().TransformExpr(OldBase); 12128 if (Base.isInvalid()) 12129 return ExprError(); 12130 12131 // Start the member reference and compute the object's type. 12132 ParsedType ObjectTy; 12133 bool MayBePseudoDestructor = false; 12134 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12135 E->getOperatorLoc(), 12136 E->isArrow()? tok::arrow : tok::period, 12137 ObjectTy, 12138 MayBePseudoDestructor); 12139 if (Base.isInvalid()) 12140 return ExprError(); 12141 12142 ObjectType = ObjectTy.get(); 12143 BaseType = ((Expr*) Base.get())->getType(); 12144 } else { 12145 OldBase = nullptr; 12146 BaseType = getDerived().TransformType(E->getBaseType()); 12147 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12148 } 12149 12150 // Transform the first part of the nested-name-specifier that qualifies 12151 // the member name. 12152 NamedDecl *FirstQualifierInScope 12153 = getDerived().TransformFirstQualifierInScope( 12154 E->getFirstQualifierFoundInScope(), 12155 E->getQualifierLoc().getBeginLoc()); 12156 12157 NestedNameSpecifierLoc QualifierLoc; 12158 if (E->getQualifier()) { 12159 QualifierLoc 12160 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12161 ObjectType, 12162 FirstQualifierInScope); 12163 if (!QualifierLoc) 12164 return ExprError(); 12165 } 12166 12167 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12168 12169 // TODO: If this is a conversion-function-id, verify that the 12170 // destination type name (if present) resolves the same way after 12171 // instantiation as it did in the local scope. 12172 12173 DeclarationNameInfo NameInfo 12174 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12175 if (!NameInfo.getName()) 12176 return ExprError(); 12177 12178 if (!E->hasExplicitTemplateArgs()) { 12179 // This is a reference to a member without an explicitly-specified 12180 // template argument list. Optimize for this common case. 12181 if (!getDerived().AlwaysRebuild() && 12182 Base.get() == OldBase && 12183 BaseType == E->getBaseType() && 12184 QualifierLoc == E->getQualifierLoc() && 12185 NameInfo.getName() == E->getMember() && 12186 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12187 return E; 12188 12189 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12190 BaseType, 12191 E->isArrow(), 12192 E->getOperatorLoc(), 12193 QualifierLoc, 12194 TemplateKWLoc, 12195 FirstQualifierInScope, 12196 NameInfo, 12197 /*TemplateArgs*/nullptr); 12198 } 12199 12200 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12201 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12202 E->getNumTemplateArgs(), 12203 TransArgs)) 12204 return ExprError(); 12205 12206 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12207 BaseType, 12208 E->isArrow(), 12209 E->getOperatorLoc(), 12210 QualifierLoc, 12211 TemplateKWLoc, 12212 FirstQualifierInScope, 12213 NameInfo, 12214 &TransArgs); 12215 } 12216 12217 template<typename Derived> 12218 ExprResult 12219 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12220 // Transform the base of the expression. 12221 ExprResult Base((Expr*) nullptr); 12222 QualType BaseType; 12223 if (!Old->isImplicitAccess()) { 12224 Base = getDerived().TransformExpr(Old->getBase()); 12225 if (Base.isInvalid()) 12226 return ExprError(); 12227 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12228 Old->isArrow()); 12229 if (Base.isInvalid()) 12230 return ExprError(); 12231 BaseType = Base.get()->getType(); 12232 } else { 12233 BaseType = getDerived().TransformType(Old->getBaseType()); 12234 } 12235 12236 NestedNameSpecifierLoc QualifierLoc; 12237 if (Old->getQualifierLoc()) { 12238 QualifierLoc 12239 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12240 if (!QualifierLoc) 12241 return ExprError(); 12242 } 12243 12244 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12245 12246 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12247 Sema::LookupOrdinaryName); 12248 12249 // Transform the declaration set. 12250 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12251 return ExprError(); 12252 12253 // Determine the naming class. 12254 if (Old->getNamingClass()) { 12255 CXXRecordDecl *NamingClass 12256 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12257 Old->getMemberLoc(), 12258 Old->getNamingClass())); 12259 if (!NamingClass) 12260 return ExprError(); 12261 12262 R.setNamingClass(NamingClass); 12263 } 12264 12265 TemplateArgumentListInfo TransArgs; 12266 if (Old->hasExplicitTemplateArgs()) { 12267 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12268 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12269 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12270 Old->getNumTemplateArgs(), 12271 TransArgs)) 12272 return ExprError(); 12273 } 12274 12275 // FIXME: to do this check properly, we will need to preserve the 12276 // first-qualifier-in-scope here, just in case we had a dependent 12277 // base (and therefore couldn't do the check) and a 12278 // nested-name-qualifier (and therefore could do the lookup). 12279 NamedDecl *FirstQualifierInScope = nullptr; 12280 12281 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12282 BaseType, 12283 Old->getOperatorLoc(), 12284 Old->isArrow(), 12285 QualifierLoc, 12286 TemplateKWLoc, 12287 FirstQualifierInScope, 12288 R, 12289 (Old->hasExplicitTemplateArgs() 12290 ? &TransArgs : nullptr)); 12291 } 12292 12293 template<typename Derived> 12294 ExprResult 12295 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12296 EnterExpressionEvaluationContext Unevaluated( 12297 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12298 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12299 if (SubExpr.isInvalid()) 12300 return ExprError(); 12301 12302 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12303 return E; 12304 12305 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12306 } 12307 12308 template<typename Derived> 12309 ExprResult 12310 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12311 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12312 if (Pattern.isInvalid()) 12313 return ExprError(); 12314 12315 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12316 return E; 12317 12318 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12319 E->getNumExpansions()); 12320 } 12321 12322 template<typename Derived> 12323 ExprResult 12324 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12325 // If E is not value-dependent, then nothing will change when we transform it. 12326 // Note: This is an instantiation-centric view. 12327 if (!E->isValueDependent()) 12328 return E; 12329 12330 EnterExpressionEvaluationContext Unevaluated( 12331 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12332 12333 ArrayRef<TemplateArgument> PackArgs; 12334 TemplateArgument ArgStorage; 12335 12336 // Find the argument list to transform. 12337 if (E->isPartiallySubstituted()) { 12338 PackArgs = E->getPartialArguments(); 12339 } else if (E->isValueDependent()) { 12340 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12341 bool ShouldExpand = false; 12342 bool RetainExpansion = false; 12343 Optional<unsigned> NumExpansions; 12344 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12345 Unexpanded, 12346 ShouldExpand, RetainExpansion, 12347 NumExpansions)) 12348 return ExprError(); 12349 12350 // If we need to expand the pack, build a template argument from it and 12351 // expand that. 12352 if (ShouldExpand) { 12353 auto *Pack = E->getPack(); 12354 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12355 ArgStorage = getSema().Context.getPackExpansionType( 12356 getSema().Context.getTypeDeclType(TTPD), None); 12357 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12358 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12359 } else { 12360 auto *VD = cast<ValueDecl>(Pack); 12361 ExprResult DRE = getSema().BuildDeclRefExpr( 12362 VD, VD->getType().getNonLValueExprType(getSema().Context), 12363 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12364 E->getPackLoc()); 12365 if (DRE.isInvalid()) 12366 return ExprError(); 12367 ArgStorage = new (getSema().Context) PackExpansionExpr( 12368 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12369 } 12370 PackArgs = ArgStorage; 12371 } 12372 } 12373 12374 // If we're not expanding the pack, just transform the decl. 12375 if (!PackArgs.size()) { 12376 auto *Pack = cast_or_null<NamedDecl>( 12377 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12378 if (!Pack) 12379 return ExprError(); 12380 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12381 E->getPackLoc(), 12382 E->getRParenLoc(), None, None); 12383 } 12384 12385 // Try to compute the result without performing a partial substitution. 12386 Optional<unsigned> Result = 0; 12387 for (const TemplateArgument &Arg : PackArgs) { 12388 if (!Arg.isPackExpansion()) { 12389 Result = *Result + 1; 12390 continue; 12391 } 12392 12393 TemplateArgumentLoc ArgLoc; 12394 InventTemplateArgumentLoc(Arg, ArgLoc); 12395 12396 // Find the pattern of the pack expansion. 12397 SourceLocation Ellipsis; 12398 Optional<unsigned> OrigNumExpansions; 12399 TemplateArgumentLoc Pattern = 12400 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12401 OrigNumExpansions); 12402 12403 // Substitute under the pack expansion. Do not expand the pack (yet). 12404 TemplateArgumentLoc OutPattern; 12405 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12406 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 12407 /*Uneval*/ true)) 12408 return true; 12409 12410 // See if we can determine the number of arguments from the result. 12411 Optional<unsigned> NumExpansions = 12412 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 12413 if (!NumExpansions) { 12414 // No: we must be in an alias template expansion, and we're going to need 12415 // to actually expand the packs. 12416 Result = None; 12417 break; 12418 } 12419 12420 Result = *Result + *NumExpansions; 12421 } 12422 12423 // Common case: we could determine the number of expansions without 12424 // substituting. 12425 if (Result) 12426 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12427 E->getPackLoc(), 12428 E->getRParenLoc(), *Result, None); 12429 12430 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 12431 E->getPackLoc()); 12432 { 12433 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 12434 typedef TemplateArgumentLocInventIterator< 12435 Derived, const TemplateArgument*> PackLocIterator; 12436 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 12437 PackLocIterator(*this, PackArgs.end()), 12438 TransformedPackArgs, /*Uneval*/true)) 12439 return ExprError(); 12440 } 12441 12442 // Check whether we managed to fully-expand the pack. 12443 // FIXME: Is it possible for us to do so and not hit the early exit path? 12444 SmallVector<TemplateArgument, 8> Args; 12445 bool PartialSubstitution = false; 12446 for (auto &Loc : TransformedPackArgs.arguments()) { 12447 Args.push_back(Loc.getArgument()); 12448 if (Loc.getArgument().isPackExpansion()) 12449 PartialSubstitution = true; 12450 } 12451 12452 if (PartialSubstitution) 12453 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12454 E->getPackLoc(), 12455 E->getRParenLoc(), None, Args); 12456 12457 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12458 E->getPackLoc(), E->getRParenLoc(), 12459 Args.size(), None); 12460 } 12461 12462 template<typename Derived> 12463 ExprResult 12464 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 12465 SubstNonTypeTemplateParmPackExpr *E) { 12466 // Default behavior is to do nothing with this transformation. 12467 return E; 12468 } 12469 12470 template<typename Derived> 12471 ExprResult 12472 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 12473 SubstNonTypeTemplateParmExpr *E) { 12474 // Default behavior is to do nothing with this transformation. 12475 return E; 12476 } 12477 12478 template<typename Derived> 12479 ExprResult 12480 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 12481 // Default behavior is to do nothing with this transformation. 12482 return E; 12483 } 12484 12485 template<typename Derived> 12486 ExprResult 12487 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 12488 MaterializeTemporaryExpr *E) { 12489 return getDerived().TransformExpr(E->getSubExpr()); 12490 } 12491 12492 template<typename Derived> 12493 ExprResult 12494 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 12495 Expr *Pattern = E->getPattern(); 12496 12497 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12498 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 12499 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12500 12501 // Determine whether the set of unexpanded parameter packs can and should 12502 // be expanded. 12503 bool Expand = true; 12504 bool RetainExpansion = false; 12505 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 12506 NumExpansions = OrigNumExpansions; 12507 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 12508 Pattern->getSourceRange(), 12509 Unexpanded, 12510 Expand, RetainExpansion, 12511 NumExpansions)) 12512 return true; 12513 12514 if (!Expand) { 12515 // Do not expand any packs here, just transform and rebuild a fold 12516 // expression. 12517 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12518 12519 ExprResult LHS = 12520 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 12521 if (LHS.isInvalid()) 12522 return true; 12523 12524 ExprResult RHS = 12525 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 12526 if (RHS.isInvalid()) 12527 return true; 12528 12529 if (!getDerived().AlwaysRebuild() && 12530 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 12531 return E; 12532 12533 return getDerived().RebuildCXXFoldExpr( 12534 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 12535 RHS.get(), E->getEndLoc(), NumExpansions); 12536 } 12537 12538 // The transform has determined that we should perform an elementwise 12539 // expansion of the pattern. Do so. 12540 ExprResult Result = getDerived().TransformExpr(E->getInit()); 12541 if (Result.isInvalid()) 12542 return true; 12543 bool LeftFold = E->isLeftFold(); 12544 12545 // If we're retaining an expansion for a right fold, it is the innermost 12546 // component and takes the init (if any). 12547 if (!LeftFold && RetainExpansion) { 12548 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12549 12550 ExprResult Out = getDerived().TransformExpr(Pattern); 12551 if (Out.isInvalid()) 12552 return true; 12553 12554 Result = getDerived().RebuildCXXFoldExpr( 12555 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 12556 Result.get(), E->getEndLoc(), OrigNumExpansions); 12557 if (Result.isInvalid()) 12558 return true; 12559 } 12560 12561 for (unsigned I = 0; I != *NumExpansions; ++I) { 12562 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 12563 getSema(), LeftFold ? I : *NumExpansions - I - 1); 12564 ExprResult Out = getDerived().TransformExpr(Pattern); 12565 if (Out.isInvalid()) 12566 return true; 12567 12568 if (Out.get()->containsUnexpandedParameterPack()) { 12569 // We still have a pack; retain a pack expansion for this slice. 12570 Result = getDerived().RebuildCXXFoldExpr( 12571 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 12572 E->getOperator(), E->getEllipsisLoc(), 12573 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 12574 OrigNumExpansions); 12575 } else if (Result.isUsable()) { 12576 // We've got down to a single element; build a binary operator. 12577 Result = getDerived().RebuildBinaryOperator( 12578 E->getEllipsisLoc(), E->getOperator(), 12579 LeftFold ? Result.get() : Out.get(), 12580 LeftFold ? Out.get() : Result.get()); 12581 } else 12582 Result = Out; 12583 12584 if (Result.isInvalid()) 12585 return true; 12586 } 12587 12588 // If we're retaining an expansion for a left fold, it is the outermost 12589 // component and takes the complete expansion so far as its init (if any). 12590 if (LeftFold && RetainExpansion) { 12591 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12592 12593 ExprResult Out = getDerived().TransformExpr(Pattern); 12594 if (Out.isInvalid()) 12595 return true; 12596 12597 Result = getDerived().RebuildCXXFoldExpr( 12598 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 12599 Out.get(), E->getEndLoc(), OrigNumExpansions); 12600 if (Result.isInvalid()) 12601 return true; 12602 } 12603 12604 // If we had no init and an empty pack, and we're not retaining an expansion, 12605 // then produce a fallback value or error. 12606 if (Result.isUnset()) 12607 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 12608 E->getOperator()); 12609 12610 return Result; 12611 } 12612 12613 template<typename Derived> 12614 ExprResult 12615 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 12616 CXXStdInitializerListExpr *E) { 12617 return getDerived().TransformExpr(E->getSubExpr()); 12618 } 12619 12620 template<typename Derived> 12621 ExprResult 12622 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 12623 return SemaRef.MaybeBindToTemporary(E); 12624 } 12625 12626 template<typename Derived> 12627 ExprResult 12628 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 12629 return E; 12630 } 12631 12632 template<typename Derived> 12633 ExprResult 12634 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 12635 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12636 if (SubExpr.isInvalid()) 12637 return ExprError(); 12638 12639 if (!getDerived().AlwaysRebuild() && 12640 SubExpr.get() == E->getSubExpr()) 12641 return E; 12642 12643 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 12644 } 12645 12646 template<typename Derived> 12647 ExprResult 12648 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 12649 // Transform each of the elements. 12650 SmallVector<Expr *, 8> Elements; 12651 bool ArgChanged = false; 12652 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 12653 /*IsCall=*/false, Elements, &ArgChanged)) 12654 return ExprError(); 12655 12656 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12657 return SemaRef.MaybeBindToTemporary(E); 12658 12659 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 12660 Elements.data(), 12661 Elements.size()); 12662 } 12663 12664 template<typename Derived> 12665 ExprResult 12666 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 12667 ObjCDictionaryLiteral *E) { 12668 // Transform each of the elements. 12669 SmallVector<ObjCDictionaryElement, 8> Elements; 12670 bool ArgChanged = false; 12671 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 12672 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 12673 12674 if (OrigElement.isPackExpansion()) { 12675 // This key/value element is a pack expansion. 12676 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12677 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 12678 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 12679 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12680 12681 // Determine whether the set of unexpanded parameter packs can 12682 // and should be expanded. 12683 bool Expand = true; 12684 bool RetainExpansion = false; 12685 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 12686 Optional<unsigned> NumExpansions = OrigNumExpansions; 12687 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 12688 OrigElement.Value->getEndLoc()); 12689 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 12690 PatternRange, Unexpanded, Expand, 12691 RetainExpansion, NumExpansions)) 12692 return ExprError(); 12693 12694 if (!Expand) { 12695 // The transform has determined that we should perform a simple 12696 // transformation on the pack expansion, producing another pack 12697 // expansion. 12698 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12699 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12700 if (Key.isInvalid()) 12701 return ExprError(); 12702 12703 if (Key.get() != OrigElement.Key) 12704 ArgChanged = true; 12705 12706 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 12707 if (Value.isInvalid()) 12708 return ExprError(); 12709 12710 if (Value.get() != OrigElement.Value) 12711 ArgChanged = true; 12712 12713 ObjCDictionaryElement Expansion = { 12714 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 12715 }; 12716 Elements.push_back(Expansion); 12717 continue; 12718 } 12719 12720 // Record right away that the argument was changed. This needs 12721 // to happen even if the array expands to nothing. 12722 ArgChanged = true; 12723 12724 // The transform has determined that we should perform an elementwise 12725 // expansion of the pattern. Do so. 12726 for (unsigned I = 0; I != *NumExpansions; ++I) { 12727 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12728 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12729 if (Key.isInvalid()) 12730 return ExprError(); 12731 12732 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 12733 if (Value.isInvalid()) 12734 return ExprError(); 12735 12736 ObjCDictionaryElement Element = { 12737 Key.get(), Value.get(), SourceLocation(), NumExpansions 12738 }; 12739 12740 // If any unexpanded parameter packs remain, we still have a 12741 // pack expansion. 12742 // FIXME: Can this really happen? 12743 if (Key.get()->containsUnexpandedParameterPack() || 12744 Value.get()->containsUnexpandedParameterPack()) 12745 Element.EllipsisLoc = OrigElement.EllipsisLoc; 12746 12747 Elements.push_back(Element); 12748 } 12749 12750 // FIXME: Retain a pack expansion if RetainExpansion is true. 12751 12752 // We've finished with this pack expansion. 12753 continue; 12754 } 12755 12756 // Transform and check key. 12757 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 12758 if (Key.isInvalid()) 12759 return ExprError(); 12760 12761 if (Key.get() != OrigElement.Key) 12762 ArgChanged = true; 12763 12764 // Transform and check value. 12765 ExprResult Value 12766 = getDerived().TransformExpr(OrigElement.Value); 12767 if (Value.isInvalid()) 12768 return ExprError(); 12769 12770 if (Value.get() != OrigElement.Value) 12771 ArgChanged = true; 12772 12773 ObjCDictionaryElement Element = { 12774 Key.get(), Value.get(), SourceLocation(), None 12775 }; 12776 Elements.push_back(Element); 12777 } 12778 12779 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12780 return SemaRef.MaybeBindToTemporary(E); 12781 12782 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 12783 Elements); 12784 } 12785 12786 template<typename Derived> 12787 ExprResult 12788 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 12789 TypeSourceInfo *EncodedTypeInfo 12790 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 12791 if (!EncodedTypeInfo) 12792 return ExprError(); 12793 12794 if (!getDerived().AlwaysRebuild() && 12795 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 12796 return E; 12797 12798 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 12799 EncodedTypeInfo, 12800 E->getRParenLoc()); 12801 } 12802 12803 template<typename Derived> 12804 ExprResult TreeTransform<Derived>:: 12805 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 12806 // This is a kind of implicit conversion, and it needs to get dropped 12807 // and recomputed for the same general reasons that ImplicitCastExprs 12808 // do, as well a more specific one: this expression is only valid when 12809 // it appears *immediately* as an argument expression. 12810 return getDerived().TransformExpr(E->getSubExpr()); 12811 } 12812 12813 template<typename Derived> 12814 ExprResult TreeTransform<Derived>:: 12815 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 12816 TypeSourceInfo *TSInfo 12817 = getDerived().TransformType(E->getTypeInfoAsWritten()); 12818 if (!TSInfo) 12819 return ExprError(); 12820 12821 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 12822 if (Result.isInvalid()) 12823 return ExprError(); 12824 12825 if (!getDerived().AlwaysRebuild() && 12826 TSInfo == E->getTypeInfoAsWritten() && 12827 Result.get() == E->getSubExpr()) 12828 return E; 12829 12830 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 12831 E->getBridgeKeywordLoc(), TSInfo, 12832 Result.get()); 12833 } 12834 12835 template <typename Derived> 12836 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 12837 ObjCAvailabilityCheckExpr *E) { 12838 return E; 12839 } 12840 12841 template<typename Derived> 12842 ExprResult 12843 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 12844 // Transform arguments. 12845 bool ArgChanged = false; 12846 SmallVector<Expr*, 8> Args; 12847 Args.reserve(E->getNumArgs()); 12848 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 12849 &ArgChanged)) 12850 return ExprError(); 12851 12852 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 12853 // Class message: transform the receiver type. 12854 TypeSourceInfo *ReceiverTypeInfo 12855 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 12856 if (!ReceiverTypeInfo) 12857 return ExprError(); 12858 12859 // If nothing changed, just retain the existing message send. 12860 if (!getDerived().AlwaysRebuild() && 12861 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 12862 return SemaRef.MaybeBindToTemporary(E); 12863 12864 // Build a new class message send. 12865 SmallVector<SourceLocation, 16> SelLocs; 12866 E->getSelectorLocs(SelLocs); 12867 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 12868 E->getSelector(), 12869 SelLocs, 12870 E->getMethodDecl(), 12871 E->getLeftLoc(), 12872 Args, 12873 E->getRightLoc()); 12874 } 12875 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 12876 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 12877 if (!E->getMethodDecl()) 12878 return ExprError(); 12879 12880 // Build a new class message send to 'super'. 12881 SmallVector<SourceLocation, 16> SelLocs; 12882 E->getSelectorLocs(SelLocs); 12883 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 12884 E->getSelector(), 12885 SelLocs, 12886 E->getReceiverType(), 12887 E->getMethodDecl(), 12888 E->getLeftLoc(), 12889 Args, 12890 E->getRightLoc()); 12891 } 12892 12893 // Instance message: transform the receiver 12894 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 12895 "Only class and instance messages may be instantiated"); 12896 ExprResult Receiver 12897 = getDerived().TransformExpr(E->getInstanceReceiver()); 12898 if (Receiver.isInvalid()) 12899 return ExprError(); 12900 12901 // If nothing changed, just retain the existing message send. 12902 if (!getDerived().AlwaysRebuild() && 12903 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 12904 return SemaRef.MaybeBindToTemporary(E); 12905 12906 // Build a new instance message send. 12907 SmallVector<SourceLocation, 16> SelLocs; 12908 E->getSelectorLocs(SelLocs); 12909 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 12910 E->getSelector(), 12911 SelLocs, 12912 E->getMethodDecl(), 12913 E->getLeftLoc(), 12914 Args, 12915 E->getRightLoc()); 12916 } 12917 12918 template<typename Derived> 12919 ExprResult 12920 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 12921 return E; 12922 } 12923 12924 template<typename Derived> 12925 ExprResult 12926 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 12927 return E; 12928 } 12929 12930 template<typename Derived> 12931 ExprResult 12932 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 12933 // Transform the base expression. 12934 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12935 if (Base.isInvalid()) 12936 return ExprError(); 12937 12938 // We don't need to transform the ivar; it will never change. 12939 12940 // If nothing changed, just retain the existing expression. 12941 if (!getDerived().AlwaysRebuild() && 12942 Base.get() == E->getBase()) 12943 return E; 12944 12945 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 12946 E->getLocation(), 12947 E->isArrow(), E->isFreeIvar()); 12948 } 12949 12950 template<typename Derived> 12951 ExprResult 12952 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 12953 // 'super' and types never change. Property never changes. Just 12954 // retain the existing expression. 12955 if (!E->isObjectReceiver()) 12956 return E; 12957 12958 // Transform the base expression. 12959 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12960 if (Base.isInvalid()) 12961 return ExprError(); 12962 12963 // We don't need to transform the property; it will never change. 12964 12965 // If nothing changed, just retain the existing expression. 12966 if (!getDerived().AlwaysRebuild() && 12967 Base.get() == E->getBase()) 12968 return E; 12969 12970 if (E->isExplicitProperty()) 12971 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12972 E->getExplicitProperty(), 12973 E->getLocation()); 12974 12975 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 12976 SemaRef.Context.PseudoObjectTy, 12977 E->getImplicitPropertyGetter(), 12978 E->getImplicitPropertySetter(), 12979 E->getLocation()); 12980 } 12981 12982 template<typename Derived> 12983 ExprResult 12984 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 12985 // Transform the base expression. 12986 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 12987 if (Base.isInvalid()) 12988 return ExprError(); 12989 12990 // Transform the key expression. 12991 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 12992 if (Key.isInvalid()) 12993 return ExprError(); 12994 12995 // If nothing changed, just retain the existing expression. 12996 if (!getDerived().AlwaysRebuild() && 12997 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 12998 return E; 12999 13000 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13001 Base.get(), Key.get(), 13002 E->getAtIndexMethodDecl(), 13003 E->setAtIndexMethodDecl()); 13004 } 13005 13006 template<typename Derived> 13007 ExprResult 13008 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13009 // Transform the base expression. 13010 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13011 if (Base.isInvalid()) 13012 return ExprError(); 13013 13014 // If nothing changed, just retain the existing expression. 13015 if (!getDerived().AlwaysRebuild() && 13016 Base.get() == E->getBase()) 13017 return E; 13018 13019 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13020 E->getOpLoc(), 13021 E->isArrow()); 13022 } 13023 13024 template<typename Derived> 13025 ExprResult 13026 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13027 bool ArgumentChanged = false; 13028 SmallVector<Expr*, 8> SubExprs; 13029 SubExprs.reserve(E->getNumSubExprs()); 13030 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13031 SubExprs, &ArgumentChanged)) 13032 return ExprError(); 13033 13034 if (!getDerived().AlwaysRebuild() && 13035 !ArgumentChanged) 13036 return E; 13037 13038 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13039 SubExprs, 13040 E->getRParenLoc()); 13041 } 13042 13043 template<typename Derived> 13044 ExprResult 13045 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13046 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13047 if (SrcExpr.isInvalid()) 13048 return ExprError(); 13049 13050 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13051 if (!Type) 13052 return ExprError(); 13053 13054 if (!getDerived().AlwaysRebuild() && 13055 Type == E->getTypeSourceInfo() && 13056 SrcExpr.get() == E->getSrcExpr()) 13057 return E; 13058 13059 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13060 SrcExpr.get(), Type, 13061 E->getRParenLoc()); 13062 } 13063 13064 template<typename Derived> 13065 ExprResult 13066 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13067 BlockDecl *oldBlock = E->getBlockDecl(); 13068 13069 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13070 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13071 13072 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13073 blockScope->TheDecl->setBlockMissingReturnType( 13074 oldBlock->blockMissingReturnType()); 13075 13076 SmallVector<ParmVarDecl*, 4> params; 13077 SmallVector<QualType, 4> paramTypes; 13078 13079 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13080 13081 // Parameter substitution. 13082 Sema::ExtParameterInfoBuilder extParamInfos; 13083 if (getDerived().TransformFunctionTypeParams( 13084 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13085 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13086 extParamInfos)) { 13087 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13088 return ExprError(); 13089 } 13090 13091 QualType exprResultType = 13092 getDerived().TransformType(exprFunctionType->getReturnType()); 13093 13094 auto epi = exprFunctionType->getExtProtoInfo(); 13095 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13096 13097 QualType functionType = 13098 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13099 blockScope->FunctionType = functionType; 13100 13101 // Set the parameters on the block decl. 13102 if (!params.empty()) 13103 blockScope->TheDecl->setParams(params); 13104 13105 if (!oldBlock->blockMissingReturnType()) { 13106 blockScope->HasImplicitReturnType = false; 13107 blockScope->ReturnType = exprResultType; 13108 } 13109 13110 // Transform the body 13111 StmtResult body = getDerived().TransformStmt(E->getBody()); 13112 if (body.isInvalid()) { 13113 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13114 return ExprError(); 13115 } 13116 13117 #ifndef NDEBUG 13118 // In builds with assertions, make sure that we captured everything we 13119 // captured before. 13120 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13121 for (const auto &I : oldBlock->captures()) { 13122 VarDecl *oldCapture = I.getVariable(); 13123 13124 // Ignore parameter packs. 13125 if (oldCapture->isParameterPack()) 13126 continue; 13127 13128 VarDecl *newCapture = 13129 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13130 oldCapture)); 13131 assert(blockScope->CaptureMap.count(newCapture)); 13132 } 13133 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13134 } 13135 #endif 13136 13137 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13138 /*Scope=*/nullptr); 13139 } 13140 13141 template<typename Derived> 13142 ExprResult 13143 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13144 llvm_unreachable("Cannot transform asType expressions yet"); 13145 } 13146 13147 template<typename Derived> 13148 ExprResult 13149 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13150 bool ArgumentChanged = false; 13151 SmallVector<Expr*, 8> SubExprs; 13152 SubExprs.reserve(E->getNumSubExprs()); 13153 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13154 SubExprs, &ArgumentChanged)) 13155 return ExprError(); 13156 13157 if (!getDerived().AlwaysRebuild() && 13158 !ArgumentChanged) 13159 return E; 13160 13161 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13162 E->getOp(), E->getRParenLoc()); 13163 } 13164 13165 //===----------------------------------------------------------------------===// 13166 // Type reconstruction 13167 //===----------------------------------------------------------------------===// 13168 13169 template<typename Derived> 13170 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13171 SourceLocation Star) { 13172 return SemaRef.BuildPointerType(PointeeType, Star, 13173 getDerived().getBaseEntity()); 13174 } 13175 13176 template<typename Derived> 13177 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13178 SourceLocation Star) { 13179 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13180 getDerived().getBaseEntity()); 13181 } 13182 13183 template<typename Derived> 13184 QualType 13185 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13186 bool WrittenAsLValue, 13187 SourceLocation Sigil) { 13188 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13189 Sigil, getDerived().getBaseEntity()); 13190 } 13191 13192 template<typename Derived> 13193 QualType 13194 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13195 QualType ClassType, 13196 SourceLocation Sigil) { 13197 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13198 getDerived().getBaseEntity()); 13199 } 13200 13201 template<typename Derived> 13202 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13203 const ObjCTypeParamDecl *Decl, 13204 SourceLocation ProtocolLAngleLoc, 13205 ArrayRef<ObjCProtocolDecl *> Protocols, 13206 ArrayRef<SourceLocation> ProtocolLocs, 13207 SourceLocation ProtocolRAngleLoc) { 13208 return SemaRef.BuildObjCTypeParamType(Decl, 13209 ProtocolLAngleLoc, Protocols, 13210 ProtocolLocs, ProtocolRAngleLoc, 13211 /*FailOnError=*/true); 13212 } 13213 13214 template<typename Derived> 13215 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13216 QualType BaseType, 13217 SourceLocation Loc, 13218 SourceLocation TypeArgsLAngleLoc, 13219 ArrayRef<TypeSourceInfo *> TypeArgs, 13220 SourceLocation TypeArgsRAngleLoc, 13221 SourceLocation ProtocolLAngleLoc, 13222 ArrayRef<ObjCProtocolDecl *> Protocols, 13223 ArrayRef<SourceLocation> ProtocolLocs, 13224 SourceLocation ProtocolRAngleLoc) { 13225 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13226 TypeArgs, TypeArgsRAngleLoc, 13227 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13228 ProtocolRAngleLoc, 13229 /*FailOnError=*/true); 13230 } 13231 13232 template<typename Derived> 13233 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13234 QualType PointeeType, 13235 SourceLocation Star) { 13236 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13237 } 13238 13239 template<typename Derived> 13240 QualType 13241 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13242 ArrayType::ArraySizeModifier SizeMod, 13243 const llvm::APInt *Size, 13244 Expr *SizeExpr, 13245 unsigned IndexTypeQuals, 13246 SourceRange BracketsRange) { 13247 if (SizeExpr || !Size) 13248 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13249 IndexTypeQuals, BracketsRange, 13250 getDerived().getBaseEntity()); 13251 13252 QualType Types[] = { 13253 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13254 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13255 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13256 }; 13257 const unsigned NumTypes = llvm::array_lengthof(Types); 13258 QualType SizeType; 13259 for (unsigned I = 0; I != NumTypes; ++I) 13260 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13261 SizeType = Types[I]; 13262 break; 13263 } 13264 13265 // Note that we can return a VariableArrayType here in the case where 13266 // the element type was a dependent VariableArrayType. 13267 IntegerLiteral *ArraySize 13268 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13269 /*FIXME*/BracketsRange.getBegin()); 13270 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13271 IndexTypeQuals, BracketsRange, 13272 getDerived().getBaseEntity()); 13273 } 13274 13275 template<typename Derived> 13276 QualType 13277 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13278 ArrayType::ArraySizeModifier SizeMod, 13279 const llvm::APInt &Size, 13280 Expr *SizeExpr, 13281 unsigned IndexTypeQuals, 13282 SourceRange BracketsRange) { 13283 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13284 IndexTypeQuals, BracketsRange); 13285 } 13286 13287 template<typename Derived> 13288 QualType 13289 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13290 ArrayType::ArraySizeModifier SizeMod, 13291 unsigned IndexTypeQuals, 13292 SourceRange BracketsRange) { 13293 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13294 IndexTypeQuals, BracketsRange); 13295 } 13296 13297 template<typename Derived> 13298 QualType 13299 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13300 ArrayType::ArraySizeModifier SizeMod, 13301 Expr *SizeExpr, 13302 unsigned IndexTypeQuals, 13303 SourceRange BracketsRange) { 13304 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13305 SizeExpr, 13306 IndexTypeQuals, BracketsRange); 13307 } 13308 13309 template<typename Derived> 13310 QualType 13311 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13312 ArrayType::ArraySizeModifier SizeMod, 13313 Expr *SizeExpr, 13314 unsigned IndexTypeQuals, 13315 SourceRange BracketsRange) { 13316 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13317 SizeExpr, 13318 IndexTypeQuals, BracketsRange); 13319 } 13320 13321 template <typename Derived> 13322 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13323 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13324 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13325 AttributeLoc); 13326 } 13327 13328 template <typename Derived> 13329 QualType 13330 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13331 unsigned NumElements, 13332 VectorType::VectorKind VecKind) { 13333 // FIXME: semantic checking! 13334 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13335 } 13336 13337 template <typename Derived> 13338 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13339 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13340 VectorType::VectorKind VecKind) { 13341 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13342 } 13343 13344 template<typename Derived> 13345 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13346 unsigned NumElements, 13347 SourceLocation AttributeLoc) { 13348 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13349 NumElements, true); 13350 IntegerLiteral *VectorSize 13351 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13352 AttributeLoc); 13353 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13354 } 13355 13356 template<typename Derived> 13357 QualType 13358 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13359 Expr *SizeExpr, 13360 SourceLocation AttributeLoc) { 13361 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13362 } 13363 13364 template<typename Derived> 13365 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13366 QualType T, 13367 MutableArrayRef<QualType> ParamTypes, 13368 const FunctionProtoType::ExtProtoInfo &EPI) { 13369 return SemaRef.BuildFunctionType(T, ParamTypes, 13370 getDerived().getBaseLocation(), 13371 getDerived().getBaseEntity(), 13372 EPI); 13373 } 13374 13375 template<typename Derived> 13376 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13377 return SemaRef.Context.getFunctionNoProtoType(T); 13378 } 13379 13380 template<typename Derived> 13381 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13382 Decl *D) { 13383 assert(D && "no decl found"); 13384 if (D->isInvalidDecl()) return QualType(); 13385 13386 // FIXME: Doesn't account for ObjCInterfaceDecl! 13387 TypeDecl *Ty; 13388 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 13389 // A valid resolved using typename pack expansion decl can have multiple 13390 // UsingDecls, but they must each have exactly one type, and it must be 13391 // the same type in every case. But we must have at least one expansion! 13392 if (UPD->expansions().empty()) { 13393 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 13394 << UPD->isCXXClassMember() << UPD; 13395 return QualType(); 13396 } 13397 13398 // We might still have some unresolved types. Try to pick a resolved type 13399 // if we can. The final instantiation will check that the remaining 13400 // unresolved types instantiate to the type we pick. 13401 QualType FallbackT; 13402 QualType T; 13403 for (auto *E : UPD->expansions()) { 13404 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 13405 if (ThisT.isNull()) 13406 continue; 13407 else if (ThisT->getAs<UnresolvedUsingType>()) 13408 FallbackT = ThisT; 13409 else if (T.isNull()) 13410 T = ThisT; 13411 else 13412 assert(getSema().Context.hasSameType(ThisT, T) && 13413 "mismatched resolved types in using pack expansion"); 13414 } 13415 return T.isNull() ? FallbackT : T; 13416 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 13417 assert(Using->hasTypename() && 13418 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 13419 13420 // A valid resolved using typename decl points to exactly one type decl. 13421 assert(++Using->shadow_begin() == Using->shadow_end()); 13422 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 13423 } else { 13424 assert(isa<UnresolvedUsingTypenameDecl>(D) && 13425 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 13426 Ty = cast<UnresolvedUsingTypenameDecl>(D); 13427 } 13428 13429 return SemaRef.Context.getTypeDeclType(Ty); 13430 } 13431 13432 template<typename Derived> 13433 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 13434 SourceLocation Loc) { 13435 return SemaRef.BuildTypeofExprType(E, Loc); 13436 } 13437 13438 template<typename Derived> 13439 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 13440 return SemaRef.Context.getTypeOfType(Underlying); 13441 } 13442 13443 template<typename Derived> 13444 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 13445 SourceLocation Loc) { 13446 return SemaRef.BuildDecltypeType(E, Loc); 13447 } 13448 13449 template<typename Derived> 13450 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 13451 UnaryTransformType::UTTKind UKind, 13452 SourceLocation Loc) { 13453 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 13454 } 13455 13456 template<typename Derived> 13457 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 13458 TemplateName Template, 13459 SourceLocation TemplateNameLoc, 13460 TemplateArgumentListInfo &TemplateArgs) { 13461 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 13462 } 13463 13464 template<typename Derived> 13465 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 13466 SourceLocation KWLoc) { 13467 return SemaRef.BuildAtomicType(ValueType, KWLoc); 13468 } 13469 13470 template<typename Derived> 13471 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 13472 SourceLocation KWLoc, 13473 bool isReadPipe) { 13474 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 13475 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 13476 } 13477 13478 template<typename Derived> 13479 TemplateName 13480 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13481 bool TemplateKW, 13482 TemplateDecl *Template) { 13483 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 13484 Template); 13485 } 13486 13487 template<typename Derived> 13488 TemplateName 13489 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13490 SourceLocation TemplateKWLoc, 13491 const IdentifierInfo &Name, 13492 SourceLocation NameLoc, 13493 QualType ObjectType, 13494 NamedDecl *FirstQualifierInScope, 13495 bool AllowInjectedClassName) { 13496 UnqualifiedId TemplateName; 13497 TemplateName.setIdentifier(&Name, NameLoc); 13498 Sema::TemplateTy Template; 13499 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 13500 SS, TemplateKWLoc, TemplateName, 13501 ParsedType::make(ObjectType), 13502 /*EnteringContext=*/false, 13503 Template, AllowInjectedClassName); 13504 return Template.get(); 13505 } 13506 13507 template<typename Derived> 13508 TemplateName 13509 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13510 SourceLocation TemplateKWLoc, 13511 OverloadedOperatorKind Operator, 13512 SourceLocation NameLoc, 13513 QualType ObjectType, 13514 bool AllowInjectedClassName) { 13515 UnqualifiedId Name; 13516 // FIXME: Bogus location information. 13517 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 13518 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 13519 Sema::TemplateTy Template; 13520 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 13521 SS, TemplateKWLoc, Name, 13522 ParsedType::make(ObjectType), 13523 /*EnteringContext=*/false, 13524 Template, AllowInjectedClassName); 13525 return Template.get(); 13526 } 13527 13528 template<typename Derived> 13529 ExprResult 13530 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 13531 SourceLocation OpLoc, 13532 Expr *OrigCallee, 13533 Expr *First, 13534 Expr *Second) { 13535 Expr *Callee = OrigCallee->IgnoreParenCasts(); 13536 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 13537 13538 if (First->getObjectKind() == OK_ObjCProperty) { 13539 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13540 if (BinaryOperator::isAssignmentOp(Opc)) 13541 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 13542 First, Second); 13543 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 13544 if (Result.isInvalid()) 13545 return ExprError(); 13546 First = Result.get(); 13547 } 13548 13549 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 13550 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 13551 if (Result.isInvalid()) 13552 return ExprError(); 13553 Second = Result.get(); 13554 } 13555 13556 // Determine whether this should be a builtin operation. 13557 if (Op == OO_Subscript) { 13558 if (!First->getType()->isOverloadableType() && 13559 !Second->getType()->isOverloadableType()) 13560 return getSema().CreateBuiltinArraySubscriptExpr( 13561 First, Callee->getBeginLoc(), Second, OpLoc); 13562 } else if (Op == OO_Arrow) { 13563 // -> is never a builtin operation. 13564 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 13565 } else if (Second == nullptr || isPostIncDec) { 13566 if (!First->getType()->isOverloadableType() || 13567 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 13568 // The argument is not of overloadable type, or this is an expression 13569 // of the form &Class::member, so try to create a built-in unary 13570 // operation. 13571 UnaryOperatorKind Opc 13572 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13573 13574 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 13575 } 13576 } else { 13577 if (!First->getType()->isOverloadableType() && 13578 !Second->getType()->isOverloadableType()) { 13579 // Neither of the arguments is an overloadable type, so try to 13580 // create a built-in binary operation. 13581 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13582 ExprResult Result 13583 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 13584 if (Result.isInvalid()) 13585 return ExprError(); 13586 13587 return Result; 13588 } 13589 } 13590 13591 // Compute the transformed set of functions (and function templates) to be 13592 // used during overload resolution. 13593 UnresolvedSet<16> Functions; 13594 bool RequiresADL; 13595 13596 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 13597 Functions.append(ULE->decls_begin(), ULE->decls_end()); 13598 // If the overload could not be resolved in the template definition 13599 // (because we had a dependent argument), ADL is performed as part of 13600 // template instantiation. 13601 RequiresADL = ULE->requiresADL(); 13602 } else { 13603 // If we've resolved this to a particular non-member function, just call 13604 // that function. If we resolved it to a member function, 13605 // CreateOverloaded* will find that function for us. 13606 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 13607 if (!isa<CXXMethodDecl>(ND)) 13608 Functions.addDecl(ND); 13609 RequiresADL = false; 13610 } 13611 13612 // Add any functions found via argument-dependent lookup. 13613 Expr *Args[2] = { First, Second }; 13614 unsigned NumArgs = 1 + (Second != nullptr); 13615 13616 // Create the overloaded operator invocation for unary operators. 13617 if (NumArgs == 1 || isPostIncDec) { 13618 UnaryOperatorKind Opc 13619 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13620 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 13621 RequiresADL); 13622 } 13623 13624 if (Op == OO_Subscript) { 13625 SourceLocation LBrace; 13626 SourceLocation RBrace; 13627 13628 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 13629 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 13630 LBrace = SourceLocation::getFromRawEncoding( 13631 NameLoc.CXXOperatorName.BeginOpNameLoc); 13632 RBrace = SourceLocation::getFromRawEncoding( 13633 NameLoc.CXXOperatorName.EndOpNameLoc); 13634 } else { 13635 LBrace = Callee->getBeginLoc(); 13636 RBrace = OpLoc; 13637 } 13638 13639 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 13640 First, Second); 13641 } 13642 13643 // Create the overloaded operator invocation for binary operators. 13644 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13645 ExprResult Result = SemaRef.CreateOverloadedBinOp( 13646 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 13647 if (Result.isInvalid()) 13648 return ExprError(); 13649 13650 return Result; 13651 } 13652 13653 template<typename Derived> 13654 ExprResult 13655 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 13656 SourceLocation OperatorLoc, 13657 bool isArrow, 13658 CXXScopeSpec &SS, 13659 TypeSourceInfo *ScopeType, 13660 SourceLocation CCLoc, 13661 SourceLocation TildeLoc, 13662 PseudoDestructorTypeStorage Destroyed) { 13663 QualType BaseType = Base->getType(); 13664 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 13665 (!isArrow && !BaseType->getAs<RecordType>()) || 13666 (isArrow && BaseType->getAs<PointerType>() && 13667 !BaseType->castAs<PointerType>()->getPointeeType() 13668 ->template getAs<RecordType>())){ 13669 // This pseudo-destructor expression is still a pseudo-destructor. 13670 return SemaRef.BuildPseudoDestructorExpr( 13671 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 13672 CCLoc, TildeLoc, Destroyed); 13673 } 13674 13675 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 13676 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 13677 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 13678 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 13679 NameInfo.setNamedTypeInfo(DestroyedType); 13680 13681 // The scope type is now known to be a valid nested name specifier 13682 // component. Tack it on to the end of the nested name specifier. 13683 if (ScopeType) { 13684 if (!ScopeType->getType()->getAs<TagType>()) { 13685 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 13686 diag::err_expected_class_or_namespace) 13687 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 13688 return ExprError(); 13689 } 13690 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 13691 CCLoc); 13692 } 13693 13694 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 13695 return getSema().BuildMemberReferenceExpr(Base, BaseType, 13696 OperatorLoc, isArrow, 13697 SS, TemplateKWLoc, 13698 /*FIXME: FirstQualifier*/ nullptr, 13699 NameInfo, 13700 /*TemplateArgs*/ nullptr, 13701 /*S*/nullptr); 13702 } 13703 13704 template<typename Derived> 13705 StmtResult 13706 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 13707 SourceLocation Loc = S->getBeginLoc(); 13708 CapturedDecl *CD = S->getCapturedDecl(); 13709 unsigned NumParams = CD->getNumParams(); 13710 unsigned ContextParamPos = CD->getContextParamPosition(); 13711 SmallVector<Sema::CapturedParamNameType, 4> Params; 13712 for (unsigned I = 0; I < NumParams; ++I) { 13713 if (I != ContextParamPos) { 13714 Params.push_back( 13715 std::make_pair( 13716 CD->getParam(I)->getName(), 13717 getDerived().TransformType(CD->getParam(I)->getType()))); 13718 } else { 13719 Params.push_back(std::make_pair(StringRef(), QualType())); 13720 } 13721 } 13722 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 13723 S->getCapturedRegionKind(), Params); 13724 StmtResult Body; 13725 { 13726 Sema::CompoundScopeRAII CompoundScope(getSema()); 13727 Body = getDerived().TransformStmt(S->getCapturedStmt()); 13728 } 13729 13730 if (Body.isInvalid()) { 13731 getSema().ActOnCapturedRegionError(); 13732 return StmtError(); 13733 } 13734 13735 return getSema().ActOnCapturedRegionEnd(Body.get()); 13736 } 13737 13738 } // end namespace clang 13739 13740 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 13741