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