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/Basic/OpenMPKinds.h" 32 #include "clang/Sema/Designator.h" 33 #include "clang/Sema/Lookup.h" 34 #include "clang/Sema/Ownership.h" 35 #include "clang/Sema/ParsedTemplate.h" 36 #include "clang/Sema/ScopeInfo.h" 37 #include "clang/Sema/SemaDiagnostic.h" 38 #include "clang/Sema/SemaInternal.h" 39 #include "llvm/ADT/ArrayRef.h" 40 #include "llvm/Support/ErrorHandling.h" 41 #include <algorithm> 42 43 using namespace llvm::omp; 44 45 namespace clang { 46 using namespace sema; 47 48 /// A semantic tree transformation that allows one to transform one 49 /// abstract syntax tree into another. 50 /// 51 /// A new tree transformation is defined by creating a new subclass \c X of 52 /// \c TreeTransform<X> and then overriding certain operations to provide 53 /// behavior specific to that transformation. For example, template 54 /// instantiation is implemented as a tree transformation where the 55 /// transformation of TemplateTypeParmType nodes involves substituting the 56 /// template arguments for their corresponding template parameters; a similar 57 /// transformation is performed for non-type template parameters and 58 /// template template parameters. 59 /// 60 /// This tree-transformation template uses static polymorphism to allow 61 /// subclasses to customize any of its operations. Thus, a subclass can 62 /// override any of the transformation or rebuild operators by providing an 63 /// operation with the same signature as the default implementation. The 64 /// overriding function should not be virtual. 65 /// 66 /// Semantic tree transformations are split into two stages, either of which 67 /// can be replaced by a subclass. The "transform" step transforms an AST node 68 /// or the parts of an AST node using the various transformation functions, 69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 70 /// node of the appropriate kind from the pieces. The default transformation 71 /// routines recursively transform the operands to composite AST nodes (e.g., 72 /// the pointee type of a PointerType node) and, if any of those operand nodes 73 /// were changed by the transformation, invokes the rebuild operation to create 74 /// a new AST node. 75 /// 76 /// Subclasses can customize the transformation at various levels. The 77 /// most coarse-grained transformations involve replacing TransformType(), 78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 80 /// new implementations. 81 /// 82 /// For more fine-grained transformations, subclasses can replace any of the 83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 85 /// replacing TransformTemplateTypeParmType() allows template instantiation 86 /// to substitute template arguments for their corresponding template 87 /// parameters. Additionally, subclasses can override the \c RebuildXXX 88 /// functions to control how AST nodes are rebuilt when their operands change. 89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 91 /// be able to use more efficient rebuild steps. 92 /// 93 /// There are a handful of other functions that can be overridden, allowing one 94 /// to avoid traversing nodes that don't need any transformation 95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 96 /// operands have not changed (\c AlwaysRebuild()), and customize the 97 /// default locations and entity names used for type-checking 98 /// (\c getBaseLocation(), \c getBaseEntity()). 99 template<typename Derived> 100 class TreeTransform { 101 /// Private RAII object that helps us forget and then re-remember 102 /// the template argument corresponding to a partially-substituted parameter 103 /// pack. 104 class ForgetPartiallySubstitutedPackRAII { 105 Derived &Self; 106 TemplateArgument Old; 107 108 public: 109 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 110 Old = Self.ForgetPartiallySubstitutedPack(); 111 } 112 113 ~ForgetPartiallySubstitutedPackRAII() { 114 Self.RememberPartiallySubstitutedPack(Old); 115 } 116 }; 117 118 protected: 119 Sema &SemaRef; 120 121 /// The set of local declarations that have been transformed, for 122 /// cases where we are forced to build new declarations within the transformer 123 /// rather than in the subclass (e.g., lambda closure types). 124 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 125 126 public: 127 /// Initializes a new tree transformer. 128 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 129 130 /// Retrieves a reference to the derived class. 131 Derived &getDerived() { return static_cast<Derived&>(*this); } 132 133 /// Retrieves a reference to the derived class. 134 const Derived &getDerived() const { 135 return static_cast<const Derived&>(*this); 136 } 137 138 static inline ExprResult Owned(Expr *E) { return E; } 139 static inline StmtResult Owned(Stmt *S) { return S; } 140 141 /// Retrieves a reference to the semantic analysis object used for 142 /// this tree transform. 143 Sema &getSema() const { return SemaRef; } 144 145 /// Whether the transformation should always rebuild AST nodes, even 146 /// if none of the children have changed. 147 /// 148 /// Subclasses may override this function to specify when the transformation 149 /// should rebuild all AST nodes. 150 /// 151 /// We must always rebuild all AST nodes when performing variadic template 152 /// pack expansion, in order to avoid violating the AST invariant that each 153 /// statement node appears at most once in its containing declaration. 154 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 155 156 /// Whether the transformation is forming an expression or statement that 157 /// replaces the original. In this case, we'll reuse mangling numbers from 158 /// existing lambdas. 159 bool ReplacingOriginal() { return false; } 160 161 /// Wether CXXConstructExpr can be skipped when they are implicit. 162 /// They will be reconstructed when used if needed. 163 /// This is usefull when the user that cause rebuilding of the 164 /// CXXConstructExpr is outside of the expression at which the TreeTransform 165 /// started. 166 bool AllowSkippingCXXConstructExpr() { return true; } 167 168 /// Returns the location of the entity being transformed, if that 169 /// information was not available elsewhere in the AST. 170 /// 171 /// By default, returns no source-location information. Subclasses can 172 /// provide an alternative implementation that provides better location 173 /// information. 174 SourceLocation getBaseLocation() { return SourceLocation(); } 175 176 /// Returns the name of the entity being transformed, if that 177 /// information was not available elsewhere in the AST. 178 /// 179 /// By default, returns an empty name. Subclasses can provide an alternative 180 /// implementation with a more precise name. 181 DeclarationName getBaseEntity() { return DeclarationName(); } 182 183 /// Sets the "base" location and entity when that 184 /// information is known based on another transformation. 185 /// 186 /// By default, the source location and entity are ignored. Subclasses can 187 /// override this function to provide a customized implementation. 188 void setBase(SourceLocation Loc, DeclarationName Entity) { } 189 190 /// RAII object that temporarily sets the base location and entity 191 /// used for reporting diagnostics in types. 192 class TemporaryBase { 193 TreeTransform &Self; 194 SourceLocation OldLocation; 195 DeclarationName OldEntity; 196 197 public: 198 TemporaryBase(TreeTransform &Self, SourceLocation Location, 199 DeclarationName Entity) : Self(Self) { 200 OldLocation = Self.getDerived().getBaseLocation(); 201 OldEntity = Self.getDerived().getBaseEntity(); 202 203 if (Location.isValid()) 204 Self.getDerived().setBase(Location, Entity); 205 } 206 207 ~TemporaryBase() { 208 Self.getDerived().setBase(OldLocation, OldEntity); 209 } 210 }; 211 212 /// Determine whether the given type \p T has already been 213 /// transformed. 214 /// 215 /// Subclasses can provide an alternative implementation of this routine 216 /// to short-circuit evaluation when it is known that a given type will 217 /// not change. For example, template instantiation need not traverse 218 /// non-dependent types. 219 bool AlreadyTransformed(QualType T) { 220 return T.isNull(); 221 } 222 223 /// Transform a template parameter depth level. 224 /// 225 /// During a transformation that transforms template parameters, this maps 226 /// an old template parameter depth to a new depth. 227 unsigned TransformTemplateDepth(unsigned Depth) { 228 return Depth; 229 } 230 231 /// Determine whether the given call argument should be dropped, e.g., 232 /// because it is a default argument. 233 /// 234 /// Subclasses can provide an alternative implementation of this routine to 235 /// determine which kinds of call arguments get dropped. By default, 236 /// CXXDefaultArgument nodes are dropped (prior to transformation). 237 bool DropCallArgument(Expr *E) { 238 return E->isDefaultArgument(); 239 } 240 241 /// Determine whether we should expand a pack expansion with the 242 /// given set of parameter packs into separate arguments by repeatedly 243 /// transforming the pattern. 244 /// 245 /// By default, the transformer never tries to expand pack expansions. 246 /// Subclasses can override this routine to provide different behavior. 247 /// 248 /// \param EllipsisLoc The location of the ellipsis that identifies the 249 /// pack expansion. 250 /// 251 /// \param PatternRange The source range that covers the entire pattern of 252 /// the pack expansion. 253 /// 254 /// \param Unexpanded The set of unexpanded parameter packs within the 255 /// pattern. 256 /// 257 /// \param ShouldExpand Will be set to \c true if the transformer should 258 /// expand the corresponding pack expansions into separate arguments. When 259 /// set, \c NumExpansions must also be set. 260 /// 261 /// \param RetainExpansion Whether the caller should add an unexpanded 262 /// pack expansion after all of the expanded arguments. This is used 263 /// when extending explicitly-specified template argument packs per 264 /// C++0x [temp.arg.explicit]p9. 265 /// 266 /// \param NumExpansions The number of separate arguments that will be in 267 /// the expanded form of the corresponding pack expansion. This is both an 268 /// input and an output parameter, which can be set by the caller if the 269 /// number of expansions is known a priori (e.g., due to a prior substitution) 270 /// and will be set by the callee when the number of expansions is known. 271 /// The callee must set this value when \c ShouldExpand is \c true; it may 272 /// set this value in other cases. 273 /// 274 /// \returns true if an error occurred (e.g., because the parameter packs 275 /// are to be instantiated with arguments of different lengths), false 276 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 277 /// must be set. 278 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 279 SourceRange PatternRange, 280 ArrayRef<UnexpandedParameterPack> Unexpanded, 281 bool &ShouldExpand, 282 bool &RetainExpansion, 283 Optional<unsigned> &NumExpansions) { 284 ShouldExpand = false; 285 return false; 286 } 287 288 /// "Forget" about the partially-substituted pack template argument, 289 /// when performing an instantiation that must preserve the parameter pack 290 /// use. 291 /// 292 /// This routine is meant to be overridden by the template instantiator. 293 TemplateArgument ForgetPartiallySubstitutedPack() { 294 return TemplateArgument(); 295 } 296 297 /// "Remember" the partially-substituted pack template argument 298 /// after performing an instantiation that must preserve the parameter pack 299 /// use. 300 /// 301 /// This routine is meant to be overridden by the template instantiator. 302 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 303 304 /// Note to the derived class when a function parameter pack is 305 /// being expanded. 306 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 307 308 /// Transforms the given type into another type. 309 /// 310 /// By default, this routine transforms a type by creating a 311 /// TypeSourceInfo for it and delegating to the appropriate 312 /// function. This is expensive, but we don't mind, because 313 /// this method is deprecated anyway; all users should be 314 /// switched to storing TypeSourceInfos. 315 /// 316 /// \returns the transformed type. 317 QualType TransformType(QualType T); 318 319 /// Transforms the given type-with-location into a new 320 /// type-with-location. 321 /// 322 /// By default, this routine transforms a type by delegating to the 323 /// appropriate TransformXXXType to build a new type. Subclasses 324 /// may override this function (to take over all type 325 /// transformations) or some set of the TransformXXXType functions 326 /// to alter the transformation. 327 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 328 329 /// Transform the given type-with-location into a new 330 /// type, collecting location information in the given builder 331 /// as necessary. 332 /// 333 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 334 335 /// Transform a type that is permitted to produce a 336 /// DeducedTemplateSpecializationType. 337 /// 338 /// This is used in the (relatively rare) contexts where it is acceptable 339 /// for transformation to produce a class template type with deduced 340 /// template arguments. 341 /// @{ 342 QualType TransformTypeWithDeducedTST(QualType T); 343 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 344 /// @} 345 346 /// The reason why the value of a statement is not discarded, if any. 347 enum StmtDiscardKind { 348 SDK_Discarded, 349 SDK_NotDiscarded, 350 SDK_StmtExprResult, 351 }; 352 353 /// Transform the given statement. 354 /// 355 /// By default, this routine transforms a statement by delegating to the 356 /// appropriate TransformXXXStmt function to transform a specific kind of 357 /// statement or the TransformExpr() function to transform an expression. 358 /// Subclasses may override this function to transform statements using some 359 /// other mechanism. 360 /// 361 /// \returns the transformed statement. 362 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 363 364 /// Transform the given statement. 365 /// 366 /// By default, this routine transforms a statement by delegating to the 367 /// appropriate TransformOMPXXXClause function to transform a specific kind 368 /// of clause. Subclasses may override this function to transform statements 369 /// using some other mechanism. 370 /// 371 /// \returns the transformed OpenMP clause. 372 OMPClause *TransformOMPClause(OMPClause *S); 373 374 /// Transform the given attribute. 375 /// 376 /// By default, this routine transforms a statement by delegating to the 377 /// appropriate TransformXXXAttr function to transform a specific kind 378 /// of attribute. Subclasses may override this function to transform 379 /// attributed statements using some other mechanism. 380 /// 381 /// \returns the transformed attribute 382 const Attr *TransformAttr(const Attr *S); 383 384 /// Transform the specified attribute. 385 /// 386 /// Subclasses should override the transformation of attributes with a pragma 387 /// spelling to transform expressions stored within the attribute. 388 /// 389 /// \returns the transformed attribute. 390 #define ATTR(X) 391 #define PRAGMA_SPELLING_ATTR(X) \ 392 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 393 #include "clang/Basic/AttrList.inc" 394 395 /// Transform the given expression. 396 /// 397 /// By default, this routine transforms an expression by delegating to the 398 /// appropriate TransformXXXExpr function to build a new expression. 399 /// Subclasses may override this function to transform expressions using some 400 /// other mechanism. 401 /// 402 /// \returns the transformed expression. 403 ExprResult TransformExpr(Expr *E); 404 405 /// Transform the given initializer. 406 /// 407 /// By default, this routine transforms an initializer by stripping off the 408 /// semantic nodes added by initialization, then passing the result to 409 /// TransformExpr or TransformExprs. 410 /// 411 /// \returns the transformed initializer. 412 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 413 414 /// Transform the given list of expressions. 415 /// 416 /// This routine transforms a list of expressions by invoking 417 /// \c TransformExpr() for each subexpression. However, it also provides 418 /// support for variadic templates by expanding any pack expansions (if the 419 /// derived class permits such expansion) along the way. When pack expansions 420 /// are present, the number of outputs may not equal the number of inputs. 421 /// 422 /// \param Inputs The set of expressions to be transformed. 423 /// 424 /// \param NumInputs The number of expressions in \c Inputs. 425 /// 426 /// \param IsCall If \c true, then this transform is being performed on 427 /// function-call arguments, and any arguments that should be dropped, will 428 /// be. 429 /// 430 /// \param Outputs The transformed input expressions will be added to this 431 /// vector. 432 /// 433 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 434 /// due to transformation. 435 /// 436 /// \returns true if an error occurred, false otherwise. 437 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 438 SmallVectorImpl<Expr *> &Outputs, 439 bool *ArgChanged = nullptr); 440 441 /// Transform the given declaration, which is referenced from a type 442 /// or expression. 443 /// 444 /// By default, acts as the identity function on declarations, unless the 445 /// transformer has had to transform the declaration itself. Subclasses 446 /// may override this function to provide alternate behavior. 447 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 448 llvm::DenseMap<Decl *, Decl *>::iterator Known 449 = TransformedLocalDecls.find(D); 450 if (Known != TransformedLocalDecls.end()) 451 return Known->second; 452 453 return D; 454 } 455 456 /// Transform the specified condition. 457 /// 458 /// By default, this transforms the variable and expression and rebuilds 459 /// the condition. 460 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 461 Expr *Expr, 462 Sema::ConditionKind Kind); 463 464 /// Transform the attributes associated with the given declaration and 465 /// place them on the new declaration. 466 /// 467 /// By default, this operation does nothing. Subclasses may override this 468 /// behavior to transform attributes. 469 void transformAttrs(Decl *Old, Decl *New) { } 470 471 /// Note that a local declaration has been transformed by this 472 /// transformer. 473 /// 474 /// Local declarations are typically transformed via a call to 475 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 476 /// the transformer itself has to transform the declarations. This routine 477 /// can be overridden by a subclass that keeps track of such mappings. 478 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 479 assert(New.size() == 1 && 480 "must override transformedLocalDecl if performing pack expansion"); 481 TransformedLocalDecls[Old] = New.front(); 482 } 483 484 /// Transform the definition of the given declaration. 485 /// 486 /// By default, invokes TransformDecl() to transform the declaration. 487 /// Subclasses may override this function to provide alternate behavior. 488 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 489 return getDerived().TransformDecl(Loc, D); 490 } 491 492 /// Transform the given declaration, which was the first part of a 493 /// nested-name-specifier in a member access expression. 494 /// 495 /// This specific declaration transformation only applies to the first 496 /// identifier in a nested-name-specifier of a member access expression, e.g., 497 /// the \c T in \c x->T::member 498 /// 499 /// By default, invokes TransformDecl() to transform the declaration. 500 /// Subclasses may override this function to provide alternate behavior. 501 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 502 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 503 } 504 505 /// Transform the set of declarations in an OverloadExpr. 506 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 507 LookupResult &R); 508 509 /// Transform the given nested-name-specifier with source-location 510 /// information. 511 /// 512 /// By default, transforms all of the types and declarations within the 513 /// nested-name-specifier. Subclasses may override this function to provide 514 /// alternate behavior. 515 NestedNameSpecifierLoc 516 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 517 QualType ObjectType = QualType(), 518 NamedDecl *FirstQualifierInScope = nullptr); 519 520 /// Transform the given declaration name. 521 /// 522 /// By default, transforms the types of conversion function, constructor, 523 /// and destructor names and then (if needed) rebuilds the declaration name. 524 /// Identifiers and selectors are returned unmodified. Sublcasses may 525 /// override this function to provide alternate behavior. 526 DeclarationNameInfo 527 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 528 529 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 530 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 531 concepts::TypeRequirement * 532 TransformTypeRequirement(concepts::TypeRequirement *Req); 533 concepts::ExprRequirement * 534 TransformExprRequirement(concepts::ExprRequirement *Req); 535 concepts::NestedRequirement * 536 TransformNestedRequirement(concepts::NestedRequirement *Req); 537 538 /// Transform the given template name. 539 /// 540 /// \param SS The nested-name-specifier that qualifies the template 541 /// name. This nested-name-specifier must already have been transformed. 542 /// 543 /// \param Name The template name to transform. 544 /// 545 /// \param NameLoc The source location of the template name. 546 /// 547 /// \param ObjectType If we're translating a template name within a member 548 /// access expression, this is the type of the object whose member template 549 /// is being referenced. 550 /// 551 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 552 /// also refers to a name within the current (lexical) scope, this is the 553 /// declaration it refers to. 554 /// 555 /// By default, transforms the template name by transforming the declarations 556 /// and nested-name-specifiers that occur within the template name. 557 /// Subclasses may override this function to provide alternate behavior. 558 TemplateName 559 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 560 SourceLocation NameLoc, 561 QualType ObjectType = QualType(), 562 NamedDecl *FirstQualifierInScope = nullptr, 563 bool AllowInjectedClassName = false); 564 565 /// Transform the given template argument. 566 /// 567 /// By default, this operation transforms the type, expression, or 568 /// declaration stored within the template argument and constructs a 569 /// new template argument from the transformed result. Subclasses may 570 /// override this function to provide alternate behavior. 571 /// 572 /// Returns true if there was an error. 573 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 574 TemplateArgumentLoc &Output, 575 bool Uneval = false); 576 577 /// Transform the given set of template arguments. 578 /// 579 /// By default, this operation transforms all of the template arguments 580 /// in the input set using \c TransformTemplateArgument(), and appends 581 /// the transformed arguments to the output list. 582 /// 583 /// Note that this overload of \c TransformTemplateArguments() is merely 584 /// a convenience function. Subclasses that wish to override this behavior 585 /// should override the iterator-based member template version. 586 /// 587 /// \param Inputs The set of template arguments to be transformed. 588 /// 589 /// \param NumInputs The number of template arguments in \p Inputs. 590 /// 591 /// \param Outputs The set of transformed template arguments output by this 592 /// routine. 593 /// 594 /// Returns true if an error occurred. 595 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 596 unsigned NumInputs, 597 TemplateArgumentListInfo &Outputs, 598 bool Uneval = false) { 599 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 600 Uneval); 601 } 602 603 /// Transform the given set of template arguments. 604 /// 605 /// By default, this operation transforms all of the template arguments 606 /// in the input set using \c TransformTemplateArgument(), and appends 607 /// the transformed arguments to the output list. 608 /// 609 /// \param First An iterator to the first template argument. 610 /// 611 /// \param Last An iterator one step past the last template argument. 612 /// 613 /// \param Outputs The set of transformed template arguments output by this 614 /// routine. 615 /// 616 /// Returns true if an error occurred. 617 template<typename InputIterator> 618 bool TransformTemplateArguments(InputIterator First, 619 InputIterator Last, 620 TemplateArgumentListInfo &Outputs, 621 bool Uneval = false); 622 623 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 624 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 625 TemplateArgumentLoc &ArgLoc); 626 627 /// Fakes up a TypeSourceInfo for a type. 628 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 629 return SemaRef.Context.getTrivialTypeSourceInfo(T, 630 getDerived().getBaseLocation()); 631 } 632 633 #define ABSTRACT_TYPELOC(CLASS, PARENT) 634 #define TYPELOC(CLASS, PARENT) \ 635 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 636 #include "clang/AST/TypeLocNodes.def" 637 638 template<typename Fn> 639 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 640 FunctionProtoTypeLoc TL, 641 CXXRecordDecl *ThisContext, 642 Qualifiers ThisTypeQuals, 643 Fn TransformExceptionSpec); 644 645 bool TransformExceptionSpec(SourceLocation Loc, 646 FunctionProtoType::ExceptionSpecInfo &ESI, 647 SmallVectorImpl<QualType> &Exceptions, 648 bool &Changed); 649 650 StmtResult TransformSEHHandler(Stmt *Handler); 651 652 QualType 653 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 654 TemplateSpecializationTypeLoc TL, 655 TemplateName Template); 656 657 QualType 658 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 659 DependentTemplateSpecializationTypeLoc TL, 660 TemplateName Template, 661 CXXScopeSpec &SS); 662 663 QualType TransformDependentTemplateSpecializationType( 664 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 665 NestedNameSpecifierLoc QualifierLoc); 666 667 /// Transforms the parameters of a function type into the 668 /// given vectors. 669 /// 670 /// The result vectors should be kept in sync; null entries in the 671 /// variables vector are acceptable. 672 /// 673 /// Return true on error. 674 bool TransformFunctionTypeParams( 675 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 676 const QualType *ParamTypes, 677 const FunctionProtoType::ExtParameterInfo *ParamInfos, 678 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 679 Sema::ExtParameterInfoBuilder &PInfos); 680 681 /// Transforms a single function-type parameter. Return null 682 /// on error. 683 /// 684 /// \param indexAdjustment - A number to add to the parameter's 685 /// scope index; can be negative 686 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 687 int indexAdjustment, 688 Optional<unsigned> NumExpansions, 689 bool ExpectParameterPack); 690 691 /// Transform the body of a lambda-expression. 692 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 693 /// Alternative implementation of TransformLambdaBody that skips transforming 694 /// the body. 695 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 696 697 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 698 699 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 700 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 701 702 TemplateParameterList *TransformTemplateParameterList( 703 TemplateParameterList *TPL) { 704 return TPL; 705 } 706 707 ExprResult TransformAddressOfOperand(Expr *E); 708 709 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 710 bool IsAddressOfOperand, 711 TypeSourceInfo **RecoveryTSI); 712 713 ExprResult TransformParenDependentScopeDeclRefExpr( 714 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 715 TypeSourceInfo **RecoveryTSI); 716 717 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 718 719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 720 // amount of stack usage with clang. 721 #define STMT(Node, Parent) \ 722 LLVM_ATTRIBUTE_NOINLINE \ 723 StmtResult Transform##Node(Node *S); 724 #define VALUESTMT(Node, Parent) \ 725 LLVM_ATTRIBUTE_NOINLINE \ 726 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 727 #define EXPR(Node, Parent) \ 728 LLVM_ATTRIBUTE_NOINLINE \ 729 ExprResult Transform##Node(Node *E); 730 #define ABSTRACT_STMT(Stmt) 731 #include "clang/AST/StmtNodes.inc" 732 733 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 734 LLVM_ATTRIBUTE_NOINLINE \ 735 OMPClause *Transform ## Class(Class *S); 736 #include "llvm/Frontend/OpenMP/OMPKinds.def" 737 738 /// Build a new qualified type given its unqualified type and type location. 739 /// 740 /// By default, this routine adds type qualifiers only to types that can 741 /// have qualifiers, and silently suppresses those qualifiers that are not 742 /// permitted. Subclasses may override this routine to provide different 743 /// behavior. 744 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 745 746 /// Build a new pointer type given its pointee type. 747 /// 748 /// By default, performs semantic analysis when building the pointer type. 749 /// Subclasses may override this routine to provide different behavior. 750 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 751 752 /// Build a new block pointer type given its pointee type. 753 /// 754 /// By default, performs semantic analysis when building the block pointer 755 /// type. Subclasses may override this routine to provide different behavior. 756 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 757 758 /// Build a new reference type given the type it references. 759 /// 760 /// By default, performs semantic analysis when building the 761 /// reference type. Subclasses may override this routine to provide 762 /// different behavior. 763 /// 764 /// \param LValue whether the type was written with an lvalue sigil 765 /// or an rvalue sigil. 766 QualType RebuildReferenceType(QualType ReferentType, 767 bool LValue, 768 SourceLocation Sigil); 769 770 /// Build a new member pointer type given the pointee type and the 771 /// class type it refers into. 772 /// 773 /// By default, performs semantic analysis when building the member pointer 774 /// type. Subclasses may override this routine to provide different behavior. 775 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 776 SourceLocation Sigil); 777 778 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 779 SourceLocation ProtocolLAngleLoc, 780 ArrayRef<ObjCProtocolDecl *> Protocols, 781 ArrayRef<SourceLocation> ProtocolLocs, 782 SourceLocation ProtocolRAngleLoc); 783 784 /// Build an Objective-C object type. 785 /// 786 /// By default, performs semantic analysis when building the object type. 787 /// Subclasses may override this routine to provide different behavior. 788 QualType RebuildObjCObjectType(QualType BaseType, 789 SourceLocation Loc, 790 SourceLocation TypeArgsLAngleLoc, 791 ArrayRef<TypeSourceInfo *> TypeArgs, 792 SourceLocation TypeArgsRAngleLoc, 793 SourceLocation ProtocolLAngleLoc, 794 ArrayRef<ObjCProtocolDecl *> Protocols, 795 ArrayRef<SourceLocation> ProtocolLocs, 796 SourceLocation ProtocolRAngleLoc); 797 798 /// Build a new Objective-C object pointer type given the pointee type. 799 /// 800 /// By default, directly builds the pointer type, with no additional semantic 801 /// analysis. 802 QualType RebuildObjCObjectPointerType(QualType PointeeType, 803 SourceLocation Star); 804 805 /// Build a new array type given the element type, size 806 /// modifier, size of the array (if known), size expression, and index type 807 /// qualifiers. 808 /// 809 /// By default, performs semantic analysis when building the array type. 810 /// Subclasses may override this routine to provide different behavior. 811 /// Also by default, all of the other Rebuild*Array 812 QualType RebuildArrayType(QualType ElementType, 813 ArrayType::ArraySizeModifier SizeMod, 814 const llvm::APInt *Size, 815 Expr *SizeExpr, 816 unsigned IndexTypeQuals, 817 SourceRange BracketsRange); 818 819 /// Build a new constant array type given the element type, size 820 /// modifier, (known) size of the array, and index type qualifiers. 821 /// 822 /// By default, performs semantic analysis when building the array type. 823 /// Subclasses may override this routine to provide different behavior. 824 QualType RebuildConstantArrayType(QualType ElementType, 825 ArrayType::ArraySizeModifier SizeMod, 826 const llvm::APInt &Size, 827 Expr *SizeExpr, 828 unsigned IndexTypeQuals, 829 SourceRange BracketsRange); 830 831 /// Build a new incomplete array type given the element type, size 832 /// modifier, and index type qualifiers. 833 /// 834 /// By default, performs semantic analysis when building the array type. 835 /// Subclasses may override this routine to provide different behavior. 836 QualType RebuildIncompleteArrayType(QualType ElementType, 837 ArrayType::ArraySizeModifier SizeMod, 838 unsigned IndexTypeQuals, 839 SourceRange BracketsRange); 840 841 /// Build a new variable-length array type given the element type, 842 /// size modifier, size expression, and index type qualifiers. 843 /// 844 /// By default, performs semantic analysis when building the array type. 845 /// Subclasses may override this routine to provide different behavior. 846 QualType RebuildVariableArrayType(QualType ElementType, 847 ArrayType::ArraySizeModifier SizeMod, 848 Expr *SizeExpr, 849 unsigned IndexTypeQuals, 850 SourceRange BracketsRange); 851 852 /// Build a new dependent-sized array type given the element type, 853 /// size modifier, size expression, and index type qualifiers. 854 /// 855 /// By default, performs semantic analysis when building the array type. 856 /// Subclasses may override this routine to provide different behavior. 857 QualType RebuildDependentSizedArrayType(QualType ElementType, 858 ArrayType::ArraySizeModifier SizeMod, 859 Expr *SizeExpr, 860 unsigned IndexTypeQuals, 861 SourceRange BracketsRange); 862 863 /// Build a new vector type given the element type and 864 /// number of elements. 865 /// 866 /// By default, performs semantic analysis when building the vector type. 867 /// Subclasses may override this routine to provide different behavior. 868 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 869 VectorType::VectorKind VecKind); 870 871 /// Build a new potentially dependently-sized extended vector type 872 /// given the element type and number of elements. 873 /// 874 /// By default, performs semantic analysis when building the vector type. 875 /// Subclasses may override this routine to provide different behavior. 876 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 877 SourceLocation AttributeLoc, 878 VectorType::VectorKind); 879 880 /// Build a new extended vector type given the element type and 881 /// number of elements. 882 /// 883 /// By default, performs semantic analysis when building the vector type. 884 /// Subclasses may override this routine to provide different behavior. 885 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 886 SourceLocation AttributeLoc); 887 888 /// Build a new potentially dependently-sized extended vector type 889 /// given the element type and number of elements. 890 /// 891 /// By default, performs semantic analysis when building the vector type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 894 Expr *SizeExpr, 895 SourceLocation AttributeLoc); 896 897 /// Build a new matrix type given the element type and dimensions. 898 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 899 unsigned NumColumns); 900 901 /// Build a new matrix type given the type and dependently-defined 902 /// dimensions. 903 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 904 Expr *ColumnExpr, 905 SourceLocation AttributeLoc); 906 907 /// Build a new DependentAddressSpaceType or return the pointee 908 /// type variable with the correct address space (retrieved from 909 /// AddrSpaceExpr) applied to it. The former will be returned in cases 910 /// where the address space remains dependent. 911 /// 912 /// By default, performs semantic analysis when building the type with address 913 /// space applied. Subclasses may override this routine to provide different 914 /// behavior. 915 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 916 Expr *AddrSpaceExpr, 917 SourceLocation AttributeLoc); 918 919 /// Build a new function type. 920 /// 921 /// By default, performs semantic analysis when building the function type. 922 /// Subclasses may override this routine to provide different behavior. 923 QualType RebuildFunctionProtoType(QualType T, 924 MutableArrayRef<QualType> ParamTypes, 925 const FunctionProtoType::ExtProtoInfo &EPI); 926 927 /// Build a new unprototyped function type. 928 QualType RebuildFunctionNoProtoType(QualType ResultType); 929 930 /// Rebuild an unresolved typename type, given the decl that 931 /// the UnresolvedUsingTypenameDecl was transformed to. 932 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 933 934 /// Build a new typedef type. 935 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 936 return SemaRef.Context.getTypeDeclType(Typedef); 937 } 938 939 /// Build a new MacroDefined type. 940 QualType RebuildMacroQualifiedType(QualType T, 941 const IdentifierInfo *MacroII) { 942 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 943 } 944 945 /// Build a new class/struct/union type. 946 QualType RebuildRecordType(RecordDecl *Record) { 947 return SemaRef.Context.getTypeDeclType(Record); 948 } 949 950 /// Build a new Enum type. 951 QualType RebuildEnumType(EnumDecl *Enum) { 952 return SemaRef.Context.getTypeDeclType(Enum); 953 } 954 955 /// Build a new typeof(expr) type. 956 /// 957 /// By default, performs semantic analysis when building the typeof type. 958 /// Subclasses may override this routine to provide different behavior. 959 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 960 961 /// Build a new typeof(type) type. 962 /// 963 /// By default, builds a new TypeOfType with the given underlying type. 964 QualType RebuildTypeOfType(QualType Underlying); 965 966 /// Build a new unary transform type. 967 QualType RebuildUnaryTransformType(QualType BaseType, 968 UnaryTransformType::UTTKind UKind, 969 SourceLocation Loc); 970 971 /// Build a new C++11 decltype type. 972 /// 973 /// By default, performs semantic analysis when building the decltype type. 974 /// Subclasses may override this routine to provide different behavior. 975 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 976 977 /// Build a new C++11 auto type. 978 /// 979 /// By default, builds a new AutoType with the given deduced type. 980 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 981 ConceptDecl *TypeConstraintConcept, 982 ArrayRef<TemplateArgument> TypeConstraintArgs) { 983 // Note, IsDependent is always false here: we implicitly convert an 'auto' 984 // which has been deduced to a dependent type into an undeduced 'auto', so 985 // that we'll retry deduction after the transformation. 986 return SemaRef.Context.getAutoType(Deduced, Keyword, 987 /*IsDependent*/ false, /*IsPack=*/false, 988 TypeConstraintConcept, 989 TypeConstraintArgs); 990 } 991 992 /// By default, builds a new DeducedTemplateSpecializationType with the given 993 /// deduced type. 994 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 995 QualType Deduced) { 996 return SemaRef.Context.getDeducedTemplateSpecializationType( 997 Template, Deduced, /*IsDependent*/ false); 998 } 999 1000 /// Build a new template specialization type. 1001 /// 1002 /// By default, performs semantic analysis when building the template 1003 /// specialization type. Subclasses may override this routine to provide 1004 /// different behavior. 1005 QualType RebuildTemplateSpecializationType(TemplateName Template, 1006 SourceLocation TemplateLoc, 1007 TemplateArgumentListInfo &Args); 1008 1009 /// Build a new parenthesized type. 1010 /// 1011 /// By default, builds a new ParenType type from the inner type. 1012 /// Subclasses may override this routine to provide different behavior. 1013 QualType RebuildParenType(QualType InnerType) { 1014 return SemaRef.BuildParenType(InnerType); 1015 } 1016 1017 /// Build a new qualified name type. 1018 /// 1019 /// By default, builds a new ElaboratedType type from the keyword, 1020 /// the nested-name-specifier and the named type. 1021 /// Subclasses may override this routine to provide different behavior. 1022 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1023 ElaboratedTypeKeyword Keyword, 1024 NestedNameSpecifierLoc QualifierLoc, 1025 QualType Named) { 1026 return SemaRef.Context.getElaboratedType(Keyword, 1027 QualifierLoc.getNestedNameSpecifier(), 1028 Named); 1029 } 1030 1031 /// Build a new typename type that refers to a template-id. 1032 /// 1033 /// By default, builds a new DependentNameType type from the 1034 /// nested-name-specifier and the given type. Subclasses may override 1035 /// this routine to provide different behavior. 1036 QualType RebuildDependentTemplateSpecializationType( 1037 ElaboratedTypeKeyword Keyword, 1038 NestedNameSpecifierLoc QualifierLoc, 1039 SourceLocation TemplateKWLoc, 1040 const IdentifierInfo *Name, 1041 SourceLocation NameLoc, 1042 TemplateArgumentListInfo &Args, 1043 bool AllowInjectedClassName) { 1044 // Rebuild the template name. 1045 // TODO: avoid TemplateName abstraction 1046 CXXScopeSpec SS; 1047 SS.Adopt(QualifierLoc); 1048 TemplateName InstName = getDerived().RebuildTemplateName( 1049 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1050 AllowInjectedClassName); 1051 1052 if (InstName.isNull()) 1053 return QualType(); 1054 1055 // If it's still dependent, make a dependent specialization. 1056 if (InstName.getAsDependentTemplateName()) 1057 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1058 QualifierLoc.getNestedNameSpecifier(), 1059 Name, 1060 Args); 1061 1062 // Otherwise, make an elaborated type wrapping a non-dependent 1063 // specialization. 1064 QualType T = 1065 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1066 if (T.isNull()) return QualType(); 1067 1068 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1069 return T; 1070 1071 return SemaRef.Context.getElaboratedType(Keyword, 1072 QualifierLoc.getNestedNameSpecifier(), 1073 T); 1074 } 1075 1076 /// Build a new typename type that refers to an identifier. 1077 /// 1078 /// By default, performs semantic analysis when building the typename type 1079 /// (or elaborated type). Subclasses may override this routine to provide 1080 /// different behavior. 1081 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1082 SourceLocation KeywordLoc, 1083 NestedNameSpecifierLoc QualifierLoc, 1084 const IdentifierInfo *Id, 1085 SourceLocation IdLoc, 1086 bool DeducedTSTContext) { 1087 CXXScopeSpec SS; 1088 SS.Adopt(QualifierLoc); 1089 1090 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1091 // If the name is still dependent, just build a new dependent name type. 1092 if (!SemaRef.computeDeclContext(SS)) 1093 return SemaRef.Context.getDependentNameType(Keyword, 1094 QualifierLoc.getNestedNameSpecifier(), 1095 Id); 1096 } 1097 1098 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1099 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1100 *Id, IdLoc, DeducedTSTContext); 1101 } 1102 1103 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1104 1105 // We had a dependent elaborated-type-specifier that has been transformed 1106 // into a non-dependent elaborated-type-specifier. Find the tag we're 1107 // referring to. 1108 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1109 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1110 if (!DC) 1111 return QualType(); 1112 1113 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1114 return QualType(); 1115 1116 TagDecl *Tag = nullptr; 1117 SemaRef.LookupQualifiedName(Result, DC); 1118 switch (Result.getResultKind()) { 1119 case LookupResult::NotFound: 1120 case LookupResult::NotFoundInCurrentInstantiation: 1121 break; 1122 1123 case LookupResult::Found: 1124 Tag = Result.getAsSingle<TagDecl>(); 1125 break; 1126 1127 case LookupResult::FoundOverloaded: 1128 case LookupResult::FoundUnresolvedValue: 1129 llvm_unreachable("Tag lookup cannot find non-tags"); 1130 1131 case LookupResult::Ambiguous: 1132 // Let the LookupResult structure handle ambiguities. 1133 return QualType(); 1134 } 1135 1136 if (!Tag) { 1137 // Check where the name exists but isn't a tag type and use that to emit 1138 // better diagnostics. 1139 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1140 SemaRef.LookupQualifiedName(Result, DC); 1141 switch (Result.getResultKind()) { 1142 case LookupResult::Found: 1143 case LookupResult::FoundOverloaded: 1144 case LookupResult::FoundUnresolvedValue: { 1145 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1146 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1147 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1148 << NTK << Kind; 1149 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1150 break; 1151 } 1152 default: 1153 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1154 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1155 break; 1156 } 1157 return QualType(); 1158 } 1159 1160 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1161 IdLoc, Id)) { 1162 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1163 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1164 return QualType(); 1165 } 1166 1167 // Build the elaborated-type-specifier type. 1168 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1169 return SemaRef.Context.getElaboratedType(Keyword, 1170 QualifierLoc.getNestedNameSpecifier(), 1171 T); 1172 } 1173 1174 /// Build a new pack expansion type. 1175 /// 1176 /// By default, builds a new PackExpansionType type from the given pattern. 1177 /// Subclasses may override this routine to provide different behavior. 1178 QualType RebuildPackExpansionType(QualType Pattern, 1179 SourceRange PatternRange, 1180 SourceLocation EllipsisLoc, 1181 Optional<unsigned> NumExpansions) { 1182 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1183 NumExpansions); 1184 } 1185 1186 /// Build a new atomic type given its value type. 1187 /// 1188 /// By default, performs semantic analysis when building the atomic type. 1189 /// Subclasses may override this routine to provide different behavior. 1190 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1191 1192 /// Build a new pipe type given its value type. 1193 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1194 bool isReadPipe); 1195 1196 /// Build an extended int given its value type. 1197 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1198 SourceLocation Loc); 1199 1200 /// Build a dependent extended int given its value type. 1201 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1202 SourceLocation Loc); 1203 1204 /// Build a new template name given a nested name specifier, a flag 1205 /// indicating whether the "template" keyword was provided, and the template 1206 /// that the template name refers to. 1207 /// 1208 /// By default, builds the new template name directly. Subclasses may override 1209 /// this routine to provide different behavior. 1210 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1211 bool TemplateKW, 1212 TemplateDecl *Template); 1213 1214 /// Build a new template name given a nested name specifier and the 1215 /// name that is referred to as a template. 1216 /// 1217 /// By default, performs semantic analysis to determine whether the name can 1218 /// be resolved to a specific template, then builds the appropriate kind of 1219 /// template name. Subclasses may override this routine to provide different 1220 /// behavior. 1221 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1222 SourceLocation TemplateKWLoc, 1223 const IdentifierInfo &Name, 1224 SourceLocation NameLoc, QualType ObjectType, 1225 NamedDecl *FirstQualifierInScope, 1226 bool AllowInjectedClassName); 1227 1228 /// Build a new template name given a nested name specifier and the 1229 /// overloaded operator name that is referred to as a template. 1230 /// 1231 /// By default, performs semantic analysis to determine whether the name can 1232 /// be resolved to a specific template, then builds the appropriate kind of 1233 /// template name. Subclasses may override this routine to provide different 1234 /// behavior. 1235 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1236 SourceLocation TemplateKWLoc, 1237 OverloadedOperatorKind Operator, 1238 SourceLocation NameLoc, QualType ObjectType, 1239 bool AllowInjectedClassName); 1240 1241 /// Build a new template name given a template template parameter pack 1242 /// and the 1243 /// 1244 /// By default, performs semantic analysis to determine whether the name can 1245 /// be resolved to a specific template, then builds the appropriate kind of 1246 /// template name. Subclasses may override this routine to provide different 1247 /// behavior. 1248 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1249 const TemplateArgument &ArgPack) { 1250 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1251 } 1252 1253 /// Build a new compound 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 RebuildCompoundStmt(SourceLocation LBraceLoc, 1258 MultiStmtArg Statements, 1259 SourceLocation RBraceLoc, 1260 bool IsStmtExpr) { 1261 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1262 IsStmtExpr); 1263 } 1264 1265 /// Build a new case statement. 1266 /// 1267 /// By default, performs semantic analysis to build the new statement. 1268 /// Subclasses may override this routine to provide different behavior. 1269 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1270 Expr *LHS, 1271 SourceLocation EllipsisLoc, 1272 Expr *RHS, 1273 SourceLocation ColonLoc) { 1274 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1275 ColonLoc); 1276 } 1277 1278 /// Attach the body to a new case statement. 1279 /// 1280 /// By default, performs semantic analysis to build the new statement. 1281 /// Subclasses may override this routine to provide different behavior. 1282 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1283 getSema().ActOnCaseStmtBody(S, Body); 1284 return S; 1285 } 1286 1287 /// Build a new default statement. 1288 /// 1289 /// By default, performs semantic analysis to build the new statement. 1290 /// Subclasses may override this routine to provide different behavior. 1291 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1292 SourceLocation ColonLoc, 1293 Stmt *SubStmt) { 1294 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1295 /*CurScope=*/nullptr); 1296 } 1297 1298 /// Build a new label statement. 1299 /// 1300 /// By default, performs semantic analysis to build the new statement. 1301 /// Subclasses may override this routine to provide different behavior. 1302 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1303 SourceLocation ColonLoc, Stmt *SubStmt) { 1304 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1305 } 1306 1307 /// Build a new label statement. 1308 /// 1309 /// By default, performs semantic analysis to build the new statement. 1310 /// Subclasses may override this routine to provide different behavior. 1311 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1312 ArrayRef<const Attr*> Attrs, 1313 Stmt *SubStmt) { 1314 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1315 } 1316 1317 /// Build a new "if" statement. 1318 /// 1319 /// By default, performs semantic analysis to build the new statement. 1320 /// Subclasses may override this routine to provide different behavior. 1321 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1322 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1323 SourceLocation ElseLoc, Stmt *Else) { 1324 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1325 ElseLoc, Else); 1326 } 1327 1328 /// Start building a new switch statement. 1329 /// 1330 /// By default, performs semantic analysis to build the new statement. 1331 /// Subclasses may override this routine to provide different behavior. 1332 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1333 Sema::ConditionResult Cond) { 1334 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1335 } 1336 1337 /// Attach the body to the switch statement. 1338 /// 1339 /// By default, performs semantic analysis to build the new statement. 1340 /// Subclasses may override this routine to provide different behavior. 1341 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1342 Stmt *Switch, Stmt *Body) { 1343 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1344 } 1345 1346 /// Build a new while statement. 1347 /// 1348 /// By default, performs semantic analysis to build the new statement. 1349 /// Subclasses may override this routine to provide different behavior. 1350 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1351 Sema::ConditionResult Cond, Stmt *Body) { 1352 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1353 } 1354 1355 /// Build a new do-while statement. 1356 /// 1357 /// By default, performs semantic analysis to build the new statement. 1358 /// Subclasses may override this routine to provide different behavior. 1359 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1360 SourceLocation WhileLoc, SourceLocation LParenLoc, 1361 Expr *Cond, SourceLocation RParenLoc) { 1362 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1363 Cond, RParenLoc); 1364 } 1365 1366 /// Build a new for statement. 1367 /// 1368 /// By default, performs semantic analysis to build the new statement. 1369 /// Subclasses may override this routine to provide different behavior. 1370 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1371 Stmt *Init, Sema::ConditionResult Cond, 1372 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1373 Stmt *Body) { 1374 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1375 Inc, RParenLoc, Body); 1376 } 1377 1378 /// Build a new goto statement. 1379 /// 1380 /// By default, performs semantic analysis to build the new statement. 1381 /// Subclasses may override this routine to provide different behavior. 1382 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1383 LabelDecl *Label) { 1384 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1385 } 1386 1387 /// Build a new indirect goto statement. 1388 /// 1389 /// By default, performs semantic analysis to build the new statement. 1390 /// Subclasses may override this routine to provide different behavior. 1391 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1392 SourceLocation StarLoc, 1393 Expr *Target) { 1394 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1395 } 1396 1397 /// Build a new return 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 RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1402 return getSema().BuildReturnStmt(ReturnLoc, Result); 1403 } 1404 1405 /// Build a new declaration statement. 1406 /// 1407 /// By default, performs semantic analysis to build the new statement. 1408 /// Subclasses may override this routine to provide different behavior. 1409 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1410 SourceLocation StartLoc, SourceLocation EndLoc) { 1411 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1412 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1413 } 1414 1415 /// Build a new inline asm statement. 1416 /// 1417 /// By default, performs semantic analysis to build the new statement. 1418 /// Subclasses may override this routine to provide different behavior. 1419 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1420 bool IsVolatile, unsigned NumOutputs, 1421 unsigned NumInputs, IdentifierInfo **Names, 1422 MultiExprArg Constraints, MultiExprArg Exprs, 1423 Expr *AsmString, MultiExprArg Clobbers, 1424 unsigned NumLabels, 1425 SourceLocation RParenLoc) { 1426 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1427 NumInputs, Names, Constraints, Exprs, 1428 AsmString, Clobbers, NumLabels, RParenLoc); 1429 } 1430 1431 /// Build a new MS style inline asm statement. 1432 /// 1433 /// By default, performs semantic analysis to build the new statement. 1434 /// Subclasses may override this routine to provide different behavior. 1435 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1436 ArrayRef<Token> AsmToks, 1437 StringRef AsmString, 1438 unsigned NumOutputs, unsigned NumInputs, 1439 ArrayRef<StringRef> Constraints, 1440 ArrayRef<StringRef> Clobbers, 1441 ArrayRef<Expr*> Exprs, 1442 SourceLocation EndLoc) { 1443 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1444 NumOutputs, NumInputs, 1445 Constraints, Clobbers, Exprs, EndLoc); 1446 } 1447 1448 /// Build a new co_return statement. 1449 /// 1450 /// By default, performs semantic analysis to build the new statement. 1451 /// Subclasses may override this routine to provide different behavior. 1452 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1453 bool IsImplicit) { 1454 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1455 } 1456 1457 /// Build a new co_await expression. 1458 /// 1459 /// By default, performs semantic analysis to build the new expression. 1460 /// Subclasses may override this routine to provide different behavior. 1461 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1462 bool IsImplicit) { 1463 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1464 } 1465 1466 /// Build a new co_await expression. 1467 /// 1468 /// By default, performs semantic analysis to build the new expression. 1469 /// Subclasses may override this routine to provide different behavior. 1470 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1471 Expr *Result, 1472 UnresolvedLookupExpr *Lookup) { 1473 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1474 } 1475 1476 /// Build a new co_yield expression. 1477 /// 1478 /// By default, performs semantic analysis to build the new expression. 1479 /// Subclasses may override this routine to provide different behavior. 1480 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1481 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1482 } 1483 1484 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1485 return getSema().BuildCoroutineBodyStmt(Args); 1486 } 1487 1488 /// Build a new Objective-C \@try statement. 1489 /// 1490 /// By default, performs semantic analysis to build the new statement. 1491 /// Subclasses may override this routine to provide different behavior. 1492 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1493 Stmt *TryBody, 1494 MultiStmtArg CatchStmts, 1495 Stmt *Finally) { 1496 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1497 Finally); 1498 } 1499 1500 /// Rebuild an Objective-C exception declaration. 1501 /// 1502 /// By default, performs semantic analysis to build the new declaration. 1503 /// Subclasses may override this routine to provide different behavior. 1504 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1505 TypeSourceInfo *TInfo, QualType T) { 1506 return getSema().BuildObjCExceptionDecl(TInfo, T, 1507 ExceptionDecl->getInnerLocStart(), 1508 ExceptionDecl->getLocation(), 1509 ExceptionDecl->getIdentifier()); 1510 } 1511 1512 /// Build a new Objective-C \@catch statement. 1513 /// 1514 /// By default, performs semantic analysis to build the new statement. 1515 /// Subclasses may override this routine to provide different behavior. 1516 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1517 SourceLocation RParenLoc, 1518 VarDecl *Var, 1519 Stmt *Body) { 1520 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1521 Var, Body); 1522 } 1523 1524 /// Build a new Objective-C \@finally statement. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1529 Stmt *Body) { 1530 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1531 } 1532 1533 /// Build a new Objective-C \@throw statement. 1534 /// 1535 /// By default, performs semantic analysis to build the new statement. 1536 /// Subclasses may override this routine to provide different behavior. 1537 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1538 Expr *Operand) { 1539 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1540 } 1541 1542 /// Build a new OpenMP executable directive. 1543 /// 1544 /// By default, performs semantic analysis to build the new statement. 1545 /// Subclasses may override this routine to provide different behavior. 1546 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1547 DeclarationNameInfo DirName, 1548 OpenMPDirectiveKind CancelRegion, 1549 ArrayRef<OMPClause *> Clauses, 1550 Stmt *AStmt, SourceLocation StartLoc, 1551 SourceLocation EndLoc) { 1552 return getSema().ActOnOpenMPExecutableDirective( 1553 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1554 } 1555 1556 /// Build a new OpenMP 'if' clause. 1557 /// 1558 /// By default, performs semantic analysis to build the new OpenMP clause. 1559 /// Subclasses may override this routine to provide different behavior. 1560 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1561 Expr *Condition, SourceLocation StartLoc, 1562 SourceLocation LParenLoc, 1563 SourceLocation NameModifierLoc, 1564 SourceLocation ColonLoc, 1565 SourceLocation EndLoc) { 1566 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1567 LParenLoc, NameModifierLoc, ColonLoc, 1568 EndLoc); 1569 } 1570 1571 /// Build a new OpenMP 'final' clause. 1572 /// 1573 /// By default, performs semantic analysis to build the new OpenMP clause. 1574 /// Subclasses may override this routine to provide different behavior. 1575 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1576 SourceLocation LParenLoc, 1577 SourceLocation EndLoc) { 1578 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1579 EndLoc); 1580 } 1581 1582 /// Build a new OpenMP 'num_threads' clause. 1583 /// 1584 /// By default, performs semantic analysis to build the new OpenMP clause. 1585 /// Subclasses may override this routine to provide different behavior. 1586 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1587 SourceLocation StartLoc, 1588 SourceLocation LParenLoc, 1589 SourceLocation EndLoc) { 1590 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1591 LParenLoc, EndLoc); 1592 } 1593 1594 /// Build a new OpenMP 'safelen' clause. 1595 /// 1596 /// By default, performs semantic analysis to build the new OpenMP clause. 1597 /// Subclasses may override this routine to provide different behavior. 1598 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1599 SourceLocation LParenLoc, 1600 SourceLocation EndLoc) { 1601 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1602 } 1603 1604 /// Build a new OpenMP 'simdlen' clause. 1605 /// 1606 /// By default, performs semantic analysis to build the new OpenMP clause. 1607 /// Subclasses may override this routine to provide different behavior. 1608 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1609 SourceLocation LParenLoc, 1610 SourceLocation EndLoc) { 1611 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'allocator' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1622 } 1623 1624 /// Build a new OpenMP 'collapse' clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1632 EndLoc); 1633 } 1634 1635 /// Build a new OpenMP 'default' clause. 1636 /// 1637 /// By default, performs semantic analysis to build the new OpenMP clause. 1638 /// Subclasses may override this routine to provide different behavior. 1639 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1640 SourceLocation StartLoc, 1641 SourceLocation LParenLoc, 1642 SourceLocation EndLoc) { 1643 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1644 StartLoc, LParenLoc, EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'proc_bind' clause. 1648 /// 1649 /// By default, performs semantic analysis to build the new OpenMP clause. 1650 /// Subclasses may override this routine to provide different behavior. 1651 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1652 SourceLocation KindKwLoc, 1653 SourceLocation StartLoc, 1654 SourceLocation LParenLoc, 1655 SourceLocation EndLoc) { 1656 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1657 StartLoc, LParenLoc, EndLoc); 1658 } 1659 1660 /// Build a new OpenMP 'schedule' clause. 1661 /// 1662 /// By default, performs semantic analysis to build the new OpenMP clause. 1663 /// Subclasses may override this routine to provide different behavior. 1664 OMPClause *RebuildOMPScheduleClause( 1665 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1666 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1667 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1668 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1669 return getSema().ActOnOpenMPScheduleClause( 1670 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1671 CommaLoc, EndLoc); 1672 } 1673 1674 /// Build a new OpenMP 'ordered' 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 *RebuildOMPOrderedClause(SourceLocation StartLoc, 1679 SourceLocation EndLoc, 1680 SourceLocation LParenLoc, Expr *Num) { 1681 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1682 } 1683 1684 /// Build a new OpenMP 'private' clause. 1685 /// 1686 /// By default, performs semantic analysis to build the new OpenMP clause. 1687 /// Subclasses may override this routine to provide different behavior. 1688 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1689 SourceLocation StartLoc, 1690 SourceLocation LParenLoc, 1691 SourceLocation EndLoc) { 1692 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1693 EndLoc); 1694 } 1695 1696 /// Build a new OpenMP 'firstprivate' clause. 1697 /// 1698 /// By default, performs semantic analysis to build the new OpenMP clause. 1699 /// Subclasses may override this routine to provide different behavior. 1700 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1701 SourceLocation StartLoc, 1702 SourceLocation LParenLoc, 1703 SourceLocation EndLoc) { 1704 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1705 EndLoc); 1706 } 1707 1708 /// Build a new OpenMP 'lastprivate' clause. 1709 /// 1710 /// By default, performs semantic analysis to build the new OpenMP clause. 1711 /// Subclasses may override this routine to provide different behavior. 1712 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1713 OpenMPLastprivateModifier LPKind, 1714 SourceLocation LPKindLoc, 1715 SourceLocation ColonLoc, 1716 SourceLocation StartLoc, 1717 SourceLocation LParenLoc, 1718 SourceLocation EndLoc) { 1719 return getSema().ActOnOpenMPLastprivateClause( 1720 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1721 } 1722 1723 /// Build a new OpenMP 'shared' clause. 1724 /// 1725 /// By default, performs semantic analysis to build the new OpenMP clause. 1726 /// Subclasses may override this routine to provide different behavior. 1727 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1728 SourceLocation StartLoc, 1729 SourceLocation LParenLoc, 1730 SourceLocation EndLoc) { 1731 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1732 EndLoc); 1733 } 1734 1735 /// Build a new OpenMP 'reduction' clause. 1736 /// 1737 /// By default, performs semantic analysis to build the new statement. 1738 /// Subclasses may override this routine to provide different behavior. 1739 OMPClause *RebuildOMPReductionClause( 1740 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1741 SourceLocation StartLoc, SourceLocation LParenLoc, 1742 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1743 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1744 const DeclarationNameInfo &ReductionId, 1745 ArrayRef<Expr *> UnresolvedReductions) { 1746 return getSema().ActOnOpenMPReductionClause( 1747 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1748 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1749 } 1750 1751 /// Build a new OpenMP 'task_reduction' clause. 1752 /// 1753 /// By default, performs semantic analysis to build the new statement. 1754 /// Subclasses may override this routine to provide different behavior. 1755 OMPClause *RebuildOMPTaskReductionClause( 1756 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1757 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1758 CXXScopeSpec &ReductionIdScopeSpec, 1759 const DeclarationNameInfo &ReductionId, 1760 ArrayRef<Expr *> UnresolvedReductions) { 1761 return getSema().ActOnOpenMPTaskReductionClause( 1762 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1763 ReductionId, UnresolvedReductions); 1764 } 1765 1766 /// Build a new OpenMP 'in_reduction' clause. 1767 /// 1768 /// By default, performs semantic analysis to build the new statement. 1769 /// Subclasses may override this routine to provide different behavior. 1770 OMPClause * 1771 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1772 SourceLocation LParenLoc, SourceLocation ColonLoc, 1773 SourceLocation EndLoc, 1774 CXXScopeSpec &ReductionIdScopeSpec, 1775 const DeclarationNameInfo &ReductionId, 1776 ArrayRef<Expr *> UnresolvedReductions) { 1777 return getSema().ActOnOpenMPInReductionClause( 1778 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1779 ReductionId, UnresolvedReductions); 1780 } 1781 1782 /// Build a new OpenMP 'linear' clause. 1783 /// 1784 /// By default, performs semantic analysis to build the new OpenMP clause. 1785 /// Subclasses may override this routine to provide different behavior. 1786 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1787 SourceLocation StartLoc, 1788 SourceLocation LParenLoc, 1789 OpenMPLinearClauseKind Modifier, 1790 SourceLocation ModifierLoc, 1791 SourceLocation ColonLoc, 1792 SourceLocation EndLoc) { 1793 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1794 Modifier, ModifierLoc, ColonLoc, 1795 EndLoc); 1796 } 1797 1798 /// Build a new OpenMP 'aligned' clause. 1799 /// 1800 /// By default, performs semantic analysis to build the new OpenMP clause. 1801 /// Subclasses may override this routine to provide different behavior. 1802 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1803 SourceLocation StartLoc, 1804 SourceLocation LParenLoc, 1805 SourceLocation ColonLoc, 1806 SourceLocation EndLoc) { 1807 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1808 LParenLoc, ColonLoc, EndLoc); 1809 } 1810 1811 /// Build a new OpenMP 'copyin' clause. 1812 /// 1813 /// By default, performs semantic analysis to build the new OpenMP clause. 1814 /// Subclasses may override this routine to provide different behavior. 1815 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1816 SourceLocation StartLoc, 1817 SourceLocation LParenLoc, 1818 SourceLocation EndLoc) { 1819 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1820 EndLoc); 1821 } 1822 1823 /// Build a new OpenMP 'copyprivate' clause. 1824 /// 1825 /// By default, performs semantic analysis to build the new OpenMP clause. 1826 /// Subclasses may override this routine to provide different behavior. 1827 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 SourceLocation EndLoc) { 1831 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1832 EndLoc); 1833 } 1834 1835 /// Build a new OpenMP 'flush' pseudo clause. 1836 /// 1837 /// By default, performs semantic analysis to build the new OpenMP clause. 1838 /// Subclasses may override this routine to provide different behavior. 1839 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1840 SourceLocation StartLoc, 1841 SourceLocation LParenLoc, 1842 SourceLocation EndLoc) { 1843 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1844 EndLoc); 1845 } 1846 1847 /// Build a new OpenMP 'depobj' pseudo clause. 1848 /// 1849 /// By default, performs semantic analysis to build the new OpenMP clause. 1850 /// Subclasses may override this routine to provide different behavior. 1851 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1852 SourceLocation LParenLoc, 1853 SourceLocation EndLoc) { 1854 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1855 EndLoc); 1856 } 1857 1858 /// Build a new OpenMP 'depend' pseudo clause. 1859 /// 1860 /// By default, performs semantic analysis to build the new OpenMP clause. 1861 /// Subclasses may override this routine to provide different behavior. 1862 OMPClause * 1863 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1864 SourceLocation DepLoc, SourceLocation ColonLoc, 1865 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1866 SourceLocation LParenLoc, SourceLocation EndLoc) { 1867 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1868 ColonLoc, VarList, StartLoc, 1869 LParenLoc, EndLoc); 1870 } 1871 1872 /// Build a new OpenMP 'device' clause. 1873 /// 1874 /// By default, performs semantic analysis to build the new statement. 1875 /// Subclasses may override this routine to provide different behavior. 1876 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1877 Expr *Device, SourceLocation StartLoc, 1878 SourceLocation LParenLoc, 1879 SourceLocation ModifierLoc, 1880 SourceLocation EndLoc) { 1881 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1882 LParenLoc, ModifierLoc, EndLoc); 1883 } 1884 1885 /// Build a new OpenMP 'map' clause. 1886 /// 1887 /// By default, performs semantic analysis to build the new OpenMP clause. 1888 /// Subclasses may override this routine to provide different behavior. 1889 OMPClause *RebuildOMPMapClause( 1890 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1891 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1892 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1893 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1894 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1895 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1896 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1897 MapperIdScopeSpec, MapperId, MapType, 1898 IsMapTypeImplicit, MapLoc, ColonLoc, 1899 VarList, Locs, UnresolvedMappers); 1900 } 1901 1902 /// Build a new OpenMP 'allocate' clause. 1903 /// 1904 /// By default, performs semantic analysis to build the new OpenMP clause. 1905 /// Subclasses may override this routine to provide different behavior. 1906 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1907 SourceLocation StartLoc, 1908 SourceLocation LParenLoc, 1909 SourceLocation ColonLoc, 1910 SourceLocation EndLoc) { 1911 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1912 LParenLoc, ColonLoc, EndLoc); 1913 } 1914 1915 /// Build a new OpenMP 'num_teams' clause. 1916 /// 1917 /// By default, performs semantic analysis to build the new statement. 1918 /// Subclasses may override this routine to provide different behavior. 1919 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1920 SourceLocation LParenLoc, 1921 SourceLocation EndLoc) { 1922 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1923 EndLoc); 1924 } 1925 1926 /// Build a new OpenMP 'thread_limit' clause. 1927 /// 1928 /// By default, performs semantic analysis to build the new statement. 1929 /// Subclasses may override this routine to provide different behavior. 1930 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1931 SourceLocation StartLoc, 1932 SourceLocation LParenLoc, 1933 SourceLocation EndLoc) { 1934 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1935 LParenLoc, EndLoc); 1936 } 1937 1938 /// Build a new OpenMP 'priority' clause. 1939 /// 1940 /// By default, performs semantic analysis to build the new statement. 1941 /// Subclasses may override this routine to provide different behavior. 1942 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1943 SourceLocation LParenLoc, 1944 SourceLocation EndLoc) { 1945 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1946 EndLoc); 1947 } 1948 1949 /// Build a new OpenMP 'grainsize' clause. 1950 /// 1951 /// By default, performs semantic analysis to build the new statement. 1952 /// Subclasses may override this routine to provide different behavior. 1953 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1954 SourceLocation LParenLoc, 1955 SourceLocation EndLoc) { 1956 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1957 EndLoc); 1958 } 1959 1960 /// Build a new OpenMP 'num_tasks' clause. 1961 /// 1962 /// By default, performs semantic analysis to build the new statement. 1963 /// Subclasses may override this routine to provide different behavior. 1964 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1965 SourceLocation LParenLoc, 1966 SourceLocation EndLoc) { 1967 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1968 EndLoc); 1969 } 1970 1971 /// Build a new OpenMP 'hint' 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 *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1976 SourceLocation LParenLoc, 1977 SourceLocation EndLoc) { 1978 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1979 } 1980 1981 /// Build a new OpenMP 'detach' clause. 1982 /// 1983 /// By default, performs semantic analysis to build the new statement. 1984 /// Subclasses may override this routine to provide different behavior. 1985 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1986 SourceLocation LParenLoc, 1987 SourceLocation EndLoc) { 1988 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1989 } 1990 1991 /// Build a new OpenMP 'dist_schedule' clause. 1992 /// 1993 /// By default, performs semantic analysis to build the new OpenMP clause. 1994 /// Subclasses may override this routine to provide different behavior. 1995 OMPClause * 1996 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1997 Expr *ChunkSize, SourceLocation StartLoc, 1998 SourceLocation LParenLoc, SourceLocation KindLoc, 1999 SourceLocation CommaLoc, SourceLocation EndLoc) { 2000 return getSema().ActOnOpenMPDistScheduleClause( 2001 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2002 } 2003 2004 /// Build a new OpenMP 'to' clause. 2005 /// 2006 /// By default, performs semantic analysis to build the new statement. 2007 /// Subclasses may override this routine to provide different behavior. 2008 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 2009 CXXScopeSpec &MapperIdScopeSpec, 2010 DeclarationNameInfo &MapperId, 2011 const OMPVarListLocTy &Locs, 2012 ArrayRef<Expr *> UnresolvedMappers) { 2013 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 2014 Locs, UnresolvedMappers); 2015 } 2016 2017 /// Build a new OpenMP 'from' clause. 2018 /// 2019 /// By default, performs semantic analysis to build the new statement. 2020 /// Subclasses may override this routine to provide different behavior. 2021 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 2022 CXXScopeSpec &MapperIdScopeSpec, 2023 DeclarationNameInfo &MapperId, 2024 const OMPVarListLocTy &Locs, 2025 ArrayRef<Expr *> UnresolvedMappers) { 2026 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 2027 Locs, UnresolvedMappers); 2028 } 2029 2030 /// Build a new OpenMP 'use_device_ptr' clause. 2031 /// 2032 /// By default, performs semantic analysis to build the new OpenMP clause. 2033 /// Subclasses may override this routine to provide different behavior. 2034 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2035 const OMPVarListLocTy &Locs) { 2036 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2037 } 2038 2039 /// Build a new OpenMP 'use_device_addr' clause. 2040 /// 2041 /// By default, performs semantic analysis to build the new OpenMP clause. 2042 /// Subclasses may override this routine to provide different behavior. 2043 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2044 const OMPVarListLocTy &Locs) { 2045 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2046 } 2047 2048 /// Build a new OpenMP 'is_device_ptr' clause. 2049 /// 2050 /// By default, performs semantic analysis to build the new OpenMP clause. 2051 /// Subclasses may override this routine to provide different behavior. 2052 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2053 const OMPVarListLocTy &Locs) { 2054 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2055 } 2056 2057 /// Build a new OpenMP 'defaultmap' clause. 2058 /// 2059 /// By default, performs semantic analysis to build the new OpenMP clause. 2060 /// Subclasses may override this routine to provide different behavior. 2061 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2062 OpenMPDefaultmapClauseKind Kind, 2063 SourceLocation StartLoc, 2064 SourceLocation LParenLoc, 2065 SourceLocation MLoc, 2066 SourceLocation KindLoc, 2067 SourceLocation EndLoc) { 2068 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2069 MLoc, KindLoc, EndLoc); 2070 } 2071 2072 /// Build a new OpenMP 'nontemporal' clause. 2073 /// 2074 /// By default, performs semantic analysis to build the new OpenMP clause. 2075 /// Subclasses may override this routine to provide different behavior. 2076 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2077 SourceLocation StartLoc, 2078 SourceLocation LParenLoc, 2079 SourceLocation EndLoc) { 2080 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2081 EndLoc); 2082 } 2083 2084 /// Build a new OpenMP 'inclusive' clause. 2085 /// 2086 /// By default, performs semantic analysis to build the new OpenMP clause. 2087 /// Subclasses may override this routine to provide different behavior. 2088 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2089 SourceLocation StartLoc, 2090 SourceLocation LParenLoc, 2091 SourceLocation EndLoc) { 2092 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2093 EndLoc); 2094 } 2095 2096 /// Build a new OpenMP 'exclusive' clause. 2097 /// 2098 /// By default, performs semantic analysis to build the new OpenMP clause. 2099 /// Subclasses may override this routine to provide different behavior. 2100 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2101 SourceLocation StartLoc, 2102 SourceLocation LParenLoc, 2103 SourceLocation EndLoc) { 2104 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2105 EndLoc); 2106 } 2107 2108 /// Build a new OpenMP 'uses_allocators' clause. 2109 /// 2110 /// By default, performs semantic analysis to build the new OpenMP clause. 2111 /// Subclasses may override this routine to provide different behavior. 2112 OMPClause *RebuildOMPUsesAllocatorsClause( 2113 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2114 SourceLocation LParenLoc, SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2116 Data); 2117 } 2118 2119 /// Build a new OpenMP 'affinity' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2124 SourceLocation LParenLoc, 2125 SourceLocation ColonLoc, 2126 SourceLocation EndLoc, Expr *Modifier, 2127 ArrayRef<Expr *> Locators) { 2128 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2129 EndLoc, Modifier, Locators); 2130 } 2131 2132 /// Build a new OpenMP 'order' clause. 2133 /// 2134 /// By default, performs semantic analysis to build the new OpenMP clause. 2135 /// Subclasses may override this routine to provide different behavior. 2136 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2137 SourceLocation KindKwLoc, 2138 SourceLocation StartLoc, 2139 SourceLocation LParenLoc, 2140 SourceLocation EndLoc) { 2141 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2142 LParenLoc, EndLoc); 2143 } 2144 2145 /// Rebuild the operand to an Objective-C \@synchronized statement. 2146 /// 2147 /// By default, performs semantic analysis to build the new statement. 2148 /// Subclasses may override this routine to provide different behavior. 2149 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2150 Expr *object) { 2151 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2152 } 2153 2154 /// Build a new Objective-C \@synchronized statement. 2155 /// 2156 /// By default, performs semantic analysis to build the new statement. 2157 /// Subclasses may override this routine to provide different behavior. 2158 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2159 Expr *Object, Stmt *Body) { 2160 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2161 } 2162 2163 /// Build a new Objective-C \@autoreleasepool statement. 2164 /// 2165 /// By default, performs semantic analysis to build the new statement. 2166 /// Subclasses may override this routine to provide different behavior. 2167 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2168 Stmt *Body) { 2169 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2170 } 2171 2172 /// Build a new Objective-C fast enumeration statement. 2173 /// 2174 /// By default, performs semantic analysis to build the new statement. 2175 /// Subclasses may override this routine to provide different behavior. 2176 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2177 Stmt *Element, 2178 Expr *Collection, 2179 SourceLocation RParenLoc, 2180 Stmt *Body) { 2181 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2182 Element, 2183 Collection, 2184 RParenLoc); 2185 if (ForEachStmt.isInvalid()) 2186 return StmtError(); 2187 2188 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2189 } 2190 2191 /// Build a new C++ exception declaration. 2192 /// 2193 /// By default, performs semantic analysis to build the new decaration. 2194 /// Subclasses may override this routine to provide different behavior. 2195 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2196 TypeSourceInfo *Declarator, 2197 SourceLocation StartLoc, 2198 SourceLocation IdLoc, 2199 IdentifierInfo *Id) { 2200 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2201 StartLoc, IdLoc, Id); 2202 if (Var) 2203 getSema().CurContext->addDecl(Var); 2204 return Var; 2205 } 2206 2207 /// Build a new C++ catch statement. 2208 /// 2209 /// By default, performs semantic analysis to build the new statement. 2210 /// Subclasses may override this routine to provide different behavior. 2211 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2212 VarDecl *ExceptionDecl, 2213 Stmt *Handler) { 2214 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2215 Handler)); 2216 } 2217 2218 /// Build a new C++ try statement. 2219 /// 2220 /// By default, performs semantic analysis to build the new statement. 2221 /// Subclasses may override this routine to provide different behavior. 2222 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2223 ArrayRef<Stmt *> Handlers) { 2224 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2225 } 2226 2227 /// Build a new C++0x range-based for statement. 2228 /// 2229 /// By default, performs semantic analysis to build the new statement. 2230 /// Subclasses may override this routine to provide different behavior. 2231 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2232 SourceLocation CoawaitLoc, Stmt *Init, 2233 SourceLocation ColonLoc, Stmt *Range, 2234 Stmt *Begin, Stmt *End, Expr *Cond, 2235 Expr *Inc, Stmt *LoopVar, 2236 SourceLocation RParenLoc) { 2237 // If we've just learned that the range is actually an Objective-C 2238 // collection, treat this as an Objective-C fast enumeration loop. 2239 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2240 if (RangeStmt->isSingleDecl()) { 2241 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2242 if (RangeVar->isInvalidDecl()) 2243 return StmtError(); 2244 2245 Expr *RangeExpr = RangeVar->getInit(); 2246 if (!RangeExpr->isTypeDependent() && 2247 RangeExpr->getType()->isObjCObjectPointerType()) { 2248 // FIXME: Support init-statements in Objective-C++20 ranged for 2249 // statement. 2250 if (Init) { 2251 return SemaRef.Diag(Init->getBeginLoc(), 2252 diag::err_objc_for_range_init_stmt) 2253 << Init->getSourceRange(); 2254 } 2255 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2256 RangeExpr, RParenLoc); 2257 } 2258 } 2259 } 2260 } 2261 2262 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2263 Range, Begin, End, Cond, Inc, LoopVar, 2264 RParenLoc, Sema::BFRK_Rebuild); 2265 } 2266 2267 /// Build a new C++0x range-based for statement. 2268 /// 2269 /// By default, performs semantic analysis to build the new statement. 2270 /// Subclasses may override this routine to provide different behavior. 2271 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2272 bool IsIfExists, 2273 NestedNameSpecifierLoc QualifierLoc, 2274 DeclarationNameInfo NameInfo, 2275 Stmt *Nested) { 2276 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2277 QualifierLoc, NameInfo, Nested); 2278 } 2279 2280 /// Attach body to a C++0x range-based for statement. 2281 /// 2282 /// By default, performs semantic analysis to finish the new statement. 2283 /// Subclasses may override this routine to provide different behavior. 2284 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2285 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2286 } 2287 2288 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2289 Stmt *TryBlock, Stmt *Handler) { 2290 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2291 } 2292 2293 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2294 Stmt *Block) { 2295 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2296 } 2297 2298 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2299 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2300 } 2301 2302 /// Build a new predefined expression. 2303 /// 2304 /// By default, performs semantic analysis to build the new expression. 2305 /// Subclasses may override this routine to provide different behavior. 2306 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2307 PredefinedExpr::IdentKind IK) { 2308 return getSema().BuildPredefinedExpr(Loc, IK); 2309 } 2310 2311 /// Build a new expression that references a declaration. 2312 /// 2313 /// By default, performs semantic analysis to build the new expression. 2314 /// Subclasses may override this routine to provide different behavior. 2315 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2316 LookupResult &R, 2317 bool RequiresADL) { 2318 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2319 } 2320 2321 2322 /// Build a new expression that references a declaration. 2323 /// 2324 /// By default, performs semantic analysis to build the new expression. 2325 /// Subclasses may override this routine to provide different behavior. 2326 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2327 ValueDecl *VD, 2328 const DeclarationNameInfo &NameInfo, 2329 NamedDecl *Found, 2330 TemplateArgumentListInfo *TemplateArgs) { 2331 CXXScopeSpec SS; 2332 SS.Adopt(QualifierLoc); 2333 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2334 TemplateArgs); 2335 } 2336 2337 /// Build a new expression in parentheses. 2338 /// 2339 /// By default, performs semantic analysis to build the new expression. 2340 /// Subclasses may override this routine to provide different behavior. 2341 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2342 SourceLocation RParen) { 2343 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2344 } 2345 2346 /// Build a new pseudo-destructor expression. 2347 /// 2348 /// By default, performs semantic analysis to build the new expression. 2349 /// Subclasses may override this routine to provide different behavior. 2350 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2351 SourceLocation OperatorLoc, 2352 bool isArrow, 2353 CXXScopeSpec &SS, 2354 TypeSourceInfo *ScopeType, 2355 SourceLocation CCLoc, 2356 SourceLocation TildeLoc, 2357 PseudoDestructorTypeStorage Destroyed); 2358 2359 /// Build a new unary operator expression. 2360 /// 2361 /// By default, performs semantic analysis to build the new expression. 2362 /// Subclasses may override this routine to provide different behavior. 2363 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2364 UnaryOperatorKind Opc, 2365 Expr *SubExpr) { 2366 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2367 } 2368 2369 /// Build a new builtin offsetof expression. 2370 /// 2371 /// By default, performs semantic analysis to build the new expression. 2372 /// Subclasses may override this routine to provide different behavior. 2373 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2374 TypeSourceInfo *Type, 2375 ArrayRef<Sema::OffsetOfComponent> Components, 2376 SourceLocation RParenLoc) { 2377 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2378 RParenLoc); 2379 } 2380 2381 /// Build a new sizeof, alignof or vec_step expression with a 2382 /// type argument. 2383 /// 2384 /// By default, performs semantic analysis to build the new expression. 2385 /// Subclasses may override this routine to provide different behavior. 2386 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2387 SourceLocation OpLoc, 2388 UnaryExprOrTypeTrait ExprKind, 2389 SourceRange R) { 2390 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2391 } 2392 2393 /// Build a new sizeof, alignof or vec step expression with an 2394 /// expression argument. 2395 /// 2396 /// By default, performs semantic analysis to build the new expression. 2397 /// Subclasses may override this routine to provide different behavior. 2398 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2399 UnaryExprOrTypeTrait ExprKind, 2400 SourceRange R) { 2401 ExprResult Result 2402 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2403 if (Result.isInvalid()) 2404 return ExprError(); 2405 2406 return Result; 2407 } 2408 2409 /// Build a new array subscript expression. 2410 /// 2411 /// By default, performs semantic analysis to build the new expression. 2412 /// Subclasses may override this routine to provide different behavior. 2413 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2414 SourceLocation LBracketLoc, 2415 Expr *RHS, 2416 SourceLocation RBracketLoc) { 2417 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2418 LBracketLoc, RHS, 2419 RBracketLoc); 2420 } 2421 2422 /// Build a new matrix subscript 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 RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2427 Expr *ColumnIdx, 2428 SourceLocation RBracketLoc) { 2429 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2430 RBracketLoc); 2431 } 2432 2433 /// Build a new array section expression. 2434 /// 2435 /// By default, performs semantic analysis to build the new expression. 2436 /// Subclasses may override this routine to provide different behavior. 2437 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2438 Expr *LowerBound, 2439 SourceLocation ColonLoc, Expr *Length, 2440 SourceLocation RBracketLoc) { 2441 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2442 ColonLoc, Length, RBracketLoc); 2443 } 2444 2445 /// Build a new array shaping expression. 2446 /// 2447 /// By default, performs semantic analysis to build the new expression. 2448 /// Subclasses may override this routine to provide different behavior. 2449 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2450 SourceLocation RParenLoc, 2451 ArrayRef<Expr *> Dims, 2452 ArrayRef<SourceRange> BracketsRanges) { 2453 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2454 BracketsRanges); 2455 } 2456 2457 /// Build a new iterator expression. 2458 /// 2459 /// By default, performs semantic analysis to build the new expression. 2460 /// Subclasses may override this routine to provide different behavior. 2461 ExprResult RebuildOMPIteratorExpr( 2462 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2463 ArrayRef<Sema::OMPIteratorData> Data) { 2464 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2465 LLoc, RLoc, Data); 2466 } 2467 2468 /// Build a new call expression. 2469 /// 2470 /// By default, performs semantic analysis to build the new expression. 2471 /// Subclasses may override this routine to provide different behavior. 2472 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2473 MultiExprArg Args, 2474 SourceLocation RParenLoc, 2475 Expr *ExecConfig = nullptr) { 2476 return getSema().ActOnCallExpr( 2477 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2478 } 2479 2480 /// Build a new member access expression. 2481 /// 2482 /// By default, performs semantic analysis to build the new expression. 2483 /// Subclasses may override this routine to provide different behavior. 2484 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2485 bool isArrow, 2486 NestedNameSpecifierLoc QualifierLoc, 2487 SourceLocation TemplateKWLoc, 2488 const DeclarationNameInfo &MemberNameInfo, 2489 ValueDecl *Member, 2490 NamedDecl *FoundDecl, 2491 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2492 NamedDecl *FirstQualifierInScope) { 2493 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2494 isArrow); 2495 if (!Member->getDeclName()) { 2496 // We have a reference to an unnamed field. This is always the 2497 // base of an anonymous struct/union member access, i.e. the 2498 // field is always of record type. 2499 assert(Member->getType()->isRecordType() && 2500 "unnamed member not of record type?"); 2501 2502 BaseResult = 2503 getSema().PerformObjectMemberConversion(BaseResult.get(), 2504 QualifierLoc.getNestedNameSpecifier(), 2505 FoundDecl, Member); 2506 if (BaseResult.isInvalid()) 2507 return ExprError(); 2508 Base = BaseResult.get(); 2509 2510 CXXScopeSpec EmptySS; 2511 return getSema().BuildFieldReferenceExpr( 2512 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2513 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2514 } 2515 2516 CXXScopeSpec SS; 2517 SS.Adopt(QualifierLoc); 2518 2519 Base = BaseResult.get(); 2520 QualType BaseType = Base->getType(); 2521 2522 if (isArrow && !BaseType->isPointerType()) 2523 return ExprError(); 2524 2525 // FIXME: this involves duplicating earlier analysis in a lot of 2526 // cases; we should avoid this when possible. 2527 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2528 R.addDecl(FoundDecl); 2529 R.resolveKind(); 2530 2531 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2532 SS, TemplateKWLoc, 2533 FirstQualifierInScope, 2534 R, ExplicitTemplateArgs, 2535 /*S*/nullptr); 2536 } 2537 2538 /// Build a new binary operator expression. 2539 /// 2540 /// By default, performs semantic analysis to build the new expression. 2541 /// Subclasses may override this routine to provide different behavior. 2542 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2543 BinaryOperatorKind Opc, 2544 Expr *LHS, Expr *RHS) { 2545 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2546 } 2547 2548 /// Build a new rewritten operator 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 RebuildCXXRewrittenBinaryOperator( 2553 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2554 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2555 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2556 RHS, /*RequiresADL*/false); 2557 } 2558 2559 /// Build a new conditional operator expression. 2560 /// 2561 /// By default, performs semantic analysis to build the new expression. 2562 /// Subclasses may override this routine to provide different behavior. 2563 ExprResult RebuildConditionalOperator(Expr *Cond, 2564 SourceLocation QuestionLoc, 2565 Expr *LHS, 2566 SourceLocation ColonLoc, 2567 Expr *RHS) { 2568 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2569 LHS, RHS); 2570 } 2571 2572 /// Build a new C-style cast expression. 2573 /// 2574 /// By default, performs semantic analysis to build the new expression. 2575 /// Subclasses may override this routine to provide different behavior. 2576 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2577 TypeSourceInfo *TInfo, 2578 SourceLocation RParenLoc, 2579 Expr *SubExpr) { 2580 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2581 SubExpr); 2582 } 2583 2584 /// Build a new compound literal expression. 2585 /// 2586 /// By default, performs semantic analysis to build the new expression. 2587 /// Subclasses may override this routine to provide different behavior. 2588 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2589 TypeSourceInfo *TInfo, 2590 SourceLocation RParenLoc, 2591 Expr *Init) { 2592 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2593 Init); 2594 } 2595 2596 /// Build a new extended vector element access expression. 2597 /// 2598 /// By default, performs semantic analysis to build the new expression. 2599 /// Subclasses may override this routine to provide different behavior. 2600 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2601 SourceLocation OpLoc, 2602 SourceLocation AccessorLoc, 2603 IdentifierInfo &Accessor) { 2604 2605 CXXScopeSpec SS; 2606 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2607 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2608 OpLoc, /*IsArrow*/ false, 2609 SS, SourceLocation(), 2610 /*FirstQualifierInScope*/ nullptr, 2611 NameInfo, 2612 /* TemplateArgs */ nullptr, 2613 /*S*/ nullptr); 2614 } 2615 2616 /// Build a new initializer list expression. 2617 /// 2618 /// By default, performs semantic analysis to build the new expression. 2619 /// Subclasses may override this routine to provide different behavior. 2620 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2621 MultiExprArg Inits, 2622 SourceLocation RBraceLoc) { 2623 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2624 } 2625 2626 /// Build a new designated initializer expression. 2627 /// 2628 /// By default, performs semantic analysis to build the new expression. 2629 /// Subclasses may override this routine to provide different behavior. 2630 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2631 MultiExprArg ArrayExprs, 2632 SourceLocation EqualOrColonLoc, 2633 bool GNUSyntax, 2634 Expr *Init) { 2635 ExprResult Result 2636 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2637 Init); 2638 if (Result.isInvalid()) 2639 return ExprError(); 2640 2641 return Result; 2642 } 2643 2644 /// Build a new value-initialized expression. 2645 /// 2646 /// By default, builds the implicit value initialization without performing 2647 /// any semantic analysis. Subclasses may override this routine to provide 2648 /// different behavior. 2649 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2650 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2651 } 2652 2653 /// Build a new \c va_arg expression. 2654 /// 2655 /// By default, performs semantic analysis to build the new expression. 2656 /// Subclasses may override this routine to provide different behavior. 2657 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2658 Expr *SubExpr, TypeSourceInfo *TInfo, 2659 SourceLocation RParenLoc) { 2660 return getSema().BuildVAArgExpr(BuiltinLoc, 2661 SubExpr, TInfo, 2662 RParenLoc); 2663 } 2664 2665 /// Build a new expression list in parentheses. 2666 /// 2667 /// By default, performs semantic analysis to build the new expression. 2668 /// Subclasses may override this routine to provide different behavior. 2669 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2670 MultiExprArg SubExprs, 2671 SourceLocation RParenLoc) { 2672 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2673 } 2674 2675 /// Build a new address-of-label expression. 2676 /// 2677 /// By default, performs semantic analysis, using the name of the label 2678 /// rather than attempting to map the label statement itself. 2679 /// Subclasses may override this routine to provide different behavior. 2680 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2681 SourceLocation LabelLoc, LabelDecl *Label) { 2682 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2683 } 2684 2685 /// Build a new GNU statement expression. 2686 /// 2687 /// By default, performs semantic analysis to build the new expression. 2688 /// Subclasses may override this routine to provide different behavior. 2689 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2690 SourceLocation RParenLoc, unsigned TemplateDepth) { 2691 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2692 TemplateDepth); 2693 } 2694 2695 /// Build a new __builtin_choose_expr expression. 2696 /// 2697 /// By default, performs semantic analysis to build the new expression. 2698 /// Subclasses may override this routine to provide different behavior. 2699 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2700 Expr *Cond, Expr *LHS, Expr *RHS, 2701 SourceLocation RParenLoc) { 2702 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2703 Cond, LHS, RHS, 2704 RParenLoc); 2705 } 2706 2707 /// Build a new generic selection 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 RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2712 SourceLocation DefaultLoc, 2713 SourceLocation RParenLoc, 2714 Expr *ControllingExpr, 2715 ArrayRef<TypeSourceInfo *> Types, 2716 ArrayRef<Expr *> Exprs) { 2717 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2718 ControllingExpr, Types, Exprs); 2719 } 2720 2721 /// Build a new overloaded operator call expression. 2722 /// 2723 /// By default, performs semantic analysis to build the new expression. 2724 /// The semantic analysis provides the behavior of template instantiation, 2725 /// copying with transformations that turn what looks like an overloaded 2726 /// operator call into a use of a builtin operator, performing 2727 /// argument-dependent lookup, etc. Subclasses may override this routine to 2728 /// provide different behavior. 2729 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2730 SourceLocation OpLoc, 2731 Expr *Callee, 2732 Expr *First, 2733 Expr *Second); 2734 2735 /// Build a new C++ "named" cast expression, such as static_cast or 2736 /// reinterpret_cast. 2737 /// 2738 /// By default, this routine dispatches to one of the more-specific routines 2739 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2740 /// Subclasses may override this routine to provide different behavior. 2741 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2742 Stmt::StmtClass Class, 2743 SourceLocation LAngleLoc, 2744 TypeSourceInfo *TInfo, 2745 SourceLocation RAngleLoc, 2746 SourceLocation LParenLoc, 2747 Expr *SubExpr, 2748 SourceLocation RParenLoc) { 2749 switch (Class) { 2750 case Stmt::CXXStaticCastExprClass: 2751 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2752 RAngleLoc, LParenLoc, 2753 SubExpr, RParenLoc); 2754 2755 case Stmt::CXXDynamicCastExprClass: 2756 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2757 RAngleLoc, LParenLoc, 2758 SubExpr, RParenLoc); 2759 2760 case Stmt::CXXReinterpretCastExprClass: 2761 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2762 RAngleLoc, LParenLoc, 2763 SubExpr, 2764 RParenLoc); 2765 2766 case Stmt::CXXConstCastExprClass: 2767 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2768 RAngleLoc, LParenLoc, 2769 SubExpr, RParenLoc); 2770 2771 case Stmt::CXXAddrspaceCastExprClass: 2772 return getDerived().RebuildCXXAddrspaceCastExpr( 2773 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2774 2775 default: 2776 llvm_unreachable("Invalid C++ named cast"); 2777 } 2778 } 2779 2780 /// Build a new C++ static_cast expression. 2781 /// 2782 /// By default, performs semantic analysis to build the new expression. 2783 /// Subclasses may override this routine to provide different behavior. 2784 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2785 SourceLocation LAngleLoc, 2786 TypeSourceInfo *TInfo, 2787 SourceLocation RAngleLoc, 2788 SourceLocation LParenLoc, 2789 Expr *SubExpr, 2790 SourceLocation RParenLoc) { 2791 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2792 TInfo, SubExpr, 2793 SourceRange(LAngleLoc, RAngleLoc), 2794 SourceRange(LParenLoc, RParenLoc)); 2795 } 2796 2797 /// Build a new C++ dynamic_cast expression. 2798 /// 2799 /// By default, performs semantic analysis to build the new expression. 2800 /// Subclasses may override this routine to provide different behavior. 2801 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2802 SourceLocation LAngleLoc, 2803 TypeSourceInfo *TInfo, 2804 SourceLocation RAngleLoc, 2805 SourceLocation LParenLoc, 2806 Expr *SubExpr, 2807 SourceLocation RParenLoc) { 2808 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2809 TInfo, SubExpr, 2810 SourceRange(LAngleLoc, RAngleLoc), 2811 SourceRange(LParenLoc, RParenLoc)); 2812 } 2813 2814 /// Build a new C++ reinterpret_cast expression. 2815 /// 2816 /// By default, performs semantic analysis to build the new expression. 2817 /// Subclasses may override this routine to provide different behavior. 2818 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2819 SourceLocation LAngleLoc, 2820 TypeSourceInfo *TInfo, 2821 SourceLocation RAngleLoc, 2822 SourceLocation LParenLoc, 2823 Expr *SubExpr, 2824 SourceLocation RParenLoc) { 2825 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2826 TInfo, SubExpr, 2827 SourceRange(LAngleLoc, RAngleLoc), 2828 SourceRange(LParenLoc, RParenLoc)); 2829 } 2830 2831 /// Build a new C++ const_cast expression. 2832 /// 2833 /// By default, performs semantic analysis to build the new expression. 2834 /// Subclasses may override this routine to provide different behavior. 2835 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2836 SourceLocation LAngleLoc, 2837 TypeSourceInfo *TInfo, 2838 SourceLocation RAngleLoc, 2839 SourceLocation LParenLoc, 2840 Expr *SubExpr, 2841 SourceLocation RParenLoc) { 2842 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2843 TInfo, SubExpr, 2844 SourceRange(LAngleLoc, RAngleLoc), 2845 SourceRange(LParenLoc, RParenLoc)); 2846 } 2847 2848 ExprResult 2849 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2850 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2851 SourceLocation LParenLoc, Expr *SubExpr, 2852 SourceLocation RParenLoc) { 2853 return getSema().BuildCXXNamedCast( 2854 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2855 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2856 } 2857 2858 /// Build a new C++ functional-style cast expression. 2859 /// 2860 /// By default, performs semantic analysis to build the new expression. 2861 /// Subclasses may override this routine to provide different behavior. 2862 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2863 SourceLocation LParenLoc, 2864 Expr *Sub, 2865 SourceLocation RParenLoc, 2866 bool ListInitialization) { 2867 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2868 MultiExprArg(&Sub, 1), RParenLoc, 2869 ListInitialization); 2870 } 2871 2872 /// Build a new C++ __builtin_bit_cast expression. 2873 /// 2874 /// By default, performs semantic analysis to build the new expression. 2875 /// Subclasses may override this routine to provide different behavior. 2876 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2877 TypeSourceInfo *TSI, Expr *Sub, 2878 SourceLocation RParenLoc) { 2879 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2880 } 2881 2882 /// Build a new C++ typeid(type) 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 RebuildCXXTypeidExpr(QualType TypeInfoType, 2887 SourceLocation TypeidLoc, 2888 TypeSourceInfo *Operand, 2889 SourceLocation RParenLoc) { 2890 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2891 RParenLoc); 2892 } 2893 2894 2895 /// Build a new C++ typeid(expr) expression. 2896 /// 2897 /// By default, performs semantic analysis to build the new expression. 2898 /// Subclasses may override this routine to provide different behavior. 2899 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2900 SourceLocation TypeidLoc, 2901 Expr *Operand, 2902 SourceLocation RParenLoc) { 2903 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2904 RParenLoc); 2905 } 2906 2907 /// Build a new C++ __uuidof(type) expression. 2908 /// 2909 /// By default, performs semantic analysis to build the new expression. 2910 /// Subclasses may override this routine to provide different behavior. 2911 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2912 TypeSourceInfo *Operand, 2913 SourceLocation RParenLoc) { 2914 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2915 } 2916 2917 /// Build a new C++ __uuidof(expr) expression. 2918 /// 2919 /// By default, performs semantic analysis to build the new expression. 2920 /// Subclasses may override this routine to provide different behavior. 2921 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2922 Expr *Operand, SourceLocation RParenLoc) { 2923 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2924 } 2925 2926 /// Build a new C++ "this" expression. 2927 /// 2928 /// By default, builds a new "this" expression without performing any 2929 /// semantic analysis. Subclasses may override this routine to provide 2930 /// different behavior. 2931 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2932 QualType ThisType, 2933 bool isImplicit) { 2934 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2935 } 2936 2937 /// Build a new C++ throw expression. 2938 /// 2939 /// By default, performs semantic analysis to build the new expression. 2940 /// Subclasses may override this routine to provide different behavior. 2941 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2942 bool IsThrownVariableInScope) { 2943 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2944 } 2945 2946 /// Build a new C++ default-argument expression. 2947 /// 2948 /// By default, builds a new default-argument expression, which does not 2949 /// require any semantic analysis. Subclasses may override this routine to 2950 /// provide different behavior. 2951 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2952 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2953 getSema().CurContext); 2954 } 2955 2956 /// Build a new C++11 default-initialization expression. 2957 /// 2958 /// By default, builds a new default field initialization expression, which 2959 /// does not require any semantic analysis. Subclasses may override this 2960 /// routine to provide different behavior. 2961 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2962 FieldDecl *Field) { 2963 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2964 getSema().CurContext); 2965 } 2966 2967 /// Build a new C++ zero-initialization expression. 2968 /// 2969 /// By default, performs semantic analysis to build the new expression. 2970 /// Subclasses may override this routine to provide different behavior. 2971 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2972 SourceLocation LParenLoc, 2973 SourceLocation RParenLoc) { 2974 return getSema().BuildCXXTypeConstructExpr( 2975 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2976 } 2977 2978 /// Build a new C++ "new" expression. 2979 /// 2980 /// By default, performs semantic analysis to build the new expression. 2981 /// Subclasses may override this routine to provide different behavior. 2982 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2983 bool UseGlobal, 2984 SourceLocation PlacementLParen, 2985 MultiExprArg PlacementArgs, 2986 SourceLocation PlacementRParen, 2987 SourceRange TypeIdParens, 2988 QualType AllocatedType, 2989 TypeSourceInfo *AllocatedTypeInfo, 2990 Optional<Expr *> ArraySize, 2991 SourceRange DirectInitRange, 2992 Expr *Initializer) { 2993 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2994 PlacementLParen, 2995 PlacementArgs, 2996 PlacementRParen, 2997 TypeIdParens, 2998 AllocatedType, 2999 AllocatedTypeInfo, 3000 ArraySize, 3001 DirectInitRange, 3002 Initializer); 3003 } 3004 3005 /// Build a new C++ "delete" expression. 3006 /// 3007 /// By default, performs semantic analysis to build the new expression. 3008 /// Subclasses may override this routine to provide different behavior. 3009 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3010 bool IsGlobalDelete, 3011 bool IsArrayForm, 3012 Expr *Operand) { 3013 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3014 Operand); 3015 } 3016 3017 /// Build a new type trait expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildTypeTrait(TypeTrait Trait, 3022 SourceLocation StartLoc, 3023 ArrayRef<TypeSourceInfo *> Args, 3024 SourceLocation RParenLoc) { 3025 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3026 } 3027 3028 /// Build a new array type trait expression. 3029 /// 3030 /// By default, performs semantic analysis to build the new expression. 3031 /// Subclasses may override this routine to provide different behavior. 3032 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3033 SourceLocation StartLoc, 3034 TypeSourceInfo *TSInfo, 3035 Expr *DimExpr, 3036 SourceLocation RParenLoc) { 3037 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3038 } 3039 3040 /// Build a new expression trait expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3045 SourceLocation StartLoc, 3046 Expr *Queried, 3047 SourceLocation RParenLoc) { 3048 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3049 } 3050 3051 /// Build a new (previously unresolved) declaration reference 3052 /// expression. 3053 /// 3054 /// By default, performs semantic analysis to build the new expression. 3055 /// Subclasses may override this routine to provide different behavior. 3056 ExprResult RebuildDependentScopeDeclRefExpr( 3057 NestedNameSpecifierLoc QualifierLoc, 3058 SourceLocation TemplateKWLoc, 3059 const DeclarationNameInfo &NameInfo, 3060 const TemplateArgumentListInfo *TemplateArgs, 3061 bool IsAddressOfOperand, 3062 TypeSourceInfo **RecoveryTSI) { 3063 CXXScopeSpec SS; 3064 SS.Adopt(QualifierLoc); 3065 3066 if (TemplateArgs || TemplateKWLoc.isValid()) 3067 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3068 TemplateArgs); 3069 3070 return getSema().BuildQualifiedDeclarationNameExpr( 3071 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3072 } 3073 3074 /// Build a new template-id expression. 3075 /// 3076 /// By default, performs semantic analysis to build the new expression. 3077 /// Subclasses may override this routine to provide different behavior. 3078 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3079 SourceLocation TemplateKWLoc, 3080 LookupResult &R, 3081 bool RequiresADL, 3082 const TemplateArgumentListInfo *TemplateArgs) { 3083 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3084 TemplateArgs); 3085 } 3086 3087 /// Build a new object-construction expression. 3088 /// 3089 /// By default, performs semantic analysis to build the new expression. 3090 /// Subclasses may override this routine to provide different behavior. 3091 ExprResult RebuildCXXConstructExpr(QualType T, 3092 SourceLocation Loc, 3093 CXXConstructorDecl *Constructor, 3094 bool IsElidable, 3095 MultiExprArg Args, 3096 bool HadMultipleCandidates, 3097 bool ListInitialization, 3098 bool StdInitListInitialization, 3099 bool RequiresZeroInit, 3100 CXXConstructExpr::ConstructionKind ConstructKind, 3101 SourceRange ParenRange) { 3102 // Reconstruct the constructor we originally found, which might be 3103 // different if this is a call to an inherited constructor. 3104 CXXConstructorDecl *FoundCtor = Constructor; 3105 if (Constructor->isInheritingConstructor()) 3106 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3107 3108 SmallVector<Expr*, 8> ConvertedArgs; 3109 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3110 return ExprError(); 3111 3112 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3113 IsElidable, 3114 ConvertedArgs, 3115 HadMultipleCandidates, 3116 ListInitialization, 3117 StdInitListInitialization, 3118 RequiresZeroInit, ConstructKind, 3119 ParenRange); 3120 } 3121 3122 /// Build a new implicit construction via inherited constructor 3123 /// expression. 3124 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3125 CXXConstructorDecl *Constructor, 3126 bool ConstructsVBase, 3127 bool InheritedFromVBase) { 3128 return new (getSema().Context) CXXInheritedCtorInitExpr( 3129 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3130 } 3131 3132 /// Build a new object-construction expression. 3133 /// 3134 /// By default, performs semantic analysis to build the new expression. 3135 /// Subclasses may override this routine to provide different behavior. 3136 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3137 SourceLocation LParenOrBraceLoc, 3138 MultiExprArg Args, 3139 SourceLocation RParenOrBraceLoc, 3140 bool ListInitialization) { 3141 return getSema().BuildCXXTypeConstructExpr( 3142 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3143 } 3144 3145 /// Build a new object-construction expression. 3146 /// 3147 /// By default, performs semantic analysis to build the new expression. 3148 /// Subclasses may override this routine to provide different behavior. 3149 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3150 SourceLocation LParenLoc, 3151 MultiExprArg Args, 3152 SourceLocation RParenLoc, 3153 bool ListInitialization) { 3154 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3155 RParenLoc, ListInitialization); 3156 } 3157 3158 /// Build a new member reference expression. 3159 /// 3160 /// By default, performs semantic analysis to build the new expression. 3161 /// Subclasses may override this routine to provide different behavior. 3162 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3163 QualType BaseType, 3164 bool IsArrow, 3165 SourceLocation OperatorLoc, 3166 NestedNameSpecifierLoc QualifierLoc, 3167 SourceLocation TemplateKWLoc, 3168 NamedDecl *FirstQualifierInScope, 3169 const DeclarationNameInfo &MemberNameInfo, 3170 const TemplateArgumentListInfo *TemplateArgs) { 3171 CXXScopeSpec SS; 3172 SS.Adopt(QualifierLoc); 3173 3174 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3175 OperatorLoc, IsArrow, 3176 SS, TemplateKWLoc, 3177 FirstQualifierInScope, 3178 MemberNameInfo, 3179 TemplateArgs, /*S*/nullptr); 3180 } 3181 3182 /// Build a new member reference expression. 3183 /// 3184 /// By default, performs semantic analysis to build the new expression. 3185 /// Subclasses may override this routine to provide different behavior. 3186 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3187 SourceLocation OperatorLoc, 3188 bool IsArrow, 3189 NestedNameSpecifierLoc QualifierLoc, 3190 SourceLocation TemplateKWLoc, 3191 NamedDecl *FirstQualifierInScope, 3192 LookupResult &R, 3193 const TemplateArgumentListInfo *TemplateArgs) { 3194 CXXScopeSpec SS; 3195 SS.Adopt(QualifierLoc); 3196 3197 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3198 OperatorLoc, IsArrow, 3199 SS, TemplateKWLoc, 3200 FirstQualifierInScope, 3201 R, TemplateArgs, /*S*/nullptr); 3202 } 3203 3204 /// Build a new noexcept expression. 3205 /// 3206 /// By default, performs semantic analysis to build the new expression. 3207 /// Subclasses may override this routine to provide different behavior. 3208 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3209 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3210 } 3211 3212 /// Build a new expression to compute the length of a parameter pack. 3213 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3214 NamedDecl *Pack, 3215 SourceLocation PackLoc, 3216 SourceLocation RParenLoc, 3217 Optional<unsigned> Length, 3218 ArrayRef<TemplateArgument> PartialArgs) { 3219 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3220 RParenLoc, Length, PartialArgs); 3221 } 3222 3223 /// Build a new expression representing a call to a source location 3224 /// builtin. 3225 /// 3226 /// By default, performs semantic analysis to build the new expression. 3227 /// Subclasses may override this routine to provide different behavior. 3228 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3229 SourceLocation BuiltinLoc, 3230 SourceLocation RPLoc, 3231 DeclContext *ParentContext) { 3232 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3233 } 3234 3235 /// Build a new Objective-C boxed expression. 3236 /// 3237 /// By default, performs semantic analysis to build the new expression. 3238 /// Subclasses may override this routine to provide different behavior. 3239 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3240 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3241 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3242 TemplateArgumentListInfo *TALI) { 3243 CXXScopeSpec SS; 3244 SS.Adopt(NNS); 3245 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3246 ConceptNameInfo, 3247 FoundDecl, 3248 NamedConcept, TALI); 3249 if (Result.isInvalid()) 3250 return ExprError(); 3251 return Result; 3252 } 3253 3254 /// \brief Build a new requires expression. 3255 /// 3256 /// By default, performs semantic analysis to build the new expression. 3257 /// Subclasses may override this routine to provide different behavior. 3258 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3259 RequiresExprBodyDecl *Body, 3260 ArrayRef<ParmVarDecl *> LocalParameters, 3261 ArrayRef<concepts::Requirement *> Requirements, 3262 SourceLocation ClosingBraceLoc) { 3263 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3264 LocalParameters, Requirements, ClosingBraceLoc); 3265 } 3266 3267 concepts::TypeRequirement * 3268 RebuildTypeRequirement( 3269 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3270 return SemaRef.BuildTypeRequirement(SubstDiag); 3271 } 3272 3273 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3274 return SemaRef.BuildTypeRequirement(T); 3275 } 3276 3277 concepts::ExprRequirement * 3278 RebuildExprRequirement( 3279 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3280 SourceLocation NoexceptLoc, 3281 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3282 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3283 std::move(Ret)); 3284 } 3285 3286 concepts::ExprRequirement * 3287 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3288 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3289 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3290 std::move(Ret)); 3291 } 3292 3293 concepts::NestedRequirement * 3294 RebuildNestedRequirement( 3295 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3296 return SemaRef.BuildNestedRequirement(SubstDiag); 3297 } 3298 3299 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3300 return SemaRef.BuildNestedRequirement(Constraint); 3301 } 3302 3303 /// \brief Build a new Objective-C boxed expression. 3304 /// 3305 /// By default, performs semantic analysis to build the new expression. 3306 /// Subclasses may override this routine to provide different behavior. 3307 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3308 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3309 } 3310 3311 /// Build a new Objective-C array literal. 3312 /// 3313 /// By default, performs semantic analysis to build the new expression. 3314 /// Subclasses may override this routine to provide different behavior. 3315 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3316 Expr **Elements, unsigned NumElements) { 3317 return getSema().BuildObjCArrayLiteral(Range, 3318 MultiExprArg(Elements, NumElements)); 3319 } 3320 3321 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3322 Expr *Base, Expr *Key, 3323 ObjCMethodDecl *getterMethod, 3324 ObjCMethodDecl *setterMethod) { 3325 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3326 getterMethod, setterMethod); 3327 } 3328 3329 /// Build a new Objective-C dictionary literal. 3330 /// 3331 /// By default, performs semantic analysis to build the new expression. 3332 /// Subclasses may override this routine to provide different behavior. 3333 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3334 MutableArrayRef<ObjCDictionaryElement> Elements) { 3335 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3336 } 3337 3338 /// Build a new Objective-C \@encode expression. 3339 /// 3340 /// By default, performs semantic analysis to build the new expression. 3341 /// Subclasses may override this routine to provide different behavior. 3342 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3343 TypeSourceInfo *EncodeTypeInfo, 3344 SourceLocation RParenLoc) { 3345 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3346 } 3347 3348 /// Build a new Objective-C class message. 3349 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3350 Selector Sel, 3351 ArrayRef<SourceLocation> SelectorLocs, 3352 ObjCMethodDecl *Method, 3353 SourceLocation LBracLoc, 3354 MultiExprArg Args, 3355 SourceLocation RBracLoc) { 3356 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3357 ReceiverTypeInfo->getType(), 3358 /*SuperLoc=*/SourceLocation(), 3359 Sel, Method, LBracLoc, SelectorLocs, 3360 RBracLoc, Args); 3361 } 3362 3363 /// Build a new Objective-C instance message. 3364 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3365 Selector Sel, 3366 ArrayRef<SourceLocation> SelectorLocs, 3367 ObjCMethodDecl *Method, 3368 SourceLocation LBracLoc, 3369 MultiExprArg Args, 3370 SourceLocation RBracLoc) { 3371 return SemaRef.BuildInstanceMessage(Receiver, 3372 Receiver->getType(), 3373 /*SuperLoc=*/SourceLocation(), 3374 Sel, Method, LBracLoc, SelectorLocs, 3375 RBracLoc, Args); 3376 } 3377 3378 /// Build a new Objective-C instance/class message to 'super'. 3379 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3380 Selector Sel, 3381 ArrayRef<SourceLocation> SelectorLocs, 3382 QualType SuperType, 3383 ObjCMethodDecl *Method, 3384 SourceLocation LBracLoc, 3385 MultiExprArg Args, 3386 SourceLocation RBracLoc) { 3387 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3388 SuperType, 3389 SuperLoc, 3390 Sel, Method, LBracLoc, SelectorLocs, 3391 RBracLoc, Args) 3392 : SemaRef.BuildClassMessage(nullptr, 3393 SuperType, 3394 SuperLoc, 3395 Sel, Method, LBracLoc, SelectorLocs, 3396 RBracLoc, Args); 3397 3398 3399 } 3400 3401 /// Build a new Objective-C ivar reference expression. 3402 /// 3403 /// By default, performs semantic analysis to build the new expression. 3404 /// Subclasses may override this routine to provide different behavior. 3405 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3406 SourceLocation IvarLoc, 3407 bool IsArrow, bool IsFreeIvar) { 3408 CXXScopeSpec SS; 3409 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3410 ExprResult Result = getSema().BuildMemberReferenceExpr( 3411 BaseArg, BaseArg->getType(), 3412 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3413 /*FirstQualifierInScope=*/nullptr, NameInfo, 3414 /*TemplateArgs=*/nullptr, 3415 /*S=*/nullptr); 3416 if (IsFreeIvar && Result.isUsable()) 3417 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3418 return Result; 3419 } 3420 3421 /// Build a new Objective-C property reference expression. 3422 /// 3423 /// By default, performs semantic analysis to build the new expression. 3424 /// Subclasses may override this routine to provide different behavior. 3425 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3426 ObjCPropertyDecl *Property, 3427 SourceLocation PropertyLoc) { 3428 CXXScopeSpec SS; 3429 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3430 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3431 /*FIXME:*/PropertyLoc, 3432 /*IsArrow=*/false, 3433 SS, SourceLocation(), 3434 /*FirstQualifierInScope=*/nullptr, 3435 NameInfo, 3436 /*TemplateArgs=*/nullptr, 3437 /*S=*/nullptr); 3438 } 3439 3440 /// Build a new Objective-C property reference expression. 3441 /// 3442 /// By default, performs semantic analysis to build the new expression. 3443 /// Subclasses may override this routine to provide different behavior. 3444 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3445 ObjCMethodDecl *Getter, 3446 ObjCMethodDecl *Setter, 3447 SourceLocation PropertyLoc) { 3448 // Since these expressions can only be value-dependent, we do not 3449 // need to perform semantic analysis again. 3450 return Owned( 3451 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3452 VK_LValue, OK_ObjCProperty, 3453 PropertyLoc, Base)); 3454 } 3455 3456 /// Build a new Objective-C "isa" expression. 3457 /// 3458 /// By default, performs semantic analysis to build the new expression. 3459 /// Subclasses may override this routine to provide different behavior. 3460 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3461 SourceLocation OpLoc, bool IsArrow) { 3462 CXXScopeSpec SS; 3463 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3464 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3465 OpLoc, IsArrow, 3466 SS, SourceLocation(), 3467 /*FirstQualifierInScope=*/nullptr, 3468 NameInfo, 3469 /*TemplateArgs=*/nullptr, 3470 /*S=*/nullptr); 3471 } 3472 3473 /// Build a new shuffle vector expression. 3474 /// 3475 /// By default, performs semantic analysis to build the new expression. 3476 /// Subclasses may override this routine to provide different behavior. 3477 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3478 MultiExprArg SubExprs, 3479 SourceLocation RParenLoc) { 3480 // Find the declaration for __builtin_shufflevector 3481 const IdentifierInfo &Name 3482 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3483 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3484 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3485 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3486 3487 // Build a reference to the __builtin_shufflevector builtin 3488 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3489 Expr *Callee = new (SemaRef.Context) 3490 DeclRefExpr(SemaRef.Context, Builtin, false, 3491 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3492 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3493 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3494 CK_BuiltinFnToFnPtr).get(); 3495 3496 // Build the CallExpr 3497 ExprResult TheCall = CallExpr::Create( 3498 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3499 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3500 3501 // Type-check the __builtin_shufflevector expression. 3502 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3503 } 3504 3505 /// Build a new convert vector expression. 3506 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3507 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3508 SourceLocation RParenLoc) { 3509 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3510 BuiltinLoc, RParenLoc); 3511 } 3512 3513 /// Build a new template argument pack expansion. 3514 /// 3515 /// By default, performs semantic analysis to build a new pack expansion 3516 /// for a template argument. Subclasses may override this routine to provide 3517 /// different behavior. 3518 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3519 SourceLocation EllipsisLoc, 3520 Optional<unsigned> NumExpansions) { 3521 switch (Pattern.getArgument().getKind()) { 3522 case TemplateArgument::Expression: { 3523 ExprResult Result 3524 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3525 EllipsisLoc, NumExpansions); 3526 if (Result.isInvalid()) 3527 return TemplateArgumentLoc(); 3528 3529 return TemplateArgumentLoc(Result.get(), Result.get()); 3530 } 3531 3532 case TemplateArgument::Template: 3533 return TemplateArgumentLoc(TemplateArgument( 3534 Pattern.getArgument().getAsTemplate(), 3535 NumExpansions), 3536 Pattern.getTemplateQualifierLoc(), 3537 Pattern.getTemplateNameLoc(), 3538 EllipsisLoc); 3539 3540 case TemplateArgument::Null: 3541 case TemplateArgument::Integral: 3542 case TemplateArgument::Declaration: 3543 case TemplateArgument::Pack: 3544 case TemplateArgument::TemplateExpansion: 3545 case TemplateArgument::NullPtr: 3546 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3547 3548 case TemplateArgument::Type: 3549 if (TypeSourceInfo *Expansion 3550 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3551 EllipsisLoc, 3552 NumExpansions)) 3553 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3554 Expansion); 3555 break; 3556 } 3557 3558 return TemplateArgumentLoc(); 3559 } 3560 3561 /// Build a new expression pack expansion. 3562 /// 3563 /// By default, performs semantic analysis to build a new pack expansion 3564 /// for an expression. Subclasses may override this routine to provide 3565 /// different behavior. 3566 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3567 Optional<unsigned> NumExpansions) { 3568 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3569 } 3570 3571 /// Build a new C++1z fold-expression. 3572 /// 3573 /// By default, performs semantic analysis in order to build a new fold 3574 /// expression. 3575 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3576 BinaryOperatorKind Operator, 3577 SourceLocation EllipsisLoc, Expr *RHS, 3578 SourceLocation RParenLoc, 3579 Optional<unsigned> NumExpansions) { 3580 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3581 RHS, RParenLoc, NumExpansions); 3582 } 3583 3584 /// Build an empty C++1z fold-expression with the given operator. 3585 /// 3586 /// By default, produces the fallback value for the fold-expression, or 3587 /// produce an error if there is no fallback value. 3588 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3589 BinaryOperatorKind Operator) { 3590 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3591 } 3592 3593 /// Build a new atomic operation expression. 3594 /// 3595 /// By default, performs semantic analysis to build the new expression. 3596 /// Subclasses may override this routine to provide different behavior. 3597 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3598 AtomicExpr::AtomicOp Op, 3599 SourceLocation RParenLoc) { 3600 // Use this for all of the locations, since we don't know the difference 3601 // between the call and the expr at this point. 3602 SourceRange Range{BuiltinLoc, RParenLoc}; 3603 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3604 Sema::AtomicArgumentOrder::AST); 3605 } 3606 3607 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3608 ArrayRef<Expr *> SubExprs) { 3609 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs); 3610 } 3611 3612 private: 3613 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3614 QualType ObjectType, 3615 NamedDecl *FirstQualifierInScope, 3616 CXXScopeSpec &SS); 3617 3618 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3619 QualType ObjectType, 3620 NamedDecl *FirstQualifierInScope, 3621 CXXScopeSpec &SS); 3622 3623 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3624 NamedDecl *FirstQualifierInScope, 3625 CXXScopeSpec &SS); 3626 3627 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3628 DependentNameTypeLoc TL, 3629 bool DeducibleTSTContext); 3630 }; 3631 3632 template <typename Derived> 3633 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3634 if (!S) 3635 return S; 3636 3637 switch (S->getStmtClass()) { 3638 case Stmt::NoStmtClass: break; 3639 3640 // Transform individual statement nodes 3641 // Pass SDK into statements that can produce a value 3642 #define STMT(Node, Parent) \ 3643 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3644 #define VALUESTMT(Node, Parent) \ 3645 case Stmt::Node##Class: \ 3646 return getDerived().Transform##Node(cast<Node>(S), SDK); 3647 #define ABSTRACT_STMT(Node) 3648 #define EXPR(Node, Parent) 3649 #include "clang/AST/StmtNodes.inc" 3650 3651 // Transform expressions by calling TransformExpr. 3652 #define STMT(Node, Parent) 3653 #define ABSTRACT_STMT(Stmt) 3654 #define EXPR(Node, Parent) case Stmt::Node##Class: 3655 #include "clang/AST/StmtNodes.inc" 3656 { 3657 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3658 3659 if (SDK == SDK_StmtExprResult) 3660 E = getSema().ActOnStmtExprResult(E); 3661 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3662 } 3663 } 3664 3665 return S; 3666 } 3667 3668 template<typename Derived> 3669 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3670 if (!S) 3671 return S; 3672 3673 switch (S->getClauseKind()) { 3674 default: break; 3675 // Transform individual clause nodes 3676 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3677 case Enum: \ 3678 return getDerived().Transform ## Class(cast<Class>(S)); 3679 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3680 } 3681 3682 return S; 3683 } 3684 3685 3686 template<typename Derived> 3687 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3688 if (!E) 3689 return E; 3690 3691 switch (E->getStmtClass()) { 3692 case Stmt::NoStmtClass: break; 3693 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3694 #define ABSTRACT_STMT(Stmt) 3695 #define EXPR(Node, Parent) \ 3696 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3697 #include "clang/AST/StmtNodes.inc" 3698 } 3699 3700 return E; 3701 } 3702 3703 template<typename Derived> 3704 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3705 bool NotCopyInit) { 3706 // Initializers are instantiated like expressions, except that various outer 3707 // layers are stripped. 3708 if (!Init) 3709 return Init; 3710 3711 if (auto *FE = dyn_cast<FullExpr>(Init)) 3712 Init = FE->getSubExpr(); 3713 3714 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3715 Init = AIL->getCommonExpr(); 3716 3717 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3718 Init = MTE->getSubExpr(); 3719 3720 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3721 Init = Binder->getSubExpr(); 3722 3723 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3724 Init = ICE->getSubExprAsWritten(); 3725 3726 if (CXXStdInitializerListExpr *ILE = 3727 dyn_cast<CXXStdInitializerListExpr>(Init)) 3728 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3729 3730 // If this is copy-initialization, we only need to reconstruct 3731 // InitListExprs. Other forms of copy-initialization will be a no-op if 3732 // the initializer is already the right type. 3733 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3734 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3735 return getDerived().TransformExpr(Init); 3736 3737 // Revert value-initialization back to empty parens. 3738 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3739 SourceRange Parens = VIE->getSourceRange(); 3740 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3741 Parens.getEnd()); 3742 } 3743 3744 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3745 if (isa<ImplicitValueInitExpr>(Init)) 3746 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3747 SourceLocation()); 3748 3749 // Revert initialization by constructor back to a parenthesized or braced list 3750 // of expressions. Any other form of initializer can just be reused directly. 3751 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3752 return getDerived().TransformExpr(Init); 3753 3754 // If the initialization implicitly converted an initializer list to a 3755 // std::initializer_list object, unwrap the std::initializer_list too. 3756 if (Construct && Construct->isStdInitListInitialization()) 3757 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3758 3759 // Enter a list-init context if this was list initialization. 3760 EnterExpressionEvaluationContext Context( 3761 getSema(), EnterExpressionEvaluationContext::InitList, 3762 Construct->isListInitialization()); 3763 3764 SmallVector<Expr*, 8> NewArgs; 3765 bool ArgChanged = false; 3766 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3767 /*IsCall*/true, NewArgs, &ArgChanged)) 3768 return ExprError(); 3769 3770 // If this was list initialization, revert to syntactic list form. 3771 if (Construct->isListInitialization()) 3772 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3773 Construct->getEndLoc()); 3774 3775 // Build a ParenListExpr to represent anything else. 3776 SourceRange Parens = Construct->getParenOrBraceRange(); 3777 if (Parens.isInvalid()) { 3778 // This was a variable declaration's initialization for which no initializer 3779 // was specified. 3780 assert(NewArgs.empty() && 3781 "no parens or braces but have direct init with arguments?"); 3782 return ExprEmpty(); 3783 } 3784 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3785 Parens.getEnd()); 3786 } 3787 3788 template<typename Derived> 3789 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3790 unsigned NumInputs, 3791 bool IsCall, 3792 SmallVectorImpl<Expr *> &Outputs, 3793 bool *ArgChanged) { 3794 for (unsigned I = 0; I != NumInputs; ++I) { 3795 // If requested, drop call arguments that need to be dropped. 3796 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3797 if (ArgChanged) 3798 *ArgChanged = true; 3799 3800 break; 3801 } 3802 3803 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3804 Expr *Pattern = Expansion->getPattern(); 3805 3806 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3807 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3808 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3809 3810 // Determine whether the set of unexpanded parameter packs can and should 3811 // be expanded. 3812 bool Expand = true; 3813 bool RetainExpansion = false; 3814 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3815 Optional<unsigned> NumExpansions = OrigNumExpansions; 3816 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3817 Pattern->getSourceRange(), 3818 Unexpanded, 3819 Expand, RetainExpansion, 3820 NumExpansions)) 3821 return true; 3822 3823 if (!Expand) { 3824 // The transform has determined that we should perform a simple 3825 // transformation on the pack expansion, producing another pack 3826 // expansion. 3827 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3828 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3829 if (OutPattern.isInvalid()) 3830 return true; 3831 3832 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3833 Expansion->getEllipsisLoc(), 3834 NumExpansions); 3835 if (Out.isInvalid()) 3836 return true; 3837 3838 if (ArgChanged) 3839 *ArgChanged = true; 3840 Outputs.push_back(Out.get()); 3841 continue; 3842 } 3843 3844 // Record right away that the argument was changed. This needs 3845 // to happen even if the array expands to nothing. 3846 if (ArgChanged) *ArgChanged = true; 3847 3848 // The transform has determined that we should perform an elementwise 3849 // expansion of the pattern. Do so. 3850 for (unsigned I = 0; I != *NumExpansions; ++I) { 3851 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3852 ExprResult Out = getDerived().TransformExpr(Pattern); 3853 if (Out.isInvalid()) 3854 return true; 3855 3856 if (Out.get()->containsUnexpandedParameterPack()) { 3857 Out = getDerived().RebuildPackExpansion( 3858 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3859 if (Out.isInvalid()) 3860 return true; 3861 } 3862 3863 Outputs.push_back(Out.get()); 3864 } 3865 3866 // If we're supposed to retain a pack expansion, do so by temporarily 3867 // forgetting the partially-substituted parameter pack. 3868 if (RetainExpansion) { 3869 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3870 3871 ExprResult Out = getDerived().TransformExpr(Pattern); 3872 if (Out.isInvalid()) 3873 return true; 3874 3875 Out = getDerived().RebuildPackExpansion( 3876 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3877 if (Out.isInvalid()) 3878 return true; 3879 3880 Outputs.push_back(Out.get()); 3881 } 3882 3883 continue; 3884 } 3885 3886 ExprResult Result = 3887 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3888 : getDerived().TransformExpr(Inputs[I]); 3889 if (Result.isInvalid()) 3890 return true; 3891 3892 if (Result.get() != Inputs[I] && ArgChanged) 3893 *ArgChanged = true; 3894 3895 Outputs.push_back(Result.get()); 3896 } 3897 3898 return false; 3899 } 3900 3901 template <typename Derived> 3902 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3903 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3904 if (Var) { 3905 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3906 getDerived().TransformDefinition(Var->getLocation(), Var)); 3907 3908 if (!ConditionVar) 3909 return Sema::ConditionError(); 3910 3911 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3912 } 3913 3914 if (Expr) { 3915 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3916 3917 if (CondExpr.isInvalid()) 3918 return Sema::ConditionError(); 3919 3920 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3921 } 3922 3923 return Sema::ConditionResult(); 3924 } 3925 3926 template<typename Derived> 3927 NestedNameSpecifierLoc 3928 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3929 NestedNameSpecifierLoc NNS, 3930 QualType ObjectType, 3931 NamedDecl *FirstQualifierInScope) { 3932 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3933 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3934 Qualifier = Qualifier.getPrefix()) 3935 Qualifiers.push_back(Qualifier); 3936 3937 CXXScopeSpec SS; 3938 while (!Qualifiers.empty()) { 3939 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3940 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3941 3942 switch (QNNS->getKind()) { 3943 case NestedNameSpecifier::Identifier: { 3944 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3945 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3946 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3947 SS, FirstQualifierInScope, false)) 3948 return NestedNameSpecifierLoc(); 3949 } 3950 break; 3951 3952 case NestedNameSpecifier::Namespace: { 3953 NamespaceDecl *NS 3954 = cast_or_null<NamespaceDecl>( 3955 getDerived().TransformDecl( 3956 Q.getLocalBeginLoc(), 3957 QNNS->getAsNamespace())); 3958 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3959 break; 3960 } 3961 3962 case NestedNameSpecifier::NamespaceAlias: { 3963 NamespaceAliasDecl *Alias 3964 = cast_or_null<NamespaceAliasDecl>( 3965 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3966 QNNS->getAsNamespaceAlias())); 3967 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3968 Q.getLocalEndLoc()); 3969 break; 3970 } 3971 3972 case NestedNameSpecifier::Global: 3973 // There is no meaningful transformation that one could perform on the 3974 // global scope. 3975 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3976 break; 3977 3978 case NestedNameSpecifier::Super: { 3979 CXXRecordDecl *RD = 3980 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3981 SourceLocation(), QNNS->getAsRecordDecl())); 3982 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3983 break; 3984 } 3985 3986 case NestedNameSpecifier::TypeSpecWithTemplate: 3987 case NestedNameSpecifier::TypeSpec: { 3988 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3989 FirstQualifierInScope, SS); 3990 3991 if (!TL) 3992 return NestedNameSpecifierLoc(); 3993 3994 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3995 (SemaRef.getLangOpts().CPlusPlus11 && 3996 TL.getType()->isEnumeralType())) { 3997 assert(!TL.getType().hasLocalQualifiers() && 3998 "Can't get cv-qualifiers here"); 3999 if (TL.getType()->isEnumeralType()) 4000 SemaRef.Diag(TL.getBeginLoc(), 4001 diag::warn_cxx98_compat_enum_nested_name_spec); 4002 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4003 Q.getLocalEndLoc()); 4004 break; 4005 } 4006 // If the nested-name-specifier is an invalid type def, don't emit an 4007 // error because a previous error should have already been emitted. 4008 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4009 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4010 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4011 << TL.getType() << SS.getRange(); 4012 } 4013 return NestedNameSpecifierLoc(); 4014 } 4015 } 4016 4017 // The qualifier-in-scope and object type only apply to the leftmost entity. 4018 FirstQualifierInScope = nullptr; 4019 ObjectType = QualType(); 4020 } 4021 4022 // Don't rebuild the nested-name-specifier if we don't have to. 4023 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4024 !getDerived().AlwaysRebuild()) 4025 return NNS; 4026 4027 // If we can re-use the source-location data from the original 4028 // nested-name-specifier, do so. 4029 if (SS.location_size() == NNS.getDataLength() && 4030 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4031 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4032 4033 // Allocate new nested-name-specifier location information. 4034 return SS.getWithLocInContext(SemaRef.Context); 4035 } 4036 4037 template<typename Derived> 4038 DeclarationNameInfo 4039 TreeTransform<Derived> 4040 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4041 DeclarationName Name = NameInfo.getName(); 4042 if (!Name) 4043 return DeclarationNameInfo(); 4044 4045 switch (Name.getNameKind()) { 4046 case DeclarationName::Identifier: 4047 case DeclarationName::ObjCZeroArgSelector: 4048 case DeclarationName::ObjCOneArgSelector: 4049 case DeclarationName::ObjCMultiArgSelector: 4050 case DeclarationName::CXXOperatorName: 4051 case DeclarationName::CXXLiteralOperatorName: 4052 case DeclarationName::CXXUsingDirective: 4053 return NameInfo; 4054 4055 case DeclarationName::CXXDeductionGuideName: { 4056 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4057 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4058 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4059 if (!NewTemplate) 4060 return DeclarationNameInfo(); 4061 4062 DeclarationNameInfo NewNameInfo(NameInfo); 4063 NewNameInfo.setName( 4064 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4065 return NewNameInfo; 4066 } 4067 4068 case DeclarationName::CXXConstructorName: 4069 case DeclarationName::CXXDestructorName: 4070 case DeclarationName::CXXConversionFunctionName: { 4071 TypeSourceInfo *NewTInfo; 4072 CanQualType NewCanTy; 4073 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4074 NewTInfo = getDerived().TransformType(OldTInfo); 4075 if (!NewTInfo) 4076 return DeclarationNameInfo(); 4077 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4078 } 4079 else { 4080 NewTInfo = nullptr; 4081 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4082 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4083 if (NewT.isNull()) 4084 return DeclarationNameInfo(); 4085 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4086 } 4087 4088 DeclarationName NewName 4089 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4090 NewCanTy); 4091 DeclarationNameInfo NewNameInfo(NameInfo); 4092 NewNameInfo.setName(NewName); 4093 NewNameInfo.setNamedTypeInfo(NewTInfo); 4094 return NewNameInfo; 4095 } 4096 } 4097 4098 llvm_unreachable("Unknown name kind."); 4099 } 4100 4101 template<typename Derived> 4102 TemplateName 4103 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4104 TemplateName Name, 4105 SourceLocation NameLoc, 4106 QualType ObjectType, 4107 NamedDecl *FirstQualifierInScope, 4108 bool AllowInjectedClassName) { 4109 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4110 TemplateDecl *Template = QTN->getTemplateDecl(); 4111 assert(Template && "qualified template name must refer to a template"); 4112 4113 TemplateDecl *TransTemplate 4114 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4115 Template)); 4116 if (!TransTemplate) 4117 return TemplateName(); 4118 4119 if (!getDerived().AlwaysRebuild() && 4120 SS.getScopeRep() == QTN->getQualifier() && 4121 TransTemplate == Template) 4122 return Name; 4123 4124 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4125 TransTemplate); 4126 } 4127 4128 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4129 if (SS.getScopeRep()) { 4130 // These apply to the scope specifier, not the template. 4131 ObjectType = QualType(); 4132 FirstQualifierInScope = nullptr; 4133 } 4134 4135 if (!getDerived().AlwaysRebuild() && 4136 SS.getScopeRep() == DTN->getQualifier() && 4137 ObjectType.isNull()) 4138 return Name; 4139 4140 // FIXME: Preserve the location of the "template" keyword. 4141 SourceLocation TemplateKWLoc = NameLoc; 4142 4143 if (DTN->isIdentifier()) { 4144 return getDerived().RebuildTemplateName(SS, 4145 TemplateKWLoc, 4146 *DTN->getIdentifier(), 4147 NameLoc, 4148 ObjectType, 4149 FirstQualifierInScope, 4150 AllowInjectedClassName); 4151 } 4152 4153 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4154 DTN->getOperator(), NameLoc, 4155 ObjectType, AllowInjectedClassName); 4156 } 4157 4158 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4159 TemplateDecl *TransTemplate 4160 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4161 Template)); 4162 if (!TransTemplate) 4163 return TemplateName(); 4164 4165 if (!getDerived().AlwaysRebuild() && 4166 TransTemplate == Template) 4167 return Name; 4168 4169 return TemplateName(TransTemplate); 4170 } 4171 4172 if (SubstTemplateTemplateParmPackStorage *SubstPack 4173 = Name.getAsSubstTemplateTemplateParmPack()) { 4174 TemplateTemplateParmDecl *TransParam 4175 = cast_or_null<TemplateTemplateParmDecl>( 4176 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4177 if (!TransParam) 4178 return TemplateName(); 4179 4180 if (!getDerived().AlwaysRebuild() && 4181 TransParam == SubstPack->getParameterPack()) 4182 return Name; 4183 4184 return getDerived().RebuildTemplateName(TransParam, 4185 SubstPack->getArgumentPack()); 4186 } 4187 4188 // These should be getting filtered out before they reach the AST. 4189 llvm_unreachable("overloaded function decl survived to here"); 4190 } 4191 4192 template<typename Derived> 4193 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4194 const TemplateArgument &Arg, 4195 TemplateArgumentLoc &Output) { 4196 Output = getSema().getTrivialTemplateArgumentLoc( 4197 Arg, QualType(), getDerived().getBaseLocation()); 4198 } 4199 4200 template<typename Derived> 4201 bool TreeTransform<Derived>::TransformTemplateArgument( 4202 const TemplateArgumentLoc &Input, 4203 TemplateArgumentLoc &Output, bool Uneval) { 4204 const TemplateArgument &Arg = Input.getArgument(); 4205 switch (Arg.getKind()) { 4206 case TemplateArgument::Null: 4207 case TemplateArgument::Pack: 4208 llvm_unreachable("Unexpected TemplateArgument"); 4209 4210 case TemplateArgument::Integral: 4211 case TemplateArgument::NullPtr: 4212 case TemplateArgument::Declaration: { 4213 // Transform a resolved template argument straight to a resolved template 4214 // argument. We get here when substituting into an already-substituted 4215 // template type argument during concept satisfaction checking. 4216 QualType T = Arg.getNonTypeTemplateArgumentType(); 4217 QualType NewT = getDerived().TransformType(T); 4218 if (NewT.isNull()) 4219 return true; 4220 4221 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4222 ? Arg.getAsDecl() 4223 : nullptr; 4224 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4225 getDerived().getBaseLocation(), D)) 4226 : nullptr; 4227 if (D && !NewD) 4228 return true; 4229 4230 if (NewT == T && D == NewD) 4231 Output = Input; 4232 else if (Arg.getKind() == TemplateArgument::Integral) 4233 Output = TemplateArgumentLoc( 4234 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4235 TemplateArgumentLocInfo()); 4236 else if (Arg.getKind() == TemplateArgument::NullPtr) 4237 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4238 TemplateArgumentLocInfo()); 4239 else 4240 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4241 TemplateArgumentLocInfo()); 4242 4243 return false; 4244 } 4245 4246 case TemplateArgument::Type: { 4247 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4248 if (!DI) 4249 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4250 4251 DI = getDerived().TransformType(DI); 4252 if (!DI) return true; 4253 4254 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4255 return false; 4256 } 4257 4258 case TemplateArgument::Template: { 4259 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4260 if (QualifierLoc) { 4261 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4262 if (!QualifierLoc) 4263 return true; 4264 } 4265 4266 CXXScopeSpec SS; 4267 SS.Adopt(QualifierLoc); 4268 TemplateName Template 4269 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4270 Input.getTemplateNameLoc()); 4271 if (Template.isNull()) 4272 return true; 4273 4274 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4275 Input.getTemplateNameLoc()); 4276 return false; 4277 } 4278 4279 case TemplateArgument::TemplateExpansion: 4280 llvm_unreachable("Caller should expand pack expansions"); 4281 4282 case TemplateArgument::Expression: { 4283 // Template argument expressions are constant expressions. 4284 EnterExpressionEvaluationContext Unevaluated( 4285 getSema(), 4286 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4287 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4288 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4289 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4290 4291 Expr *InputExpr = Input.getSourceExpression(); 4292 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4293 4294 ExprResult E = getDerived().TransformExpr(InputExpr); 4295 E = SemaRef.ActOnConstantExpression(E); 4296 if (E.isInvalid()) return true; 4297 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4298 return false; 4299 } 4300 } 4301 4302 // Work around bogus GCC warning 4303 return true; 4304 } 4305 4306 /// Iterator adaptor that invents template argument location information 4307 /// for each of the template arguments in its underlying iterator. 4308 template<typename Derived, typename InputIterator> 4309 class TemplateArgumentLocInventIterator { 4310 TreeTransform<Derived> &Self; 4311 InputIterator Iter; 4312 4313 public: 4314 typedef TemplateArgumentLoc value_type; 4315 typedef TemplateArgumentLoc reference; 4316 typedef typename std::iterator_traits<InputIterator>::difference_type 4317 difference_type; 4318 typedef std::input_iterator_tag iterator_category; 4319 4320 class pointer { 4321 TemplateArgumentLoc Arg; 4322 4323 public: 4324 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4325 4326 const TemplateArgumentLoc *operator->() const { return &Arg; } 4327 }; 4328 4329 TemplateArgumentLocInventIterator() { } 4330 4331 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4332 InputIterator Iter) 4333 : Self(Self), Iter(Iter) { } 4334 4335 TemplateArgumentLocInventIterator &operator++() { 4336 ++Iter; 4337 return *this; 4338 } 4339 4340 TemplateArgumentLocInventIterator operator++(int) { 4341 TemplateArgumentLocInventIterator Old(*this); 4342 ++(*this); 4343 return Old; 4344 } 4345 4346 reference operator*() const { 4347 TemplateArgumentLoc Result; 4348 Self.InventTemplateArgumentLoc(*Iter, Result); 4349 return Result; 4350 } 4351 4352 pointer operator->() const { return pointer(**this); } 4353 4354 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4355 const TemplateArgumentLocInventIterator &Y) { 4356 return X.Iter == Y.Iter; 4357 } 4358 4359 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4360 const TemplateArgumentLocInventIterator &Y) { 4361 return X.Iter != Y.Iter; 4362 } 4363 }; 4364 4365 template<typename Derived> 4366 template<typename InputIterator> 4367 bool TreeTransform<Derived>::TransformTemplateArguments( 4368 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4369 bool Uneval) { 4370 for (; First != Last; ++First) { 4371 TemplateArgumentLoc Out; 4372 TemplateArgumentLoc In = *First; 4373 4374 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4375 // Unpack argument packs, which we translate them into separate 4376 // arguments. 4377 // FIXME: We could do much better if we could guarantee that the 4378 // TemplateArgumentLocInfo for the pack expansion would be usable for 4379 // all of the template arguments in the argument pack. 4380 typedef TemplateArgumentLocInventIterator<Derived, 4381 TemplateArgument::pack_iterator> 4382 PackLocIterator; 4383 if (TransformTemplateArguments(PackLocIterator(*this, 4384 In.getArgument().pack_begin()), 4385 PackLocIterator(*this, 4386 In.getArgument().pack_end()), 4387 Outputs, Uneval)) 4388 return true; 4389 4390 continue; 4391 } 4392 4393 if (In.getArgument().isPackExpansion()) { 4394 // We have a pack expansion, for which we will be substituting into 4395 // the pattern. 4396 SourceLocation Ellipsis; 4397 Optional<unsigned> OrigNumExpansions; 4398 TemplateArgumentLoc Pattern 4399 = getSema().getTemplateArgumentPackExpansionPattern( 4400 In, Ellipsis, OrigNumExpansions); 4401 4402 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4403 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4404 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4405 4406 // Determine whether the set of unexpanded parameter packs can and should 4407 // be expanded. 4408 bool Expand = true; 4409 bool RetainExpansion = false; 4410 Optional<unsigned> NumExpansions = OrigNumExpansions; 4411 if (getDerived().TryExpandParameterPacks(Ellipsis, 4412 Pattern.getSourceRange(), 4413 Unexpanded, 4414 Expand, 4415 RetainExpansion, 4416 NumExpansions)) 4417 return true; 4418 4419 if (!Expand) { 4420 // The transform has determined that we should perform a simple 4421 // transformation on the pack expansion, producing another pack 4422 // expansion. 4423 TemplateArgumentLoc OutPattern; 4424 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4425 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4426 return true; 4427 4428 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4429 NumExpansions); 4430 if (Out.getArgument().isNull()) 4431 return true; 4432 4433 Outputs.addArgument(Out); 4434 continue; 4435 } 4436 4437 // The transform has determined that we should perform an elementwise 4438 // expansion of the pattern. Do so. 4439 for (unsigned I = 0; I != *NumExpansions; ++I) { 4440 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4441 4442 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4443 return true; 4444 4445 if (Out.getArgument().containsUnexpandedParameterPack()) { 4446 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4447 OrigNumExpansions); 4448 if (Out.getArgument().isNull()) 4449 return true; 4450 } 4451 4452 Outputs.addArgument(Out); 4453 } 4454 4455 // If we're supposed to retain a pack expansion, do so by temporarily 4456 // forgetting the partially-substituted parameter pack. 4457 if (RetainExpansion) { 4458 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4459 4460 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4461 return true; 4462 4463 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4464 OrigNumExpansions); 4465 if (Out.getArgument().isNull()) 4466 return true; 4467 4468 Outputs.addArgument(Out); 4469 } 4470 4471 continue; 4472 } 4473 4474 // The simple case: 4475 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4476 return true; 4477 4478 Outputs.addArgument(Out); 4479 } 4480 4481 return false; 4482 4483 } 4484 4485 //===----------------------------------------------------------------------===// 4486 // Type transformation 4487 //===----------------------------------------------------------------------===// 4488 4489 template<typename Derived> 4490 QualType TreeTransform<Derived>::TransformType(QualType T) { 4491 if (getDerived().AlreadyTransformed(T)) 4492 return T; 4493 4494 // Temporary workaround. All of these transformations should 4495 // eventually turn into transformations on TypeLocs. 4496 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4497 getDerived().getBaseLocation()); 4498 4499 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4500 4501 if (!NewDI) 4502 return QualType(); 4503 4504 return NewDI->getType(); 4505 } 4506 4507 template<typename Derived> 4508 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4509 // Refine the base location to the type's location. 4510 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4511 getDerived().getBaseEntity()); 4512 if (getDerived().AlreadyTransformed(DI->getType())) 4513 return DI; 4514 4515 TypeLocBuilder TLB; 4516 4517 TypeLoc TL = DI->getTypeLoc(); 4518 TLB.reserve(TL.getFullDataSize()); 4519 4520 QualType Result = getDerived().TransformType(TLB, TL); 4521 if (Result.isNull()) 4522 return nullptr; 4523 4524 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4525 } 4526 4527 template<typename Derived> 4528 QualType 4529 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4530 switch (T.getTypeLocClass()) { 4531 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4532 #define TYPELOC(CLASS, PARENT) \ 4533 case TypeLoc::CLASS: \ 4534 return getDerived().Transform##CLASS##Type(TLB, \ 4535 T.castAs<CLASS##TypeLoc>()); 4536 #include "clang/AST/TypeLocNodes.def" 4537 } 4538 4539 llvm_unreachable("unhandled type loc!"); 4540 } 4541 4542 template<typename Derived> 4543 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4544 if (!isa<DependentNameType>(T)) 4545 return TransformType(T); 4546 4547 if (getDerived().AlreadyTransformed(T)) 4548 return T; 4549 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4550 getDerived().getBaseLocation()); 4551 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4552 return NewDI ? NewDI->getType() : QualType(); 4553 } 4554 4555 template<typename Derived> 4556 TypeSourceInfo * 4557 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4558 if (!isa<DependentNameType>(DI->getType())) 4559 return TransformType(DI); 4560 4561 // Refine the base location to the type's location. 4562 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4563 getDerived().getBaseEntity()); 4564 if (getDerived().AlreadyTransformed(DI->getType())) 4565 return DI; 4566 4567 TypeLocBuilder TLB; 4568 4569 TypeLoc TL = DI->getTypeLoc(); 4570 TLB.reserve(TL.getFullDataSize()); 4571 4572 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4573 if (QTL) 4574 TL = QTL.getUnqualifiedLoc(); 4575 4576 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4577 4578 QualType Result = getDerived().TransformDependentNameType( 4579 TLB, DNTL, /*DeducedTSTContext*/true); 4580 if (Result.isNull()) 4581 return nullptr; 4582 4583 if (QTL) { 4584 Result = getDerived().RebuildQualifiedType(Result, QTL); 4585 if (Result.isNull()) 4586 return nullptr; 4587 TLB.TypeWasModifiedSafely(Result); 4588 } 4589 4590 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4591 } 4592 4593 template<typename Derived> 4594 QualType 4595 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4596 QualifiedTypeLoc T) { 4597 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4598 if (Result.isNull()) 4599 return QualType(); 4600 4601 Result = getDerived().RebuildQualifiedType(Result, T); 4602 4603 if (Result.isNull()) 4604 return QualType(); 4605 4606 // RebuildQualifiedType might have updated the type, but not in a way 4607 // that invalidates the TypeLoc. (There's no location information for 4608 // qualifiers.) 4609 TLB.TypeWasModifiedSafely(Result); 4610 4611 return Result; 4612 } 4613 4614 template <typename Derived> 4615 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4616 QualifiedTypeLoc TL) { 4617 4618 SourceLocation Loc = TL.getBeginLoc(); 4619 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4620 4621 if (((T.getAddressSpace() != LangAS::Default && 4622 Quals.getAddressSpace() != LangAS::Default)) && 4623 T.getAddressSpace() != Quals.getAddressSpace()) { 4624 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4625 << TL.getType() << T; 4626 return QualType(); 4627 } 4628 4629 // C++ [dcl.fct]p7: 4630 // [When] adding cv-qualifications on top of the function type [...] the 4631 // cv-qualifiers are ignored. 4632 if (T->isFunctionType()) { 4633 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4634 Quals.getAddressSpace()); 4635 return T; 4636 } 4637 4638 // C++ [dcl.ref]p1: 4639 // when the cv-qualifiers are introduced through the use of a typedef-name 4640 // or decltype-specifier [...] the cv-qualifiers are ignored. 4641 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4642 // applied to a reference type. 4643 if (T->isReferenceType()) { 4644 // The only qualifier that applies to a reference type is restrict. 4645 if (!Quals.hasRestrict()) 4646 return T; 4647 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4648 } 4649 4650 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4651 // resulting type. 4652 if (Quals.hasObjCLifetime()) { 4653 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4654 Quals.removeObjCLifetime(); 4655 else if (T.getObjCLifetime()) { 4656 // Objective-C ARC: 4657 // A lifetime qualifier applied to a substituted template parameter 4658 // overrides the lifetime qualifier from the template argument. 4659 const AutoType *AutoTy; 4660 if (const SubstTemplateTypeParmType *SubstTypeParam 4661 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4662 QualType Replacement = SubstTypeParam->getReplacementType(); 4663 Qualifiers Qs = Replacement.getQualifiers(); 4664 Qs.removeObjCLifetime(); 4665 Replacement = SemaRef.Context.getQualifiedType( 4666 Replacement.getUnqualifiedType(), Qs); 4667 T = SemaRef.Context.getSubstTemplateTypeParmType( 4668 SubstTypeParam->getReplacedParameter(), Replacement); 4669 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4670 // 'auto' types behave the same way as template parameters. 4671 QualType Deduced = AutoTy->getDeducedType(); 4672 Qualifiers Qs = Deduced.getQualifiers(); 4673 Qs.removeObjCLifetime(); 4674 Deduced = 4675 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4676 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4677 AutoTy->isDependentType(), 4678 /*isPack=*/false, 4679 AutoTy->getTypeConstraintConcept(), 4680 AutoTy->getTypeConstraintArguments()); 4681 } else { 4682 // Otherwise, complain about the addition of a qualifier to an 4683 // already-qualified type. 4684 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4685 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4686 Quals.removeObjCLifetime(); 4687 } 4688 } 4689 } 4690 4691 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4692 } 4693 4694 template<typename Derived> 4695 TypeLoc 4696 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4697 QualType ObjectType, 4698 NamedDecl *UnqualLookup, 4699 CXXScopeSpec &SS) { 4700 if (getDerived().AlreadyTransformed(TL.getType())) 4701 return TL; 4702 4703 TypeSourceInfo *TSI = 4704 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4705 if (TSI) 4706 return TSI->getTypeLoc(); 4707 return TypeLoc(); 4708 } 4709 4710 template<typename Derived> 4711 TypeSourceInfo * 4712 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4713 QualType ObjectType, 4714 NamedDecl *UnqualLookup, 4715 CXXScopeSpec &SS) { 4716 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4717 return TSInfo; 4718 4719 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4720 UnqualLookup, SS); 4721 } 4722 4723 template <typename Derived> 4724 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4725 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4726 CXXScopeSpec &SS) { 4727 QualType T = TL.getType(); 4728 assert(!getDerived().AlreadyTransformed(T)); 4729 4730 TypeLocBuilder TLB; 4731 QualType Result; 4732 4733 if (isa<TemplateSpecializationType>(T)) { 4734 TemplateSpecializationTypeLoc SpecTL = 4735 TL.castAs<TemplateSpecializationTypeLoc>(); 4736 4737 TemplateName Template = getDerived().TransformTemplateName( 4738 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4739 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4740 if (Template.isNull()) 4741 return nullptr; 4742 4743 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4744 Template); 4745 } else if (isa<DependentTemplateSpecializationType>(T)) { 4746 DependentTemplateSpecializationTypeLoc SpecTL = 4747 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4748 4749 TemplateName Template 4750 = getDerived().RebuildTemplateName(SS, 4751 SpecTL.getTemplateKeywordLoc(), 4752 *SpecTL.getTypePtr()->getIdentifier(), 4753 SpecTL.getTemplateNameLoc(), 4754 ObjectType, UnqualLookup, 4755 /*AllowInjectedClassName*/true); 4756 if (Template.isNull()) 4757 return nullptr; 4758 4759 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4760 SpecTL, 4761 Template, 4762 SS); 4763 } else { 4764 // Nothing special needs to be done for these. 4765 Result = getDerived().TransformType(TLB, TL); 4766 } 4767 4768 if (Result.isNull()) 4769 return nullptr; 4770 4771 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4772 } 4773 4774 template <class TyLoc> static inline 4775 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4776 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4777 NewT.setNameLoc(T.getNameLoc()); 4778 return T.getType(); 4779 } 4780 4781 template<typename Derived> 4782 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4783 BuiltinTypeLoc T) { 4784 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4785 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4786 if (T.needsExtraLocalData()) 4787 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4788 return T.getType(); 4789 } 4790 4791 template<typename Derived> 4792 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4793 ComplexTypeLoc T) { 4794 // FIXME: recurse? 4795 return TransformTypeSpecType(TLB, T); 4796 } 4797 4798 template <typename Derived> 4799 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4800 AdjustedTypeLoc TL) { 4801 // Adjustments applied during transformation are handled elsewhere. 4802 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4803 } 4804 4805 template<typename Derived> 4806 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4807 DecayedTypeLoc TL) { 4808 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4809 if (OriginalType.isNull()) 4810 return QualType(); 4811 4812 QualType Result = TL.getType(); 4813 if (getDerived().AlwaysRebuild() || 4814 OriginalType != TL.getOriginalLoc().getType()) 4815 Result = SemaRef.Context.getDecayedType(OriginalType); 4816 TLB.push<DecayedTypeLoc>(Result); 4817 // Nothing to set for DecayedTypeLoc. 4818 return Result; 4819 } 4820 4821 template<typename Derived> 4822 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4823 PointerTypeLoc TL) { 4824 QualType PointeeType 4825 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4826 if (PointeeType.isNull()) 4827 return QualType(); 4828 4829 QualType Result = TL.getType(); 4830 if (PointeeType->getAs<ObjCObjectType>()) { 4831 // A dependent pointer type 'T *' has is being transformed such 4832 // that an Objective-C class type is being replaced for 'T'. The 4833 // resulting pointer type is an ObjCObjectPointerType, not a 4834 // PointerType. 4835 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4836 4837 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4838 NewT.setStarLoc(TL.getStarLoc()); 4839 return Result; 4840 } 4841 4842 if (getDerived().AlwaysRebuild() || 4843 PointeeType != TL.getPointeeLoc().getType()) { 4844 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4845 if (Result.isNull()) 4846 return QualType(); 4847 } 4848 4849 // Objective-C ARC can add lifetime qualifiers to the type that we're 4850 // pointing to. 4851 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4852 4853 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4854 NewT.setSigilLoc(TL.getSigilLoc()); 4855 return Result; 4856 } 4857 4858 template<typename Derived> 4859 QualType 4860 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4861 BlockPointerTypeLoc TL) { 4862 QualType PointeeType 4863 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4864 if (PointeeType.isNull()) 4865 return QualType(); 4866 4867 QualType Result = TL.getType(); 4868 if (getDerived().AlwaysRebuild() || 4869 PointeeType != TL.getPointeeLoc().getType()) { 4870 Result = getDerived().RebuildBlockPointerType(PointeeType, 4871 TL.getSigilLoc()); 4872 if (Result.isNull()) 4873 return QualType(); 4874 } 4875 4876 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4877 NewT.setSigilLoc(TL.getSigilLoc()); 4878 return Result; 4879 } 4880 4881 /// Transforms a reference type. Note that somewhat paradoxically we 4882 /// don't care whether the type itself is an l-value type or an r-value 4883 /// type; we only care if the type was *written* as an l-value type 4884 /// or an r-value type. 4885 template<typename Derived> 4886 QualType 4887 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4888 ReferenceTypeLoc TL) { 4889 const ReferenceType *T = TL.getTypePtr(); 4890 4891 // Note that this works with the pointee-as-written. 4892 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4893 if (PointeeType.isNull()) 4894 return QualType(); 4895 4896 QualType Result = TL.getType(); 4897 if (getDerived().AlwaysRebuild() || 4898 PointeeType != T->getPointeeTypeAsWritten()) { 4899 Result = getDerived().RebuildReferenceType(PointeeType, 4900 T->isSpelledAsLValue(), 4901 TL.getSigilLoc()); 4902 if (Result.isNull()) 4903 return QualType(); 4904 } 4905 4906 // Objective-C ARC can add lifetime qualifiers to the type that we're 4907 // referring to. 4908 TLB.TypeWasModifiedSafely( 4909 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4910 4911 // r-value references can be rebuilt as l-value references. 4912 ReferenceTypeLoc NewTL; 4913 if (isa<LValueReferenceType>(Result)) 4914 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4915 else 4916 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4917 NewTL.setSigilLoc(TL.getSigilLoc()); 4918 4919 return Result; 4920 } 4921 4922 template<typename Derived> 4923 QualType 4924 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4925 LValueReferenceTypeLoc TL) { 4926 return TransformReferenceType(TLB, TL); 4927 } 4928 4929 template<typename Derived> 4930 QualType 4931 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4932 RValueReferenceTypeLoc TL) { 4933 return TransformReferenceType(TLB, TL); 4934 } 4935 4936 template<typename Derived> 4937 QualType 4938 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4939 MemberPointerTypeLoc TL) { 4940 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4941 if (PointeeType.isNull()) 4942 return QualType(); 4943 4944 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4945 TypeSourceInfo *NewClsTInfo = nullptr; 4946 if (OldClsTInfo) { 4947 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4948 if (!NewClsTInfo) 4949 return QualType(); 4950 } 4951 4952 const MemberPointerType *T = TL.getTypePtr(); 4953 QualType OldClsType = QualType(T->getClass(), 0); 4954 QualType NewClsType; 4955 if (NewClsTInfo) 4956 NewClsType = NewClsTInfo->getType(); 4957 else { 4958 NewClsType = getDerived().TransformType(OldClsType); 4959 if (NewClsType.isNull()) 4960 return QualType(); 4961 } 4962 4963 QualType Result = TL.getType(); 4964 if (getDerived().AlwaysRebuild() || 4965 PointeeType != T->getPointeeType() || 4966 NewClsType != OldClsType) { 4967 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4968 TL.getStarLoc()); 4969 if (Result.isNull()) 4970 return QualType(); 4971 } 4972 4973 // If we had to adjust the pointee type when building a member pointer, make 4974 // sure to push TypeLoc info for it. 4975 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4976 if (MPT && PointeeType != MPT->getPointeeType()) { 4977 assert(isa<AdjustedType>(MPT->getPointeeType())); 4978 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4979 } 4980 4981 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4982 NewTL.setSigilLoc(TL.getSigilLoc()); 4983 NewTL.setClassTInfo(NewClsTInfo); 4984 4985 return Result; 4986 } 4987 4988 template<typename Derived> 4989 QualType 4990 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4991 ConstantArrayTypeLoc TL) { 4992 const ConstantArrayType *T = TL.getTypePtr(); 4993 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4994 if (ElementType.isNull()) 4995 return QualType(); 4996 4997 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4998 Expr *OldSize = TL.getSizeExpr(); 4999 if (!OldSize) 5000 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5001 Expr *NewSize = nullptr; 5002 if (OldSize) { 5003 EnterExpressionEvaluationContext Unevaluated( 5004 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5005 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5006 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5007 } 5008 5009 QualType Result = TL.getType(); 5010 if (getDerived().AlwaysRebuild() || 5011 ElementType != T->getElementType() || 5012 (T->getSizeExpr() && NewSize != OldSize)) { 5013 Result = getDerived().RebuildConstantArrayType(ElementType, 5014 T->getSizeModifier(), 5015 T->getSize(), NewSize, 5016 T->getIndexTypeCVRQualifiers(), 5017 TL.getBracketsRange()); 5018 if (Result.isNull()) 5019 return QualType(); 5020 } 5021 5022 // We might have either a ConstantArrayType or a VariableArrayType now: 5023 // a ConstantArrayType is allowed to have an element type which is a 5024 // VariableArrayType if the type is dependent. Fortunately, all array 5025 // types have the same location layout. 5026 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5027 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5028 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5029 NewTL.setSizeExpr(NewSize); 5030 5031 return Result; 5032 } 5033 5034 template<typename Derived> 5035 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5036 TypeLocBuilder &TLB, 5037 IncompleteArrayTypeLoc TL) { 5038 const IncompleteArrayType *T = TL.getTypePtr(); 5039 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5040 if (ElementType.isNull()) 5041 return QualType(); 5042 5043 QualType Result = TL.getType(); 5044 if (getDerived().AlwaysRebuild() || 5045 ElementType != T->getElementType()) { 5046 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5047 T->getSizeModifier(), 5048 T->getIndexTypeCVRQualifiers(), 5049 TL.getBracketsRange()); 5050 if (Result.isNull()) 5051 return QualType(); 5052 } 5053 5054 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5055 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5056 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5057 NewTL.setSizeExpr(nullptr); 5058 5059 return Result; 5060 } 5061 5062 template<typename Derived> 5063 QualType 5064 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5065 VariableArrayTypeLoc TL) { 5066 const VariableArrayType *T = TL.getTypePtr(); 5067 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5068 if (ElementType.isNull()) 5069 return QualType(); 5070 5071 ExprResult SizeResult; 5072 { 5073 EnterExpressionEvaluationContext Context( 5074 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5075 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5076 } 5077 if (SizeResult.isInvalid()) 5078 return QualType(); 5079 SizeResult = 5080 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5081 if (SizeResult.isInvalid()) 5082 return QualType(); 5083 5084 Expr *Size = SizeResult.get(); 5085 5086 QualType Result = TL.getType(); 5087 if (getDerived().AlwaysRebuild() || 5088 ElementType != T->getElementType() || 5089 Size != T->getSizeExpr()) { 5090 Result = getDerived().RebuildVariableArrayType(ElementType, 5091 T->getSizeModifier(), 5092 Size, 5093 T->getIndexTypeCVRQualifiers(), 5094 TL.getBracketsRange()); 5095 if (Result.isNull()) 5096 return QualType(); 5097 } 5098 5099 // We might have constant size array now, but fortunately it has the same 5100 // location layout. 5101 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5102 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5103 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5104 NewTL.setSizeExpr(Size); 5105 5106 return Result; 5107 } 5108 5109 template<typename Derived> 5110 QualType 5111 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5112 DependentSizedArrayTypeLoc TL) { 5113 const DependentSizedArrayType *T = TL.getTypePtr(); 5114 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5115 if (ElementType.isNull()) 5116 return QualType(); 5117 5118 // Array bounds are constant expressions. 5119 EnterExpressionEvaluationContext Unevaluated( 5120 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5121 5122 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5123 Expr *origSize = TL.getSizeExpr(); 5124 if (!origSize) origSize = T->getSizeExpr(); 5125 5126 ExprResult sizeResult 5127 = getDerived().TransformExpr(origSize); 5128 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5129 if (sizeResult.isInvalid()) 5130 return QualType(); 5131 5132 Expr *size = sizeResult.get(); 5133 5134 QualType Result = TL.getType(); 5135 if (getDerived().AlwaysRebuild() || 5136 ElementType != T->getElementType() || 5137 size != origSize) { 5138 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5139 T->getSizeModifier(), 5140 size, 5141 T->getIndexTypeCVRQualifiers(), 5142 TL.getBracketsRange()); 5143 if (Result.isNull()) 5144 return QualType(); 5145 } 5146 5147 // We might have any sort of array type now, but fortunately they 5148 // all have the same location layout. 5149 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5150 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5151 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5152 NewTL.setSizeExpr(size); 5153 5154 return Result; 5155 } 5156 5157 template <typename Derived> 5158 QualType TreeTransform<Derived>::TransformDependentVectorType( 5159 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5160 const DependentVectorType *T = TL.getTypePtr(); 5161 QualType ElementType = getDerived().TransformType(T->getElementType()); 5162 if (ElementType.isNull()) 5163 return QualType(); 5164 5165 EnterExpressionEvaluationContext Unevaluated( 5166 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5167 5168 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5169 Size = SemaRef.ActOnConstantExpression(Size); 5170 if (Size.isInvalid()) 5171 return QualType(); 5172 5173 QualType Result = TL.getType(); 5174 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5175 Size.get() != T->getSizeExpr()) { 5176 Result = getDerived().RebuildDependentVectorType( 5177 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5178 if (Result.isNull()) 5179 return QualType(); 5180 } 5181 5182 // Result might be dependent or not. 5183 if (isa<DependentVectorType>(Result)) { 5184 DependentVectorTypeLoc NewTL = 5185 TLB.push<DependentVectorTypeLoc>(Result); 5186 NewTL.setNameLoc(TL.getNameLoc()); 5187 } else { 5188 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5189 NewTL.setNameLoc(TL.getNameLoc()); 5190 } 5191 5192 return Result; 5193 } 5194 5195 template<typename Derived> 5196 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5197 TypeLocBuilder &TLB, 5198 DependentSizedExtVectorTypeLoc TL) { 5199 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5200 5201 // FIXME: ext vector locs should be nested 5202 QualType ElementType = getDerived().TransformType(T->getElementType()); 5203 if (ElementType.isNull()) 5204 return QualType(); 5205 5206 // Vector sizes are constant expressions. 5207 EnterExpressionEvaluationContext Unevaluated( 5208 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5209 5210 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5211 Size = SemaRef.ActOnConstantExpression(Size); 5212 if (Size.isInvalid()) 5213 return QualType(); 5214 5215 QualType Result = TL.getType(); 5216 if (getDerived().AlwaysRebuild() || 5217 ElementType != T->getElementType() || 5218 Size.get() != T->getSizeExpr()) { 5219 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5220 Size.get(), 5221 T->getAttributeLoc()); 5222 if (Result.isNull()) 5223 return QualType(); 5224 } 5225 5226 // Result might be dependent or not. 5227 if (isa<DependentSizedExtVectorType>(Result)) { 5228 DependentSizedExtVectorTypeLoc NewTL 5229 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5230 NewTL.setNameLoc(TL.getNameLoc()); 5231 } else { 5232 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5233 NewTL.setNameLoc(TL.getNameLoc()); 5234 } 5235 5236 return Result; 5237 } 5238 5239 template <typename Derived> 5240 QualType 5241 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5242 ConstantMatrixTypeLoc TL) { 5243 const ConstantMatrixType *T = TL.getTypePtr(); 5244 QualType ElementType = getDerived().TransformType(T->getElementType()); 5245 if (ElementType.isNull()) 5246 return QualType(); 5247 5248 QualType Result = TL.getType(); 5249 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5250 Result = getDerived().RebuildConstantMatrixType( 5251 ElementType, T->getNumRows(), T->getNumColumns()); 5252 if (Result.isNull()) 5253 return QualType(); 5254 } 5255 5256 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5257 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5258 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5259 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5260 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5261 5262 return Result; 5263 } 5264 5265 template <typename Derived> 5266 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5267 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5268 const DependentSizedMatrixType *T = TL.getTypePtr(); 5269 5270 QualType ElementType = getDerived().TransformType(T->getElementType()); 5271 if (ElementType.isNull()) { 5272 return QualType(); 5273 } 5274 5275 // Matrix dimensions are constant expressions. 5276 EnterExpressionEvaluationContext Unevaluated( 5277 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5278 5279 Expr *origRows = TL.getAttrRowOperand(); 5280 if (!origRows) 5281 origRows = T->getRowExpr(); 5282 Expr *origColumns = TL.getAttrColumnOperand(); 5283 if (!origColumns) 5284 origColumns = T->getColumnExpr(); 5285 5286 ExprResult rowResult = getDerived().TransformExpr(origRows); 5287 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5288 if (rowResult.isInvalid()) 5289 return QualType(); 5290 5291 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5292 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5293 if (columnResult.isInvalid()) 5294 return QualType(); 5295 5296 Expr *rows = rowResult.get(); 5297 Expr *columns = columnResult.get(); 5298 5299 QualType Result = TL.getType(); 5300 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5301 rows != origRows || columns != origColumns) { 5302 Result = getDerived().RebuildDependentSizedMatrixType( 5303 ElementType, rows, columns, T->getAttributeLoc()); 5304 5305 if (Result.isNull()) 5306 return QualType(); 5307 } 5308 5309 // We might have any sort of matrix type now, but fortunately they 5310 // all have the same location layout. 5311 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5312 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5313 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5314 NewTL.setAttrRowOperand(rows); 5315 NewTL.setAttrColumnOperand(columns); 5316 return Result; 5317 } 5318 5319 template <typename Derived> 5320 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5321 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5322 const DependentAddressSpaceType *T = TL.getTypePtr(); 5323 5324 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5325 5326 if (pointeeType.isNull()) 5327 return QualType(); 5328 5329 // Address spaces are constant expressions. 5330 EnterExpressionEvaluationContext Unevaluated( 5331 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5332 5333 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5334 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5335 if (AddrSpace.isInvalid()) 5336 return QualType(); 5337 5338 QualType Result = TL.getType(); 5339 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5340 AddrSpace.get() != T->getAddrSpaceExpr()) { 5341 Result = getDerived().RebuildDependentAddressSpaceType( 5342 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5343 if (Result.isNull()) 5344 return QualType(); 5345 } 5346 5347 // Result might be dependent or not. 5348 if (isa<DependentAddressSpaceType>(Result)) { 5349 DependentAddressSpaceTypeLoc NewTL = 5350 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5351 5352 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5353 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5354 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5355 5356 } else { 5357 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5358 Result, getDerived().getBaseLocation()); 5359 TransformType(TLB, DI->getTypeLoc()); 5360 } 5361 5362 return Result; 5363 } 5364 5365 template <typename Derived> 5366 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5367 VectorTypeLoc TL) { 5368 const VectorType *T = TL.getTypePtr(); 5369 QualType ElementType = getDerived().TransformType(T->getElementType()); 5370 if (ElementType.isNull()) 5371 return QualType(); 5372 5373 QualType Result = TL.getType(); 5374 if (getDerived().AlwaysRebuild() || 5375 ElementType != T->getElementType()) { 5376 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5377 T->getVectorKind()); 5378 if (Result.isNull()) 5379 return QualType(); 5380 } 5381 5382 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5383 NewTL.setNameLoc(TL.getNameLoc()); 5384 5385 return Result; 5386 } 5387 5388 template<typename Derived> 5389 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5390 ExtVectorTypeLoc TL) { 5391 const VectorType *T = TL.getTypePtr(); 5392 QualType ElementType = getDerived().TransformType(T->getElementType()); 5393 if (ElementType.isNull()) 5394 return QualType(); 5395 5396 QualType Result = TL.getType(); 5397 if (getDerived().AlwaysRebuild() || 5398 ElementType != T->getElementType()) { 5399 Result = getDerived().RebuildExtVectorType(ElementType, 5400 T->getNumElements(), 5401 /*FIXME*/ SourceLocation()); 5402 if (Result.isNull()) 5403 return QualType(); 5404 } 5405 5406 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5407 NewTL.setNameLoc(TL.getNameLoc()); 5408 5409 return Result; 5410 } 5411 5412 template <typename Derived> 5413 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5414 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5415 bool ExpectParameterPack) { 5416 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5417 TypeSourceInfo *NewDI = nullptr; 5418 5419 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5420 // If we're substituting into a pack expansion type and we know the 5421 // length we want to expand to, just substitute for the pattern. 5422 TypeLoc OldTL = OldDI->getTypeLoc(); 5423 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5424 5425 TypeLocBuilder TLB; 5426 TypeLoc NewTL = OldDI->getTypeLoc(); 5427 TLB.reserve(NewTL.getFullDataSize()); 5428 5429 QualType Result = getDerived().TransformType(TLB, 5430 OldExpansionTL.getPatternLoc()); 5431 if (Result.isNull()) 5432 return nullptr; 5433 5434 Result = RebuildPackExpansionType(Result, 5435 OldExpansionTL.getPatternLoc().getSourceRange(), 5436 OldExpansionTL.getEllipsisLoc(), 5437 NumExpansions); 5438 if (Result.isNull()) 5439 return nullptr; 5440 5441 PackExpansionTypeLoc NewExpansionTL 5442 = TLB.push<PackExpansionTypeLoc>(Result); 5443 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5444 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5445 } else 5446 NewDI = getDerived().TransformType(OldDI); 5447 if (!NewDI) 5448 return nullptr; 5449 5450 if (NewDI == OldDI && indexAdjustment == 0) 5451 return OldParm; 5452 5453 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5454 OldParm->getDeclContext(), 5455 OldParm->getInnerLocStart(), 5456 OldParm->getLocation(), 5457 OldParm->getIdentifier(), 5458 NewDI->getType(), 5459 NewDI, 5460 OldParm->getStorageClass(), 5461 /* DefArg */ nullptr); 5462 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5463 OldParm->getFunctionScopeIndex() + indexAdjustment); 5464 return newParm; 5465 } 5466 5467 template <typename Derived> 5468 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5469 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5470 const QualType *ParamTypes, 5471 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5472 SmallVectorImpl<QualType> &OutParamTypes, 5473 SmallVectorImpl<ParmVarDecl *> *PVars, 5474 Sema::ExtParameterInfoBuilder &PInfos) { 5475 int indexAdjustment = 0; 5476 5477 unsigned NumParams = Params.size(); 5478 for (unsigned i = 0; i != NumParams; ++i) { 5479 if (ParmVarDecl *OldParm = Params[i]) { 5480 assert(OldParm->getFunctionScopeIndex() == i); 5481 5482 Optional<unsigned> NumExpansions; 5483 ParmVarDecl *NewParm = nullptr; 5484 if (OldParm->isParameterPack()) { 5485 // We have a function parameter pack that may need to be expanded. 5486 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5487 5488 // Find the parameter packs that could be expanded. 5489 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5490 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5491 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5492 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5493 5494 // Determine whether we should expand the parameter packs. 5495 bool ShouldExpand = false; 5496 bool RetainExpansion = false; 5497 Optional<unsigned> OrigNumExpansions; 5498 if (Unexpanded.size() > 0) { 5499 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5500 NumExpansions = OrigNumExpansions; 5501 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5502 Pattern.getSourceRange(), 5503 Unexpanded, 5504 ShouldExpand, 5505 RetainExpansion, 5506 NumExpansions)) { 5507 return true; 5508 } 5509 } else { 5510 #ifndef NDEBUG 5511 const AutoType *AT = 5512 Pattern.getType().getTypePtr()->getContainedAutoType(); 5513 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5514 "Could not find parameter packs or undeduced auto type!"); 5515 #endif 5516 } 5517 5518 if (ShouldExpand) { 5519 // Expand the function parameter pack into multiple, separate 5520 // parameters. 5521 getDerived().ExpandingFunctionParameterPack(OldParm); 5522 for (unsigned I = 0; I != *NumExpansions; ++I) { 5523 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5524 ParmVarDecl *NewParm 5525 = getDerived().TransformFunctionTypeParam(OldParm, 5526 indexAdjustment++, 5527 OrigNumExpansions, 5528 /*ExpectParameterPack=*/false); 5529 if (!NewParm) 5530 return true; 5531 5532 if (ParamInfos) 5533 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5534 OutParamTypes.push_back(NewParm->getType()); 5535 if (PVars) 5536 PVars->push_back(NewParm); 5537 } 5538 5539 // If we're supposed to retain a pack expansion, do so by temporarily 5540 // forgetting the partially-substituted parameter pack. 5541 if (RetainExpansion) { 5542 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5543 ParmVarDecl *NewParm 5544 = getDerived().TransformFunctionTypeParam(OldParm, 5545 indexAdjustment++, 5546 OrigNumExpansions, 5547 /*ExpectParameterPack=*/false); 5548 if (!NewParm) 5549 return true; 5550 5551 if (ParamInfos) 5552 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5553 OutParamTypes.push_back(NewParm->getType()); 5554 if (PVars) 5555 PVars->push_back(NewParm); 5556 } 5557 5558 // The next parameter should have the same adjustment as the 5559 // last thing we pushed, but we post-incremented indexAdjustment 5560 // on every push. Also, if we push nothing, the adjustment should 5561 // go down by one. 5562 indexAdjustment--; 5563 5564 // We're done with the pack expansion. 5565 continue; 5566 } 5567 5568 // We'll substitute the parameter now without expanding the pack 5569 // expansion. 5570 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5571 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5572 indexAdjustment, 5573 NumExpansions, 5574 /*ExpectParameterPack=*/true); 5575 assert(NewParm->isParameterPack() && 5576 "Parameter pack no longer a parameter pack after " 5577 "transformation."); 5578 } else { 5579 NewParm = getDerived().TransformFunctionTypeParam( 5580 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5581 } 5582 5583 if (!NewParm) 5584 return true; 5585 5586 if (ParamInfos) 5587 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5588 OutParamTypes.push_back(NewParm->getType()); 5589 if (PVars) 5590 PVars->push_back(NewParm); 5591 continue; 5592 } 5593 5594 // Deal with the possibility that we don't have a parameter 5595 // declaration for this parameter. 5596 QualType OldType = ParamTypes[i]; 5597 bool IsPackExpansion = false; 5598 Optional<unsigned> NumExpansions; 5599 QualType NewType; 5600 if (const PackExpansionType *Expansion 5601 = dyn_cast<PackExpansionType>(OldType)) { 5602 // We have a function parameter pack that may need to be expanded. 5603 QualType Pattern = Expansion->getPattern(); 5604 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5605 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5606 5607 // Determine whether we should expand the parameter packs. 5608 bool ShouldExpand = false; 5609 bool RetainExpansion = false; 5610 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5611 Unexpanded, 5612 ShouldExpand, 5613 RetainExpansion, 5614 NumExpansions)) { 5615 return true; 5616 } 5617 5618 if (ShouldExpand) { 5619 // Expand the function parameter pack into multiple, separate 5620 // parameters. 5621 for (unsigned I = 0; I != *NumExpansions; ++I) { 5622 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5623 QualType NewType = getDerived().TransformType(Pattern); 5624 if (NewType.isNull()) 5625 return true; 5626 5627 if (NewType->containsUnexpandedParameterPack()) { 5628 NewType = 5629 getSema().getASTContext().getPackExpansionType(NewType, None); 5630 5631 if (NewType.isNull()) 5632 return true; 5633 } 5634 5635 if (ParamInfos) 5636 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5637 OutParamTypes.push_back(NewType); 5638 if (PVars) 5639 PVars->push_back(nullptr); 5640 } 5641 5642 // We're done with the pack expansion. 5643 continue; 5644 } 5645 5646 // If we're supposed to retain a pack expansion, do so by temporarily 5647 // forgetting the partially-substituted parameter pack. 5648 if (RetainExpansion) { 5649 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5650 QualType NewType = getDerived().TransformType(Pattern); 5651 if (NewType.isNull()) 5652 return true; 5653 5654 if (ParamInfos) 5655 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5656 OutParamTypes.push_back(NewType); 5657 if (PVars) 5658 PVars->push_back(nullptr); 5659 } 5660 5661 // We'll substitute the parameter now without expanding the pack 5662 // expansion. 5663 OldType = Expansion->getPattern(); 5664 IsPackExpansion = true; 5665 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5666 NewType = getDerived().TransformType(OldType); 5667 } else { 5668 NewType = getDerived().TransformType(OldType); 5669 } 5670 5671 if (NewType.isNull()) 5672 return true; 5673 5674 if (IsPackExpansion) 5675 NewType = getSema().Context.getPackExpansionType(NewType, 5676 NumExpansions); 5677 5678 if (ParamInfos) 5679 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5680 OutParamTypes.push_back(NewType); 5681 if (PVars) 5682 PVars->push_back(nullptr); 5683 } 5684 5685 #ifndef NDEBUG 5686 if (PVars) { 5687 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5688 if (ParmVarDecl *parm = (*PVars)[i]) 5689 assert(parm->getFunctionScopeIndex() == i); 5690 } 5691 #endif 5692 5693 return false; 5694 } 5695 5696 template<typename Derived> 5697 QualType 5698 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5699 FunctionProtoTypeLoc TL) { 5700 SmallVector<QualType, 4> ExceptionStorage; 5701 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5702 return getDerived().TransformFunctionProtoType( 5703 TLB, TL, nullptr, Qualifiers(), 5704 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5705 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5706 ExceptionStorage, Changed); 5707 }); 5708 } 5709 5710 template<typename Derived> template<typename Fn> 5711 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5712 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5713 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5714 5715 // Transform the parameters and return type. 5716 // 5717 // We are required to instantiate the params and return type in source order. 5718 // When the function has a trailing return type, we instantiate the 5719 // parameters before the return type, since the return type can then refer 5720 // to the parameters themselves (via decltype, sizeof, etc.). 5721 // 5722 SmallVector<QualType, 4> ParamTypes; 5723 SmallVector<ParmVarDecl*, 4> ParamDecls; 5724 Sema::ExtParameterInfoBuilder ExtParamInfos; 5725 const FunctionProtoType *T = TL.getTypePtr(); 5726 5727 QualType ResultType; 5728 5729 if (T->hasTrailingReturn()) { 5730 if (getDerived().TransformFunctionTypeParams( 5731 TL.getBeginLoc(), TL.getParams(), 5732 TL.getTypePtr()->param_type_begin(), 5733 T->getExtParameterInfosOrNull(), 5734 ParamTypes, &ParamDecls, ExtParamInfos)) 5735 return QualType(); 5736 5737 { 5738 // C++11 [expr.prim.general]p3: 5739 // If a declaration declares a member function or member function 5740 // template of a class X, the expression this is a prvalue of type 5741 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5742 // and the end of the function-definition, member-declarator, or 5743 // declarator. 5744 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5745 5746 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5747 if (ResultType.isNull()) 5748 return QualType(); 5749 } 5750 } 5751 else { 5752 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5753 if (ResultType.isNull()) 5754 return QualType(); 5755 5756 if (getDerived().TransformFunctionTypeParams( 5757 TL.getBeginLoc(), TL.getParams(), 5758 TL.getTypePtr()->param_type_begin(), 5759 T->getExtParameterInfosOrNull(), 5760 ParamTypes, &ParamDecls, ExtParamInfos)) 5761 return QualType(); 5762 } 5763 5764 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5765 5766 bool EPIChanged = false; 5767 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5768 return QualType(); 5769 5770 // Handle extended parameter information. 5771 if (auto NewExtParamInfos = 5772 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5773 if (!EPI.ExtParameterInfos || 5774 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5775 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5776 EPIChanged = true; 5777 } 5778 EPI.ExtParameterInfos = NewExtParamInfos; 5779 } else if (EPI.ExtParameterInfos) { 5780 EPIChanged = true; 5781 EPI.ExtParameterInfos = nullptr; 5782 } 5783 5784 QualType Result = TL.getType(); 5785 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5786 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5787 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5788 if (Result.isNull()) 5789 return QualType(); 5790 } 5791 5792 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5793 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5794 NewTL.setLParenLoc(TL.getLParenLoc()); 5795 NewTL.setRParenLoc(TL.getRParenLoc()); 5796 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5797 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5798 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5799 NewTL.setParam(i, ParamDecls[i]); 5800 5801 return Result; 5802 } 5803 5804 template<typename Derived> 5805 bool TreeTransform<Derived>::TransformExceptionSpec( 5806 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5807 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5808 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5809 5810 // Instantiate a dynamic noexcept expression, if any. 5811 if (isComputedNoexcept(ESI.Type)) { 5812 EnterExpressionEvaluationContext Unevaluated( 5813 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5814 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5815 if (NoexceptExpr.isInvalid()) 5816 return true; 5817 5818 ExceptionSpecificationType EST = ESI.Type; 5819 NoexceptExpr = 5820 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5821 if (NoexceptExpr.isInvalid()) 5822 return true; 5823 5824 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5825 Changed = true; 5826 ESI.NoexceptExpr = NoexceptExpr.get(); 5827 ESI.Type = EST; 5828 } 5829 5830 if (ESI.Type != EST_Dynamic) 5831 return false; 5832 5833 // Instantiate a dynamic exception specification's type. 5834 for (QualType T : ESI.Exceptions) { 5835 if (const PackExpansionType *PackExpansion = 5836 T->getAs<PackExpansionType>()) { 5837 Changed = true; 5838 5839 // We have a pack expansion. Instantiate it. 5840 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5841 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5842 Unexpanded); 5843 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5844 5845 // Determine whether the set of unexpanded parameter packs can and 5846 // should 5847 // be expanded. 5848 bool Expand = false; 5849 bool RetainExpansion = false; 5850 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5851 // FIXME: Track the location of the ellipsis (and track source location 5852 // information for the types in the exception specification in general). 5853 if (getDerived().TryExpandParameterPacks( 5854 Loc, SourceRange(), Unexpanded, Expand, 5855 RetainExpansion, NumExpansions)) 5856 return true; 5857 5858 if (!Expand) { 5859 // We can't expand this pack expansion into separate arguments yet; 5860 // just substitute into the pattern and create a new pack expansion 5861 // type. 5862 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5863 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5864 if (U.isNull()) 5865 return true; 5866 5867 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5868 Exceptions.push_back(U); 5869 continue; 5870 } 5871 5872 // Substitute into the pack expansion pattern for each slice of the 5873 // pack. 5874 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5875 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5876 5877 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5878 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5879 return true; 5880 5881 Exceptions.push_back(U); 5882 } 5883 } else { 5884 QualType U = getDerived().TransformType(T); 5885 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5886 return true; 5887 if (T != U) 5888 Changed = true; 5889 5890 Exceptions.push_back(U); 5891 } 5892 } 5893 5894 ESI.Exceptions = Exceptions; 5895 if (ESI.Exceptions.empty()) 5896 ESI.Type = EST_DynamicNone; 5897 return false; 5898 } 5899 5900 template<typename Derived> 5901 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5902 TypeLocBuilder &TLB, 5903 FunctionNoProtoTypeLoc TL) { 5904 const FunctionNoProtoType *T = TL.getTypePtr(); 5905 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5906 if (ResultType.isNull()) 5907 return QualType(); 5908 5909 QualType Result = TL.getType(); 5910 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5911 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5912 5913 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5914 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5915 NewTL.setLParenLoc(TL.getLParenLoc()); 5916 NewTL.setRParenLoc(TL.getRParenLoc()); 5917 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5918 5919 return Result; 5920 } 5921 5922 template<typename Derived> QualType 5923 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5924 UnresolvedUsingTypeLoc TL) { 5925 const UnresolvedUsingType *T = TL.getTypePtr(); 5926 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5927 if (!D) 5928 return QualType(); 5929 5930 QualType Result = TL.getType(); 5931 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5932 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5933 if (Result.isNull()) 5934 return QualType(); 5935 } 5936 5937 // We might get an arbitrary type spec type back. We should at 5938 // least always get a type spec type, though. 5939 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5940 NewTL.setNameLoc(TL.getNameLoc()); 5941 5942 return Result; 5943 } 5944 5945 template<typename Derived> 5946 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5947 TypedefTypeLoc TL) { 5948 const TypedefType *T = TL.getTypePtr(); 5949 TypedefNameDecl *Typedef 5950 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5951 T->getDecl())); 5952 if (!Typedef) 5953 return QualType(); 5954 5955 QualType Result = TL.getType(); 5956 if (getDerived().AlwaysRebuild() || 5957 Typedef != T->getDecl()) { 5958 Result = getDerived().RebuildTypedefType(Typedef); 5959 if (Result.isNull()) 5960 return QualType(); 5961 } 5962 5963 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5964 NewTL.setNameLoc(TL.getNameLoc()); 5965 5966 return Result; 5967 } 5968 5969 template<typename Derived> 5970 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5971 TypeOfExprTypeLoc TL) { 5972 // typeof expressions are not potentially evaluated contexts 5973 EnterExpressionEvaluationContext Unevaluated( 5974 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5975 Sema::ReuseLambdaContextDecl); 5976 5977 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5978 if (E.isInvalid()) 5979 return QualType(); 5980 5981 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5982 if (E.isInvalid()) 5983 return QualType(); 5984 5985 QualType Result = TL.getType(); 5986 if (getDerived().AlwaysRebuild() || 5987 E.get() != TL.getUnderlyingExpr()) { 5988 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5989 if (Result.isNull()) 5990 return QualType(); 5991 } 5992 else E.get(); 5993 5994 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5995 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5996 NewTL.setLParenLoc(TL.getLParenLoc()); 5997 NewTL.setRParenLoc(TL.getRParenLoc()); 5998 5999 return Result; 6000 } 6001 6002 template<typename Derived> 6003 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6004 TypeOfTypeLoc TL) { 6005 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6006 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6007 if (!New_Under_TI) 6008 return QualType(); 6009 6010 QualType Result = TL.getType(); 6011 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6012 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6013 if (Result.isNull()) 6014 return QualType(); 6015 } 6016 6017 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6018 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6019 NewTL.setLParenLoc(TL.getLParenLoc()); 6020 NewTL.setRParenLoc(TL.getRParenLoc()); 6021 NewTL.setUnderlyingTInfo(New_Under_TI); 6022 6023 return Result; 6024 } 6025 6026 template<typename Derived> 6027 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6028 DecltypeTypeLoc TL) { 6029 const DecltypeType *T = TL.getTypePtr(); 6030 6031 // decltype expressions are not potentially evaluated contexts 6032 EnterExpressionEvaluationContext Unevaluated( 6033 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6034 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6035 6036 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6037 if (E.isInvalid()) 6038 return QualType(); 6039 6040 E = getSema().ActOnDecltypeExpression(E.get()); 6041 if (E.isInvalid()) 6042 return QualType(); 6043 6044 QualType Result = TL.getType(); 6045 if (getDerived().AlwaysRebuild() || 6046 E.get() != T->getUnderlyingExpr()) { 6047 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6048 if (Result.isNull()) 6049 return QualType(); 6050 } 6051 else E.get(); 6052 6053 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6054 NewTL.setNameLoc(TL.getNameLoc()); 6055 6056 return Result; 6057 } 6058 6059 template<typename Derived> 6060 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6061 TypeLocBuilder &TLB, 6062 UnaryTransformTypeLoc TL) { 6063 QualType Result = TL.getType(); 6064 if (Result->isDependentType()) { 6065 const UnaryTransformType *T = TL.getTypePtr(); 6066 QualType NewBase = 6067 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6068 Result = getDerived().RebuildUnaryTransformType(NewBase, 6069 T->getUTTKind(), 6070 TL.getKWLoc()); 6071 if (Result.isNull()) 6072 return QualType(); 6073 } 6074 6075 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6076 NewTL.setKWLoc(TL.getKWLoc()); 6077 NewTL.setParensRange(TL.getParensRange()); 6078 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6079 return Result; 6080 } 6081 6082 template<typename Derived> 6083 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6084 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6085 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6086 6087 CXXScopeSpec SS; 6088 TemplateName TemplateName = getDerived().TransformTemplateName( 6089 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6090 if (TemplateName.isNull()) 6091 return QualType(); 6092 6093 QualType OldDeduced = T->getDeducedType(); 6094 QualType NewDeduced; 6095 if (!OldDeduced.isNull()) { 6096 NewDeduced = getDerived().TransformType(OldDeduced); 6097 if (NewDeduced.isNull()) 6098 return QualType(); 6099 } 6100 6101 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6102 TemplateName, NewDeduced); 6103 if (Result.isNull()) 6104 return QualType(); 6105 6106 DeducedTemplateSpecializationTypeLoc NewTL = 6107 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6108 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6109 6110 return Result; 6111 } 6112 6113 template<typename Derived> 6114 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6115 RecordTypeLoc TL) { 6116 const RecordType *T = TL.getTypePtr(); 6117 RecordDecl *Record 6118 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6119 T->getDecl())); 6120 if (!Record) 6121 return QualType(); 6122 6123 QualType Result = TL.getType(); 6124 if (getDerived().AlwaysRebuild() || 6125 Record != T->getDecl()) { 6126 Result = getDerived().RebuildRecordType(Record); 6127 if (Result.isNull()) 6128 return QualType(); 6129 } 6130 6131 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6132 NewTL.setNameLoc(TL.getNameLoc()); 6133 6134 return Result; 6135 } 6136 6137 template<typename Derived> 6138 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6139 EnumTypeLoc TL) { 6140 const EnumType *T = TL.getTypePtr(); 6141 EnumDecl *Enum 6142 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6143 T->getDecl())); 6144 if (!Enum) 6145 return QualType(); 6146 6147 QualType Result = TL.getType(); 6148 if (getDerived().AlwaysRebuild() || 6149 Enum != T->getDecl()) { 6150 Result = getDerived().RebuildEnumType(Enum); 6151 if (Result.isNull()) 6152 return QualType(); 6153 } 6154 6155 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6156 NewTL.setNameLoc(TL.getNameLoc()); 6157 6158 return Result; 6159 } 6160 6161 template<typename Derived> 6162 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6163 TypeLocBuilder &TLB, 6164 InjectedClassNameTypeLoc TL) { 6165 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6166 TL.getTypePtr()->getDecl()); 6167 if (!D) return QualType(); 6168 6169 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6170 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6171 return T; 6172 } 6173 6174 template<typename Derived> 6175 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6176 TypeLocBuilder &TLB, 6177 TemplateTypeParmTypeLoc TL) { 6178 return TransformTypeSpecType(TLB, TL); 6179 } 6180 6181 template<typename Derived> 6182 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6183 TypeLocBuilder &TLB, 6184 SubstTemplateTypeParmTypeLoc TL) { 6185 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6186 6187 // Substitute into the replacement type, which itself might involve something 6188 // that needs to be transformed. This only tends to occur with default 6189 // template arguments of template template parameters. 6190 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6191 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6192 if (Replacement.isNull()) 6193 return QualType(); 6194 6195 // Always canonicalize the replacement type. 6196 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6197 QualType Result 6198 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6199 Replacement); 6200 6201 // Propagate type-source information. 6202 SubstTemplateTypeParmTypeLoc NewTL 6203 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6204 NewTL.setNameLoc(TL.getNameLoc()); 6205 return Result; 6206 6207 } 6208 6209 template<typename Derived> 6210 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6211 TypeLocBuilder &TLB, 6212 SubstTemplateTypeParmPackTypeLoc TL) { 6213 return TransformTypeSpecType(TLB, TL); 6214 } 6215 6216 template<typename Derived> 6217 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6218 TypeLocBuilder &TLB, 6219 TemplateSpecializationTypeLoc TL) { 6220 const TemplateSpecializationType *T = TL.getTypePtr(); 6221 6222 // The nested-name-specifier never matters in a TemplateSpecializationType, 6223 // because we can't have a dependent nested-name-specifier anyway. 6224 CXXScopeSpec SS; 6225 TemplateName Template 6226 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6227 TL.getTemplateNameLoc()); 6228 if (Template.isNull()) 6229 return QualType(); 6230 6231 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6232 } 6233 6234 template<typename Derived> 6235 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6236 AtomicTypeLoc TL) { 6237 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6238 if (ValueType.isNull()) 6239 return QualType(); 6240 6241 QualType Result = TL.getType(); 6242 if (getDerived().AlwaysRebuild() || 6243 ValueType != TL.getValueLoc().getType()) { 6244 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6245 if (Result.isNull()) 6246 return QualType(); 6247 } 6248 6249 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6250 NewTL.setKWLoc(TL.getKWLoc()); 6251 NewTL.setLParenLoc(TL.getLParenLoc()); 6252 NewTL.setRParenLoc(TL.getRParenLoc()); 6253 6254 return Result; 6255 } 6256 6257 template <typename Derived> 6258 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6259 PipeTypeLoc TL) { 6260 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6261 if (ValueType.isNull()) 6262 return QualType(); 6263 6264 QualType Result = TL.getType(); 6265 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6266 const PipeType *PT = Result->castAs<PipeType>(); 6267 bool isReadPipe = PT->isReadOnly(); 6268 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6269 if (Result.isNull()) 6270 return QualType(); 6271 } 6272 6273 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6274 NewTL.setKWLoc(TL.getKWLoc()); 6275 6276 return Result; 6277 } 6278 6279 template <typename Derived> 6280 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6281 ExtIntTypeLoc TL) { 6282 const ExtIntType *EIT = TL.getTypePtr(); 6283 QualType Result = TL.getType(); 6284 6285 if (getDerived().AlwaysRebuild()) { 6286 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6287 EIT->getNumBits(), TL.getNameLoc()); 6288 if (Result.isNull()) 6289 return QualType(); 6290 } 6291 6292 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6293 NewTL.setNameLoc(TL.getNameLoc()); 6294 return Result; 6295 } 6296 6297 template <typename Derived> 6298 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6299 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6300 const DependentExtIntType *EIT = TL.getTypePtr(); 6301 6302 EnterExpressionEvaluationContext Unevaluated( 6303 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6304 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6305 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6306 6307 if (BitsExpr.isInvalid()) 6308 return QualType(); 6309 6310 QualType Result = TL.getType(); 6311 6312 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6313 Result = getDerived().RebuildDependentExtIntType( 6314 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6315 6316 if (Result.isNull()) 6317 return QualType(); 6318 } 6319 6320 if (isa<DependentExtIntType>(Result)) { 6321 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6322 NewTL.setNameLoc(TL.getNameLoc()); 6323 } else { 6324 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6325 NewTL.setNameLoc(TL.getNameLoc()); 6326 } 6327 return Result; 6328 } 6329 6330 /// Simple iterator that traverses the template arguments in a 6331 /// container that provides a \c getArgLoc() member function. 6332 /// 6333 /// This iterator is intended to be used with the iterator form of 6334 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6335 template<typename ArgLocContainer> 6336 class TemplateArgumentLocContainerIterator { 6337 ArgLocContainer *Container; 6338 unsigned Index; 6339 6340 public: 6341 typedef TemplateArgumentLoc value_type; 6342 typedef TemplateArgumentLoc reference; 6343 typedef int difference_type; 6344 typedef std::input_iterator_tag iterator_category; 6345 6346 class pointer { 6347 TemplateArgumentLoc Arg; 6348 6349 public: 6350 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6351 6352 const TemplateArgumentLoc *operator->() const { 6353 return &Arg; 6354 } 6355 }; 6356 6357 6358 TemplateArgumentLocContainerIterator() {} 6359 6360 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6361 unsigned Index) 6362 : Container(&Container), Index(Index) { } 6363 6364 TemplateArgumentLocContainerIterator &operator++() { 6365 ++Index; 6366 return *this; 6367 } 6368 6369 TemplateArgumentLocContainerIterator operator++(int) { 6370 TemplateArgumentLocContainerIterator Old(*this); 6371 ++(*this); 6372 return Old; 6373 } 6374 6375 TemplateArgumentLoc operator*() const { 6376 return Container->getArgLoc(Index); 6377 } 6378 6379 pointer operator->() const { 6380 return pointer(Container->getArgLoc(Index)); 6381 } 6382 6383 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6384 const TemplateArgumentLocContainerIterator &Y) { 6385 return X.Container == Y.Container && X.Index == Y.Index; 6386 } 6387 6388 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6389 const TemplateArgumentLocContainerIterator &Y) { 6390 return !(X == Y); 6391 } 6392 }; 6393 6394 template<typename Derived> 6395 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6396 AutoTypeLoc TL) { 6397 const AutoType *T = TL.getTypePtr(); 6398 QualType OldDeduced = T->getDeducedType(); 6399 QualType NewDeduced; 6400 if (!OldDeduced.isNull()) { 6401 NewDeduced = getDerived().TransformType(OldDeduced); 6402 if (NewDeduced.isNull()) 6403 return QualType(); 6404 } 6405 6406 ConceptDecl *NewCD = nullptr; 6407 TemplateArgumentListInfo NewTemplateArgs; 6408 NestedNameSpecifierLoc NewNestedNameSpec; 6409 if (TL.getTypePtr()->isConstrained()) { 6410 NewCD = cast_or_null<ConceptDecl>( 6411 getDerived().TransformDecl( 6412 TL.getConceptNameLoc(), 6413 TL.getTypePtr()->getTypeConstraintConcept())); 6414 6415 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6416 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6417 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6418 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6419 ArgIterator(TL, 6420 TL.getNumArgs()), 6421 NewTemplateArgs)) 6422 return QualType(); 6423 6424 if (TL.getNestedNameSpecifierLoc()) { 6425 NewNestedNameSpec 6426 = getDerived().TransformNestedNameSpecifierLoc( 6427 TL.getNestedNameSpecifierLoc()); 6428 if (!NewNestedNameSpec) 6429 return QualType(); 6430 } 6431 } 6432 6433 QualType Result = TL.getType(); 6434 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6435 T->isDependentType()) { 6436 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6437 NewArgList.reserve(NewArgList.size()); 6438 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6439 NewArgList.push_back(ArgLoc.getArgument()); 6440 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6441 NewArgList); 6442 if (Result.isNull()) 6443 return QualType(); 6444 } 6445 6446 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6447 NewTL.setNameLoc(TL.getNameLoc()); 6448 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6449 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6450 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6451 NewTL.setFoundDecl(TL.getFoundDecl()); 6452 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6453 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6454 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6455 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6456 6457 return Result; 6458 } 6459 6460 template <typename Derived> 6461 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6462 TypeLocBuilder &TLB, 6463 TemplateSpecializationTypeLoc TL, 6464 TemplateName Template) { 6465 TemplateArgumentListInfo NewTemplateArgs; 6466 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6467 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6468 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6469 ArgIterator; 6470 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6471 ArgIterator(TL, TL.getNumArgs()), 6472 NewTemplateArgs)) 6473 return QualType(); 6474 6475 // FIXME: maybe don't rebuild if all the template arguments are the same. 6476 6477 QualType Result = 6478 getDerived().RebuildTemplateSpecializationType(Template, 6479 TL.getTemplateNameLoc(), 6480 NewTemplateArgs); 6481 6482 if (!Result.isNull()) { 6483 // Specializations of template template parameters are represented as 6484 // TemplateSpecializationTypes, and substitution of type alias templates 6485 // within a dependent context can transform them into 6486 // DependentTemplateSpecializationTypes. 6487 if (isa<DependentTemplateSpecializationType>(Result)) { 6488 DependentTemplateSpecializationTypeLoc NewTL 6489 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6490 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6491 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6492 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6493 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6494 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6495 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6496 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6497 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6498 return Result; 6499 } 6500 6501 TemplateSpecializationTypeLoc NewTL 6502 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6503 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6504 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6505 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6506 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6507 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6508 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6509 } 6510 6511 return Result; 6512 } 6513 6514 template <typename Derived> 6515 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6516 TypeLocBuilder &TLB, 6517 DependentTemplateSpecializationTypeLoc TL, 6518 TemplateName Template, 6519 CXXScopeSpec &SS) { 6520 TemplateArgumentListInfo NewTemplateArgs; 6521 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6522 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6523 typedef TemplateArgumentLocContainerIterator< 6524 DependentTemplateSpecializationTypeLoc> ArgIterator; 6525 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6526 ArgIterator(TL, TL.getNumArgs()), 6527 NewTemplateArgs)) 6528 return QualType(); 6529 6530 // FIXME: maybe don't rebuild if all the template arguments are the same. 6531 6532 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6533 QualType Result 6534 = getSema().Context.getDependentTemplateSpecializationType( 6535 TL.getTypePtr()->getKeyword(), 6536 DTN->getQualifier(), 6537 DTN->getIdentifier(), 6538 NewTemplateArgs); 6539 6540 DependentTemplateSpecializationTypeLoc NewTL 6541 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6542 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6543 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6544 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6545 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6546 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6547 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6548 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6549 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6550 return Result; 6551 } 6552 6553 QualType Result 6554 = getDerived().RebuildTemplateSpecializationType(Template, 6555 TL.getTemplateNameLoc(), 6556 NewTemplateArgs); 6557 6558 if (!Result.isNull()) { 6559 /// FIXME: Wrap this in an elaborated-type-specifier? 6560 TemplateSpecializationTypeLoc NewTL 6561 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6562 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6563 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6564 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6565 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6566 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6567 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6568 } 6569 6570 return Result; 6571 } 6572 6573 template<typename Derived> 6574 QualType 6575 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6576 ElaboratedTypeLoc TL) { 6577 const ElaboratedType *T = TL.getTypePtr(); 6578 6579 NestedNameSpecifierLoc QualifierLoc; 6580 // NOTE: the qualifier in an ElaboratedType is optional. 6581 if (TL.getQualifierLoc()) { 6582 QualifierLoc 6583 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6584 if (!QualifierLoc) 6585 return QualType(); 6586 } 6587 6588 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6589 if (NamedT.isNull()) 6590 return QualType(); 6591 6592 // C++0x [dcl.type.elab]p2: 6593 // If the identifier resolves to a typedef-name or the simple-template-id 6594 // resolves to an alias template specialization, the 6595 // elaborated-type-specifier is ill-formed. 6596 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6597 if (const TemplateSpecializationType *TST = 6598 NamedT->getAs<TemplateSpecializationType>()) { 6599 TemplateName Template = TST->getTemplateName(); 6600 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6601 Template.getAsTemplateDecl())) { 6602 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6603 diag::err_tag_reference_non_tag) 6604 << TAT << Sema::NTK_TypeAliasTemplate 6605 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6606 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6607 } 6608 } 6609 } 6610 6611 QualType Result = TL.getType(); 6612 if (getDerived().AlwaysRebuild() || 6613 QualifierLoc != TL.getQualifierLoc() || 6614 NamedT != T->getNamedType()) { 6615 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6616 T->getKeyword(), 6617 QualifierLoc, NamedT); 6618 if (Result.isNull()) 6619 return QualType(); 6620 } 6621 6622 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6623 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6624 NewTL.setQualifierLoc(QualifierLoc); 6625 return Result; 6626 } 6627 6628 template<typename Derived> 6629 QualType TreeTransform<Derived>::TransformAttributedType( 6630 TypeLocBuilder &TLB, 6631 AttributedTypeLoc TL) { 6632 const AttributedType *oldType = TL.getTypePtr(); 6633 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6634 if (modifiedType.isNull()) 6635 return QualType(); 6636 6637 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6638 const Attr *oldAttr = TL.getAttr(); 6639 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6640 if (oldAttr && !newAttr) 6641 return QualType(); 6642 6643 QualType result = TL.getType(); 6644 6645 // FIXME: dependent operand expressions? 6646 if (getDerived().AlwaysRebuild() || 6647 modifiedType != oldType->getModifiedType()) { 6648 // TODO: this is really lame; we should really be rebuilding the 6649 // equivalent type from first principles. 6650 QualType equivalentType 6651 = getDerived().TransformType(oldType->getEquivalentType()); 6652 if (equivalentType.isNull()) 6653 return QualType(); 6654 6655 // Check whether we can add nullability; it is only represented as 6656 // type sugar, and therefore cannot be diagnosed in any other way. 6657 if (auto nullability = oldType->getImmediateNullability()) { 6658 if (!modifiedType->canHaveNullability()) { 6659 SemaRef.Diag(TL.getAttr()->getLocation(), 6660 diag::err_nullability_nonpointer) 6661 << DiagNullabilityKind(*nullability, false) << modifiedType; 6662 return QualType(); 6663 } 6664 } 6665 6666 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6667 modifiedType, 6668 equivalentType); 6669 } 6670 6671 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6672 newTL.setAttr(newAttr); 6673 return result; 6674 } 6675 6676 template<typename Derived> 6677 QualType 6678 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6679 ParenTypeLoc TL) { 6680 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6681 if (Inner.isNull()) 6682 return QualType(); 6683 6684 QualType Result = TL.getType(); 6685 if (getDerived().AlwaysRebuild() || 6686 Inner != TL.getInnerLoc().getType()) { 6687 Result = getDerived().RebuildParenType(Inner); 6688 if (Result.isNull()) 6689 return QualType(); 6690 } 6691 6692 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6693 NewTL.setLParenLoc(TL.getLParenLoc()); 6694 NewTL.setRParenLoc(TL.getRParenLoc()); 6695 return Result; 6696 } 6697 6698 template <typename Derived> 6699 QualType 6700 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6701 MacroQualifiedTypeLoc TL) { 6702 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6703 if (Inner.isNull()) 6704 return QualType(); 6705 6706 QualType Result = TL.getType(); 6707 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6708 Result = 6709 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6710 if (Result.isNull()) 6711 return QualType(); 6712 } 6713 6714 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6715 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6716 return Result; 6717 } 6718 6719 template<typename Derived> 6720 QualType TreeTransform<Derived>::TransformDependentNameType( 6721 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6722 return TransformDependentNameType(TLB, TL, false); 6723 } 6724 6725 template<typename Derived> 6726 QualType TreeTransform<Derived>::TransformDependentNameType( 6727 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6728 const DependentNameType *T = TL.getTypePtr(); 6729 6730 NestedNameSpecifierLoc QualifierLoc 6731 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6732 if (!QualifierLoc) 6733 return QualType(); 6734 6735 QualType Result 6736 = getDerived().RebuildDependentNameType(T->getKeyword(), 6737 TL.getElaboratedKeywordLoc(), 6738 QualifierLoc, 6739 T->getIdentifier(), 6740 TL.getNameLoc(), 6741 DeducedTSTContext); 6742 if (Result.isNull()) 6743 return QualType(); 6744 6745 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6746 QualType NamedT = ElabT->getNamedType(); 6747 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6748 6749 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6750 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6751 NewTL.setQualifierLoc(QualifierLoc); 6752 } else { 6753 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6754 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6755 NewTL.setQualifierLoc(QualifierLoc); 6756 NewTL.setNameLoc(TL.getNameLoc()); 6757 } 6758 return Result; 6759 } 6760 6761 template<typename Derived> 6762 QualType TreeTransform<Derived>:: 6763 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6764 DependentTemplateSpecializationTypeLoc TL) { 6765 NestedNameSpecifierLoc QualifierLoc; 6766 if (TL.getQualifierLoc()) { 6767 QualifierLoc 6768 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6769 if (!QualifierLoc) 6770 return QualType(); 6771 } 6772 6773 return getDerived() 6774 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6775 } 6776 6777 template<typename Derived> 6778 QualType TreeTransform<Derived>:: 6779 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6780 DependentTemplateSpecializationTypeLoc TL, 6781 NestedNameSpecifierLoc QualifierLoc) { 6782 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6783 6784 TemplateArgumentListInfo NewTemplateArgs; 6785 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6786 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6787 6788 typedef TemplateArgumentLocContainerIterator< 6789 DependentTemplateSpecializationTypeLoc> ArgIterator; 6790 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6791 ArgIterator(TL, TL.getNumArgs()), 6792 NewTemplateArgs)) 6793 return QualType(); 6794 6795 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6796 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6797 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6798 /*AllowInjectedClassName*/ false); 6799 if (Result.isNull()) 6800 return QualType(); 6801 6802 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6803 QualType NamedT = ElabT->getNamedType(); 6804 6805 // Copy information relevant to the template specialization. 6806 TemplateSpecializationTypeLoc NamedTL 6807 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6808 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6809 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6810 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6811 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6812 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6813 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6814 6815 // Copy information relevant to the elaborated type. 6816 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6817 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6818 NewTL.setQualifierLoc(QualifierLoc); 6819 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6820 DependentTemplateSpecializationTypeLoc SpecTL 6821 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6822 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6823 SpecTL.setQualifierLoc(QualifierLoc); 6824 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6825 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6826 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6827 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6828 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6829 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6830 } else { 6831 TemplateSpecializationTypeLoc SpecTL 6832 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6833 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6834 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6835 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6836 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6837 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6838 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6839 } 6840 return Result; 6841 } 6842 6843 template<typename Derived> 6844 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6845 PackExpansionTypeLoc TL) { 6846 QualType Pattern 6847 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6848 if (Pattern.isNull()) 6849 return QualType(); 6850 6851 QualType Result = TL.getType(); 6852 if (getDerived().AlwaysRebuild() || 6853 Pattern != TL.getPatternLoc().getType()) { 6854 Result = getDerived().RebuildPackExpansionType(Pattern, 6855 TL.getPatternLoc().getSourceRange(), 6856 TL.getEllipsisLoc(), 6857 TL.getTypePtr()->getNumExpansions()); 6858 if (Result.isNull()) 6859 return QualType(); 6860 } 6861 6862 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6863 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6864 return Result; 6865 } 6866 6867 template<typename Derived> 6868 QualType 6869 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6870 ObjCInterfaceTypeLoc TL) { 6871 // ObjCInterfaceType is never dependent. 6872 TLB.pushFullCopy(TL); 6873 return TL.getType(); 6874 } 6875 6876 template<typename Derived> 6877 QualType 6878 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6879 ObjCTypeParamTypeLoc TL) { 6880 const ObjCTypeParamType *T = TL.getTypePtr(); 6881 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6882 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6883 if (!OTP) 6884 return QualType(); 6885 6886 QualType Result = TL.getType(); 6887 if (getDerived().AlwaysRebuild() || 6888 OTP != T->getDecl()) { 6889 Result = getDerived().RebuildObjCTypeParamType(OTP, 6890 TL.getProtocolLAngleLoc(), 6891 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6892 TL.getNumProtocols()), 6893 TL.getProtocolLocs(), 6894 TL.getProtocolRAngleLoc()); 6895 if (Result.isNull()) 6896 return QualType(); 6897 } 6898 6899 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6900 if (TL.getNumProtocols()) { 6901 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6902 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6903 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6904 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6905 } 6906 return Result; 6907 } 6908 6909 template<typename Derived> 6910 QualType 6911 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6912 ObjCObjectTypeLoc TL) { 6913 // Transform base type. 6914 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6915 if (BaseType.isNull()) 6916 return QualType(); 6917 6918 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6919 6920 // Transform type arguments. 6921 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6922 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6923 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6924 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6925 QualType TypeArg = TypeArgInfo->getType(); 6926 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6927 AnyChanged = true; 6928 6929 // We have a pack expansion. Instantiate it. 6930 const auto *PackExpansion = PackExpansionLoc.getType() 6931 ->castAs<PackExpansionType>(); 6932 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6933 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6934 Unexpanded); 6935 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6936 6937 // Determine whether the set of unexpanded parameter packs can 6938 // and should be expanded. 6939 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6940 bool Expand = false; 6941 bool RetainExpansion = false; 6942 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6943 if (getDerived().TryExpandParameterPacks( 6944 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6945 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6946 return QualType(); 6947 6948 if (!Expand) { 6949 // We can't expand this pack expansion into separate arguments yet; 6950 // just substitute into the pattern and create a new pack expansion 6951 // type. 6952 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6953 6954 TypeLocBuilder TypeArgBuilder; 6955 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6956 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6957 PatternLoc); 6958 if (NewPatternType.isNull()) 6959 return QualType(); 6960 6961 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6962 NewPatternType, NumExpansions); 6963 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6964 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6965 NewTypeArgInfos.push_back( 6966 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6967 continue; 6968 } 6969 6970 // Substitute into the pack expansion pattern for each slice of the 6971 // pack. 6972 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6973 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6974 6975 TypeLocBuilder TypeArgBuilder; 6976 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6977 6978 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6979 PatternLoc); 6980 if (NewTypeArg.isNull()) 6981 return QualType(); 6982 6983 NewTypeArgInfos.push_back( 6984 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6985 } 6986 6987 continue; 6988 } 6989 6990 TypeLocBuilder TypeArgBuilder; 6991 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6992 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6993 if (NewTypeArg.isNull()) 6994 return QualType(); 6995 6996 // If nothing changed, just keep the old TypeSourceInfo. 6997 if (NewTypeArg == TypeArg) { 6998 NewTypeArgInfos.push_back(TypeArgInfo); 6999 continue; 7000 } 7001 7002 NewTypeArgInfos.push_back( 7003 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7004 AnyChanged = true; 7005 } 7006 7007 QualType Result = TL.getType(); 7008 if (getDerived().AlwaysRebuild() || AnyChanged) { 7009 // Rebuild the type. 7010 Result = getDerived().RebuildObjCObjectType( 7011 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7012 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7013 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7014 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7015 7016 if (Result.isNull()) 7017 return QualType(); 7018 } 7019 7020 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7021 NewT.setHasBaseTypeAsWritten(true); 7022 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7023 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7024 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7025 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7026 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7027 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7028 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7029 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7030 return Result; 7031 } 7032 7033 template<typename Derived> 7034 QualType 7035 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7036 ObjCObjectPointerTypeLoc TL) { 7037 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7038 if (PointeeType.isNull()) 7039 return QualType(); 7040 7041 QualType Result = TL.getType(); 7042 if (getDerived().AlwaysRebuild() || 7043 PointeeType != TL.getPointeeLoc().getType()) { 7044 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7045 TL.getStarLoc()); 7046 if (Result.isNull()) 7047 return QualType(); 7048 } 7049 7050 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7051 NewT.setStarLoc(TL.getStarLoc()); 7052 return Result; 7053 } 7054 7055 //===----------------------------------------------------------------------===// 7056 // Statement transformation 7057 //===----------------------------------------------------------------------===// 7058 template<typename Derived> 7059 StmtResult 7060 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7061 return S; 7062 } 7063 7064 template<typename Derived> 7065 StmtResult 7066 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7067 return getDerived().TransformCompoundStmt(S, false); 7068 } 7069 7070 template<typename Derived> 7071 StmtResult 7072 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7073 bool IsStmtExpr) { 7074 Sema::CompoundScopeRAII CompoundScope(getSema()); 7075 7076 const Stmt *ExprResult = S->getStmtExprResult(); 7077 bool SubStmtInvalid = false; 7078 bool SubStmtChanged = false; 7079 SmallVector<Stmt*, 8> Statements; 7080 for (auto *B : S->body()) { 7081 StmtResult Result = getDerived().TransformStmt( 7082 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7083 7084 if (Result.isInvalid()) { 7085 // Immediately fail if this was a DeclStmt, since it's very 7086 // likely that this will cause problems for future statements. 7087 if (isa<DeclStmt>(B)) 7088 return StmtError(); 7089 7090 // Otherwise, just keep processing substatements and fail later. 7091 SubStmtInvalid = true; 7092 continue; 7093 } 7094 7095 SubStmtChanged = SubStmtChanged || Result.get() != B; 7096 Statements.push_back(Result.getAs<Stmt>()); 7097 } 7098 7099 if (SubStmtInvalid) 7100 return StmtError(); 7101 7102 if (!getDerived().AlwaysRebuild() && 7103 !SubStmtChanged) 7104 return S; 7105 7106 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7107 Statements, 7108 S->getRBracLoc(), 7109 IsStmtExpr); 7110 } 7111 7112 template<typename Derived> 7113 StmtResult 7114 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7115 ExprResult LHS, RHS; 7116 { 7117 EnterExpressionEvaluationContext Unevaluated( 7118 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7119 7120 // Transform the left-hand case value. 7121 LHS = getDerived().TransformExpr(S->getLHS()); 7122 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7123 if (LHS.isInvalid()) 7124 return StmtError(); 7125 7126 // Transform the right-hand case value (for the GNU case-range extension). 7127 RHS = getDerived().TransformExpr(S->getRHS()); 7128 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7129 if (RHS.isInvalid()) 7130 return StmtError(); 7131 } 7132 7133 // Build the case statement. 7134 // Case statements are always rebuilt so that they will attached to their 7135 // transformed switch statement. 7136 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7137 LHS.get(), 7138 S->getEllipsisLoc(), 7139 RHS.get(), 7140 S->getColonLoc()); 7141 if (Case.isInvalid()) 7142 return StmtError(); 7143 7144 // Transform the statement following the case 7145 StmtResult SubStmt = 7146 getDerived().TransformStmt(S->getSubStmt()); 7147 if (SubStmt.isInvalid()) 7148 return StmtError(); 7149 7150 // Attach the body to the case statement 7151 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7152 } 7153 7154 template <typename Derived> 7155 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7156 // Transform the statement following the default case 7157 StmtResult SubStmt = 7158 getDerived().TransformStmt(S->getSubStmt()); 7159 if (SubStmt.isInvalid()) 7160 return StmtError(); 7161 7162 // Default statements are always rebuilt 7163 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7164 SubStmt.get()); 7165 } 7166 7167 template<typename Derived> 7168 StmtResult 7169 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7170 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7171 if (SubStmt.isInvalid()) 7172 return StmtError(); 7173 7174 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7175 S->getDecl()); 7176 if (!LD) 7177 return StmtError(); 7178 7179 // If we're transforming "in-place" (we're not creating new local 7180 // declarations), assume we're replacing the old label statement 7181 // and clear out the reference to it. 7182 if (LD == S->getDecl()) 7183 S->getDecl()->setStmt(nullptr); 7184 7185 // FIXME: Pass the real colon location in. 7186 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7187 cast<LabelDecl>(LD), SourceLocation(), 7188 SubStmt.get()); 7189 } 7190 7191 template <typename Derived> 7192 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7193 if (!R) 7194 return R; 7195 7196 switch (R->getKind()) { 7197 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7198 #define ATTR(X) 7199 #define PRAGMA_SPELLING_ATTR(X) \ 7200 case attr::X: \ 7201 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7202 #include "clang/Basic/AttrList.inc" 7203 default: 7204 return R; 7205 } 7206 } 7207 7208 template <typename Derived> 7209 StmtResult 7210 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7211 StmtDiscardKind SDK) { 7212 bool AttrsChanged = false; 7213 SmallVector<const Attr *, 1> Attrs; 7214 7215 // Visit attributes and keep track if any are transformed. 7216 for (const auto *I : S->getAttrs()) { 7217 const Attr *R = getDerived().TransformAttr(I); 7218 AttrsChanged |= (I != R); 7219 Attrs.push_back(R); 7220 } 7221 7222 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7223 if (SubStmt.isInvalid()) 7224 return StmtError(); 7225 7226 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7227 return S; 7228 7229 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7230 SubStmt.get()); 7231 } 7232 7233 template<typename Derived> 7234 StmtResult 7235 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7236 // Transform the initialization statement 7237 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7238 if (Init.isInvalid()) 7239 return StmtError(); 7240 7241 // Transform the condition 7242 Sema::ConditionResult Cond = getDerived().TransformCondition( 7243 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7244 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7245 : Sema::ConditionKind::Boolean); 7246 if (Cond.isInvalid()) 7247 return StmtError(); 7248 7249 // If this is a constexpr if, determine which arm we should instantiate. 7250 llvm::Optional<bool> ConstexprConditionValue; 7251 if (S->isConstexpr()) 7252 ConstexprConditionValue = Cond.getKnownValue(); 7253 7254 // Transform the "then" branch. 7255 StmtResult Then; 7256 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7257 Then = getDerived().TransformStmt(S->getThen()); 7258 if (Then.isInvalid()) 7259 return StmtError(); 7260 } else { 7261 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7262 } 7263 7264 // Transform the "else" branch. 7265 StmtResult Else; 7266 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7267 Else = getDerived().TransformStmt(S->getElse()); 7268 if (Else.isInvalid()) 7269 return StmtError(); 7270 } 7271 7272 if (!getDerived().AlwaysRebuild() && 7273 Init.get() == S->getInit() && 7274 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7275 Then.get() == S->getThen() && 7276 Else.get() == S->getElse()) 7277 return S; 7278 7279 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 7280 Init.get(), Then.get(), S->getElseLoc(), 7281 Else.get()); 7282 } 7283 7284 template<typename Derived> 7285 StmtResult 7286 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7287 // Transform the initialization statement 7288 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7289 if (Init.isInvalid()) 7290 return StmtError(); 7291 7292 // Transform the condition. 7293 Sema::ConditionResult Cond = getDerived().TransformCondition( 7294 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7295 Sema::ConditionKind::Switch); 7296 if (Cond.isInvalid()) 7297 return StmtError(); 7298 7299 // Rebuild the switch statement. 7300 StmtResult Switch 7301 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 7302 if (Switch.isInvalid()) 7303 return StmtError(); 7304 7305 // Transform the body of the switch statement. 7306 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7307 if (Body.isInvalid()) 7308 return StmtError(); 7309 7310 // Complete the switch statement. 7311 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7312 Body.get()); 7313 } 7314 7315 template<typename Derived> 7316 StmtResult 7317 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7318 // Transform the condition 7319 Sema::ConditionResult Cond = getDerived().TransformCondition( 7320 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7321 Sema::ConditionKind::Boolean); 7322 if (Cond.isInvalid()) 7323 return StmtError(); 7324 7325 // Transform the body 7326 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7327 if (Body.isInvalid()) 7328 return StmtError(); 7329 7330 if (!getDerived().AlwaysRebuild() && 7331 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7332 Body.get() == S->getBody()) 7333 return Owned(S); 7334 7335 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 7336 } 7337 7338 template<typename Derived> 7339 StmtResult 7340 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7341 // Transform the body 7342 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7343 if (Body.isInvalid()) 7344 return StmtError(); 7345 7346 // Transform the condition 7347 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7348 if (Cond.isInvalid()) 7349 return StmtError(); 7350 7351 if (!getDerived().AlwaysRebuild() && 7352 Cond.get() == S->getCond() && 7353 Body.get() == S->getBody()) 7354 return S; 7355 7356 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7357 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7358 S->getRParenLoc()); 7359 } 7360 7361 template<typename Derived> 7362 StmtResult 7363 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7364 if (getSema().getLangOpts().OpenMP) 7365 getSema().startOpenMPLoop(); 7366 7367 // Transform the initialization statement 7368 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7369 if (Init.isInvalid()) 7370 return StmtError(); 7371 7372 // In OpenMP loop region loop control variable must be captured and be 7373 // private. Perform analysis of first part (if any). 7374 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7375 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7376 7377 // Transform the condition 7378 Sema::ConditionResult Cond = getDerived().TransformCondition( 7379 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7380 Sema::ConditionKind::Boolean); 7381 if (Cond.isInvalid()) 7382 return StmtError(); 7383 7384 // Transform the increment 7385 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7386 if (Inc.isInvalid()) 7387 return StmtError(); 7388 7389 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7390 if (S->getInc() && !FullInc.get()) 7391 return StmtError(); 7392 7393 // Transform the body 7394 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7395 if (Body.isInvalid()) 7396 return StmtError(); 7397 7398 if (!getDerived().AlwaysRebuild() && 7399 Init.get() == S->getInit() && 7400 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7401 Inc.get() == S->getInc() && 7402 Body.get() == S->getBody()) 7403 return S; 7404 7405 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7406 Init.get(), Cond, FullInc, 7407 S->getRParenLoc(), Body.get()); 7408 } 7409 7410 template<typename Derived> 7411 StmtResult 7412 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7413 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7414 S->getLabel()); 7415 if (!LD) 7416 return StmtError(); 7417 7418 // Goto statements must always be rebuilt, to resolve the label. 7419 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7420 cast<LabelDecl>(LD)); 7421 } 7422 7423 template<typename Derived> 7424 StmtResult 7425 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7426 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7427 if (Target.isInvalid()) 7428 return StmtError(); 7429 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7430 7431 if (!getDerived().AlwaysRebuild() && 7432 Target.get() == S->getTarget()) 7433 return S; 7434 7435 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7436 Target.get()); 7437 } 7438 7439 template<typename Derived> 7440 StmtResult 7441 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7442 return S; 7443 } 7444 7445 template<typename Derived> 7446 StmtResult 7447 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7448 return S; 7449 } 7450 7451 template<typename Derived> 7452 StmtResult 7453 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7454 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7455 /*NotCopyInit*/false); 7456 if (Result.isInvalid()) 7457 return StmtError(); 7458 7459 // FIXME: We always rebuild the return statement because there is no way 7460 // to tell whether the return type of the function has changed. 7461 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7462 } 7463 7464 template<typename Derived> 7465 StmtResult 7466 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7467 bool DeclChanged = false; 7468 SmallVector<Decl *, 4> Decls; 7469 for (auto *D : S->decls()) { 7470 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7471 if (!Transformed) 7472 return StmtError(); 7473 7474 if (Transformed != D) 7475 DeclChanged = true; 7476 7477 Decls.push_back(Transformed); 7478 } 7479 7480 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7481 return S; 7482 7483 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7484 } 7485 7486 template<typename Derived> 7487 StmtResult 7488 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7489 7490 SmallVector<Expr*, 8> Constraints; 7491 SmallVector<Expr*, 8> Exprs; 7492 SmallVector<IdentifierInfo *, 4> Names; 7493 7494 ExprResult AsmString; 7495 SmallVector<Expr*, 8> Clobbers; 7496 7497 bool ExprsChanged = false; 7498 7499 // Go through the outputs. 7500 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7501 Names.push_back(S->getOutputIdentifier(I)); 7502 7503 // No need to transform the constraint literal. 7504 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7505 7506 // Transform the output expr. 7507 Expr *OutputExpr = S->getOutputExpr(I); 7508 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7509 if (Result.isInvalid()) 7510 return StmtError(); 7511 7512 ExprsChanged |= Result.get() != OutputExpr; 7513 7514 Exprs.push_back(Result.get()); 7515 } 7516 7517 // Go through the inputs. 7518 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7519 Names.push_back(S->getInputIdentifier(I)); 7520 7521 // No need to transform the constraint literal. 7522 Constraints.push_back(S->getInputConstraintLiteral(I)); 7523 7524 // Transform the input expr. 7525 Expr *InputExpr = S->getInputExpr(I); 7526 ExprResult Result = getDerived().TransformExpr(InputExpr); 7527 if (Result.isInvalid()) 7528 return StmtError(); 7529 7530 ExprsChanged |= Result.get() != InputExpr; 7531 7532 Exprs.push_back(Result.get()); 7533 } 7534 7535 // Go through the Labels. 7536 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7537 Names.push_back(S->getLabelIdentifier(I)); 7538 7539 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7540 if (Result.isInvalid()) 7541 return StmtError(); 7542 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7543 Exprs.push_back(Result.get()); 7544 } 7545 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7546 return S; 7547 7548 // Go through the clobbers. 7549 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7550 Clobbers.push_back(S->getClobberStringLiteral(I)); 7551 7552 // No need to transform the asm string literal. 7553 AsmString = S->getAsmString(); 7554 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7555 S->isVolatile(), S->getNumOutputs(), 7556 S->getNumInputs(), Names.data(), 7557 Constraints, Exprs, AsmString.get(), 7558 Clobbers, S->getNumLabels(), 7559 S->getRParenLoc()); 7560 } 7561 7562 template<typename Derived> 7563 StmtResult 7564 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7565 ArrayRef<Token> AsmToks = 7566 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7567 7568 bool HadError = false, HadChange = false; 7569 7570 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7571 SmallVector<Expr*, 8> TransformedExprs; 7572 TransformedExprs.reserve(SrcExprs.size()); 7573 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7574 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7575 if (!Result.isUsable()) { 7576 HadError = true; 7577 } else { 7578 HadChange |= (Result.get() != SrcExprs[i]); 7579 TransformedExprs.push_back(Result.get()); 7580 } 7581 } 7582 7583 if (HadError) return StmtError(); 7584 if (!HadChange && !getDerived().AlwaysRebuild()) 7585 return Owned(S); 7586 7587 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7588 AsmToks, S->getAsmString(), 7589 S->getNumOutputs(), S->getNumInputs(), 7590 S->getAllConstraints(), S->getClobbers(), 7591 TransformedExprs, S->getEndLoc()); 7592 } 7593 7594 // C++ Coroutines TS 7595 7596 template<typename Derived> 7597 StmtResult 7598 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7599 auto *ScopeInfo = SemaRef.getCurFunction(); 7600 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7601 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7602 ScopeInfo->NeedsCoroutineSuspends && 7603 ScopeInfo->CoroutineSuspends.first == nullptr && 7604 ScopeInfo->CoroutineSuspends.second == nullptr && 7605 "expected clean scope info"); 7606 7607 // Set that we have (possibly-invalid) suspend points before we do anything 7608 // that may fail. 7609 ScopeInfo->setNeedsCoroutineSuspends(false); 7610 7611 // We re-build the coroutine promise object (and the coroutine parameters its 7612 // type and constructor depend on) based on the types used in our current 7613 // function. We must do so, and set it on the current FunctionScopeInfo, 7614 // before attempting to transform the other parts of the coroutine body 7615 // statement, such as the implicit suspend statements (because those 7616 // statements reference the FunctionScopeInfo::CoroutinePromise). 7617 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7618 return StmtError(); 7619 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7620 if (!Promise) 7621 return StmtError(); 7622 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7623 ScopeInfo->CoroutinePromise = Promise; 7624 7625 // Transform the implicit coroutine statements constructed using dependent 7626 // types during the previous parse: initial and final suspensions, the return 7627 // object, and others. We also transform the coroutine function's body. 7628 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7629 if (InitSuspend.isInvalid()) 7630 return StmtError(); 7631 StmtResult FinalSuspend = 7632 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7633 if (FinalSuspend.isInvalid()) 7634 return StmtError(); 7635 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7636 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7637 7638 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7639 if (BodyRes.isInvalid()) 7640 return StmtError(); 7641 7642 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7643 if (Builder.isInvalid()) 7644 return StmtError(); 7645 7646 Expr *ReturnObject = S->getReturnValueInit(); 7647 assert(ReturnObject && "the return object is expected to be valid"); 7648 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7649 /*NoCopyInit*/ false); 7650 if (Res.isInvalid()) 7651 return StmtError(); 7652 Builder.ReturnValue = Res.get(); 7653 7654 // If during the previous parse the coroutine still had a dependent promise 7655 // statement, we may need to build some implicit coroutine statements 7656 // (such as exception and fallthrough handlers) for the first time. 7657 if (S->hasDependentPromiseType()) { 7658 // We can only build these statements, however, if the current promise type 7659 // is not dependent. 7660 if (!Promise->getType()->isDependentType()) { 7661 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7662 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7663 "these nodes should not have been built yet"); 7664 if (!Builder.buildDependentStatements()) 7665 return StmtError(); 7666 } 7667 } else { 7668 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7669 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7670 if (Res.isInvalid()) 7671 return StmtError(); 7672 Builder.OnFallthrough = Res.get(); 7673 } 7674 7675 if (auto *OnException = S->getExceptionHandler()) { 7676 StmtResult Res = getDerived().TransformStmt(OnException); 7677 if (Res.isInvalid()) 7678 return StmtError(); 7679 Builder.OnException = Res.get(); 7680 } 7681 7682 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7683 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7684 if (Res.isInvalid()) 7685 return StmtError(); 7686 Builder.ReturnStmtOnAllocFailure = Res.get(); 7687 } 7688 7689 // Transform any additional statements we may have already built 7690 assert(S->getAllocate() && S->getDeallocate() && 7691 "allocation and deallocation calls must already be built"); 7692 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7693 if (AllocRes.isInvalid()) 7694 return StmtError(); 7695 Builder.Allocate = AllocRes.get(); 7696 7697 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7698 if (DeallocRes.isInvalid()) 7699 return StmtError(); 7700 Builder.Deallocate = DeallocRes.get(); 7701 7702 assert(S->getResultDecl() && "ResultDecl must already be built"); 7703 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7704 if (ResultDecl.isInvalid()) 7705 return StmtError(); 7706 Builder.ResultDecl = ResultDecl.get(); 7707 7708 if (auto *ReturnStmt = S->getReturnStmt()) { 7709 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7710 if (Res.isInvalid()) 7711 return StmtError(); 7712 Builder.ReturnStmt = Res.get(); 7713 } 7714 } 7715 7716 return getDerived().RebuildCoroutineBodyStmt(Builder); 7717 } 7718 7719 template<typename Derived> 7720 StmtResult 7721 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7722 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7723 /*NotCopyInit*/false); 7724 if (Result.isInvalid()) 7725 return StmtError(); 7726 7727 // Always rebuild; we don't know if this needs to be injected into a new 7728 // context or if the promise type has changed. 7729 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7730 S->isImplicit()); 7731 } 7732 7733 template<typename Derived> 7734 ExprResult 7735 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7736 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7737 /*NotCopyInit*/false); 7738 if (Result.isInvalid()) 7739 return ExprError(); 7740 7741 // Always rebuild; we don't know if this needs to be injected into a new 7742 // context or if the promise type has changed. 7743 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7744 E->isImplicit()); 7745 } 7746 7747 template <typename Derived> 7748 ExprResult 7749 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7750 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7751 /*NotCopyInit*/ false); 7752 if (OperandResult.isInvalid()) 7753 return ExprError(); 7754 7755 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7756 E->getOperatorCoawaitLookup()); 7757 7758 if (LookupResult.isInvalid()) 7759 return ExprError(); 7760 7761 // Always rebuild; we don't know if this needs to be injected into a new 7762 // context or if the promise type has changed. 7763 return getDerived().RebuildDependentCoawaitExpr( 7764 E->getKeywordLoc(), OperandResult.get(), 7765 cast<UnresolvedLookupExpr>(LookupResult.get())); 7766 } 7767 7768 template<typename Derived> 7769 ExprResult 7770 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7771 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7772 /*NotCopyInit*/false); 7773 if (Result.isInvalid()) 7774 return ExprError(); 7775 7776 // Always rebuild; we don't know if this needs to be injected into a new 7777 // context or if the promise type has changed. 7778 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7779 } 7780 7781 // Objective-C Statements. 7782 7783 template<typename Derived> 7784 StmtResult 7785 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7786 // Transform the body of the @try. 7787 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7788 if (TryBody.isInvalid()) 7789 return StmtError(); 7790 7791 // Transform the @catch statements (if present). 7792 bool AnyCatchChanged = false; 7793 SmallVector<Stmt*, 8> CatchStmts; 7794 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7795 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7796 if (Catch.isInvalid()) 7797 return StmtError(); 7798 if (Catch.get() != S->getCatchStmt(I)) 7799 AnyCatchChanged = true; 7800 CatchStmts.push_back(Catch.get()); 7801 } 7802 7803 // Transform the @finally statement (if present). 7804 StmtResult Finally; 7805 if (S->getFinallyStmt()) { 7806 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7807 if (Finally.isInvalid()) 7808 return StmtError(); 7809 } 7810 7811 // If nothing changed, just retain this statement. 7812 if (!getDerived().AlwaysRebuild() && 7813 TryBody.get() == S->getTryBody() && 7814 !AnyCatchChanged && 7815 Finally.get() == S->getFinallyStmt()) 7816 return S; 7817 7818 // Build a new statement. 7819 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7820 CatchStmts, Finally.get()); 7821 } 7822 7823 template<typename Derived> 7824 StmtResult 7825 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7826 // Transform the @catch parameter, if there is one. 7827 VarDecl *Var = nullptr; 7828 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7829 TypeSourceInfo *TSInfo = nullptr; 7830 if (FromVar->getTypeSourceInfo()) { 7831 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7832 if (!TSInfo) 7833 return StmtError(); 7834 } 7835 7836 QualType T; 7837 if (TSInfo) 7838 T = TSInfo->getType(); 7839 else { 7840 T = getDerived().TransformType(FromVar->getType()); 7841 if (T.isNull()) 7842 return StmtError(); 7843 } 7844 7845 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7846 if (!Var) 7847 return StmtError(); 7848 } 7849 7850 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7851 if (Body.isInvalid()) 7852 return StmtError(); 7853 7854 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7855 S->getRParenLoc(), 7856 Var, Body.get()); 7857 } 7858 7859 template<typename Derived> 7860 StmtResult 7861 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7862 // Transform the body. 7863 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7864 if (Body.isInvalid()) 7865 return StmtError(); 7866 7867 // If nothing changed, just retain this statement. 7868 if (!getDerived().AlwaysRebuild() && 7869 Body.get() == S->getFinallyBody()) 7870 return S; 7871 7872 // Build a new statement. 7873 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7874 Body.get()); 7875 } 7876 7877 template<typename Derived> 7878 StmtResult 7879 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7880 ExprResult Operand; 7881 if (S->getThrowExpr()) { 7882 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7883 if (Operand.isInvalid()) 7884 return StmtError(); 7885 } 7886 7887 if (!getDerived().AlwaysRebuild() && 7888 Operand.get() == S->getThrowExpr()) 7889 return S; 7890 7891 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7892 } 7893 7894 template<typename Derived> 7895 StmtResult 7896 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7897 ObjCAtSynchronizedStmt *S) { 7898 // Transform the object we are locking. 7899 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7900 if (Object.isInvalid()) 7901 return StmtError(); 7902 Object = 7903 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7904 Object.get()); 7905 if (Object.isInvalid()) 7906 return StmtError(); 7907 7908 // Transform the body. 7909 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7910 if (Body.isInvalid()) 7911 return StmtError(); 7912 7913 // If nothing change, just retain the current statement. 7914 if (!getDerived().AlwaysRebuild() && 7915 Object.get() == S->getSynchExpr() && 7916 Body.get() == S->getSynchBody()) 7917 return S; 7918 7919 // Build a new statement. 7920 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7921 Object.get(), Body.get()); 7922 } 7923 7924 template<typename Derived> 7925 StmtResult 7926 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7927 ObjCAutoreleasePoolStmt *S) { 7928 // Transform the body. 7929 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7930 if (Body.isInvalid()) 7931 return StmtError(); 7932 7933 // If nothing changed, just retain this statement. 7934 if (!getDerived().AlwaysRebuild() && 7935 Body.get() == S->getSubStmt()) 7936 return S; 7937 7938 // Build a new statement. 7939 return getDerived().RebuildObjCAutoreleasePoolStmt( 7940 S->getAtLoc(), Body.get()); 7941 } 7942 7943 template<typename Derived> 7944 StmtResult 7945 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7946 ObjCForCollectionStmt *S) { 7947 // Transform the element statement. 7948 StmtResult Element = 7949 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7950 if (Element.isInvalid()) 7951 return StmtError(); 7952 7953 // Transform the collection expression. 7954 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7955 if (Collection.isInvalid()) 7956 return StmtError(); 7957 7958 // Transform the body. 7959 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7960 if (Body.isInvalid()) 7961 return StmtError(); 7962 7963 // If nothing changed, just retain this statement. 7964 if (!getDerived().AlwaysRebuild() && 7965 Element.get() == S->getElement() && 7966 Collection.get() == S->getCollection() && 7967 Body.get() == S->getBody()) 7968 return S; 7969 7970 // Build a new statement. 7971 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7972 Element.get(), 7973 Collection.get(), 7974 S->getRParenLoc(), 7975 Body.get()); 7976 } 7977 7978 template <typename Derived> 7979 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7980 // Transform the exception declaration, if any. 7981 VarDecl *Var = nullptr; 7982 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7983 TypeSourceInfo *T = 7984 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7985 if (!T) 7986 return StmtError(); 7987 7988 Var = getDerived().RebuildExceptionDecl( 7989 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7990 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7991 if (!Var || Var->isInvalidDecl()) 7992 return StmtError(); 7993 } 7994 7995 // Transform the actual exception handler. 7996 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7997 if (Handler.isInvalid()) 7998 return StmtError(); 7999 8000 if (!getDerived().AlwaysRebuild() && !Var && 8001 Handler.get() == S->getHandlerBlock()) 8002 return S; 8003 8004 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8005 } 8006 8007 template <typename Derived> 8008 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8009 // Transform the try block itself. 8010 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8011 if (TryBlock.isInvalid()) 8012 return StmtError(); 8013 8014 // Transform the handlers. 8015 bool HandlerChanged = false; 8016 SmallVector<Stmt *, 8> Handlers; 8017 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8018 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8019 if (Handler.isInvalid()) 8020 return StmtError(); 8021 8022 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8023 Handlers.push_back(Handler.getAs<Stmt>()); 8024 } 8025 8026 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8027 !HandlerChanged) 8028 return S; 8029 8030 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8031 Handlers); 8032 } 8033 8034 template<typename Derived> 8035 StmtResult 8036 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8037 StmtResult Init = 8038 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8039 if (Init.isInvalid()) 8040 return StmtError(); 8041 8042 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8043 if (Range.isInvalid()) 8044 return StmtError(); 8045 8046 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8047 if (Begin.isInvalid()) 8048 return StmtError(); 8049 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8050 if (End.isInvalid()) 8051 return StmtError(); 8052 8053 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8054 if (Cond.isInvalid()) 8055 return StmtError(); 8056 if (Cond.get()) 8057 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8058 if (Cond.isInvalid()) 8059 return StmtError(); 8060 if (Cond.get()) 8061 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8062 8063 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8064 if (Inc.isInvalid()) 8065 return StmtError(); 8066 if (Inc.get()) 8067 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8068 8069 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8070 if (LoopVar.isInvalid()) 8071 return StmtError(); 8072 8073 StmtResult NewStmt = S; 8074 if (getDerived().AlwaysRebuild() || 8075 Init.get() != S->getInit() || 8076 Range.get() != S->getRangeStmt() || 8077 Begin.get() != S->getBeginStmt() || 8078 End.get() != S->getEndStmt() || 8079 Cond.get() != S->getCond() || 8080 Inc.get() != S->getInc() || 8081 LoopVar.get() != S->getLoopVarStmt()) { 8082 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8083 S->getCoawaitLoc(), Init.get(), 8084 S->getColonLoc(), Range.get(), 8085 Begin.get(), End.get(), 8086 Cond.get(), 8087 Inc.get(), LoopVar.get(), 8088 S->getRParenLoc()); 8089 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8090 // Might not have attached any initializer to the loop variable. 8091 getSema().ActOnInitializerError( 8092 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8093 return StmtError(); 8094 } 8095 } 8096 8097 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8098 if (Body.isInvalid()) 8099 return StmtError(); 8100 8101 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8102 // it now so we have a new statement to attach the body to. 8103 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8104 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8105 S->getCoawaitLoc(), Init.get(), 8106 S->getColonLoc(), Range.get(), 8107 Begin.get(), End.get(), 8108 Cond.get(), 8109 Inc.get(), LoopVar.get(), 8110 S->getRParenLoc()); 8111 if (NewStmt.isInvalid()) 8112 return StmtError(); 8113 } 8114 8115 if (NewStmt.get() == S) 8116 return S; 8117 8118 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8119 } 8120 8121 template<typename Derived> 8122 StmtResult 8123 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8124 MSDependentExistsStmt *S) { 8125 // Transform the nested-name-specifier, if any. 8126 NestedNameSpecifierLoc QualifierLoc; 8127 if (S->getQualifierLoc()) { 8128 QualifierLoc 8129 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8130 if (!QualifierLoc) 8131 return StmtError(); 8132 } 8133 8134 // Transform the declaration name. 8135 DeclarationNameInfo NameInfo = S->getNameInfo(); 8136 if (NameInfo.getName()) { 8137 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8138 if (!NameInfo.getName()) 8139 return StmtError(); 8140 } 8141 8142 // Check whether anything changed. 8143 if (!getDerived().AlwaysRebuild() && 8144 QualifierLoc == S->getQualifierLoc() && 8145 NameInfo.getName() == S->getNameInfo().getName()) 8146 return S; 8147 8148 // Determine whether this name exists, if we can. 8149 CXXScopeSpec SS; 8150 SS.Adopt(QualifierLoc); 8151 bool Dependent = false; 8152 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8153 case Sema::IER_Exists: 8154 if (S->isIfExists()) 8155 break; 8156 8157 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8158 8159 case Sema::IER_DoesNotExist: 8160 if (S->isIfNotExists()) 8161 break; 8162 8163 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8164 8165 case Sema::IER_Dependent: 8166 Dependent = true; 8167 break; 8168 8169 case Sema::IER_Error: 8170 return StmtError(); 8171 } 8172 8173 // We need to continue with the instantiation, so do so now. 8174 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8175 if (SubStmt.isInvalid()) 8176 return StmtError(); 8177 8178 // If we have resolved the name, just transform to the substatement. 8179 if (!Dependent) 8180 return SubStmt; 8181 8182 // The name is still dependent, so build a dependent expression again. 8183 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8184 S->isIfExists(), 8185 QualifierLoc, 8186 NameInfo, 8187 SubStmt.get()); 8188 } 8189 8190 template<typename Derived> 8191 ExprResult 8192 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8193 NestedNameSpecifierLoc QualifierLoc; 8194 if (E->getQualifierLoc()) { 8195 QualifierLoc 8196 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8197 if (!QualifierLoc) 8198 return ExprError(); 8199 } 8200 8201 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8202 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8203 if (!PD) 8204 return ExprError(); 8205 8206 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8207 if (Base.isInvalid()) 8208 return ExprError(); 8209 8210 return new (SemaRef.getASTContext()) 8211 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8212 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8213 QualifierLoc, E->getMemberLoc()); 8214 } 8215 8216 template <typename Derived> 8217 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8218 MSPropertySubscriptExpr *E) { 8219 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8220 if (BaseRes.isInvalid()) 8221 return ExprError(); 8222 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8223 if (IdxRes.isInvalid()) 8224 return ExprError(); 8225 8226 if (!getDerived().AlwaysRebuild() && 8227 BaseRes.get() == E->getBase() && 8228 IdxRes.get() == E->getIdx()) 8229 return E; 8230 8231 return getDerived().RebuildArraySubscriptExpr( 8232 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8233 } 8234 8235 template <typename Derived> 8236 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8237 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8238 if (TryBlock.isInvalid()) 8239 return StmtError(); 8240 8241 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8242 if (Handler.isInvalid()) 8243 return StmtError(); 8244 8245 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8246 Handler.get() == S->getHandler()) 8247 return S; 8248 8249 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8250 TryBlock.get(), Handler.get()); 8251 } 8252 8253 template <typename Derived> 8254 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8255 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8256 if (Block.isInvalid()) 8257 return StmtError(); 8258 8259 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8260 } 8261 8262 template <typename Derived> 8263 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8264 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8265 if (FilterExpr.isInvalid()) 8266 return StmtError(); 8267 8268 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8269 if (Block.isInvalid()) 8270 return StmtError(); 8271 8272 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8273 Block.get()); 8274 } 8275 8276 template <typename Derived> 8277 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8278 if (isa<SEHFinallyStmt>(Handler)) 8279 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8280 else 8281 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8282 } 8283 8284 template<typename Derived> 8285 StmtResult 8286 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8287 return S; 8288 } 8289 8290 //===----------------------------------------------------------------------===// 8291 // OpenMP directive transformation 8292 //===----------------------------------------------------------------------===// 8293 template <typename Derived> 8294 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8295 OMPExecutableDirective *D) { 8296 8297 // Transform the clauses 8298 llvm::SmallVector<OMPClause *, 16> TClauses; 8299 ArrayRef<OMPClause *> Clauses = D->clauses(); 8300 TClauses.reserve(Clauses.size()); 8301 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8302 I != E; ++I) { 8303 if (*I) { 8304 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8305 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8306 getDerived().getSema().EndOpenMPClause(); 8307 if (Clause) 8308 TClauses.push_back(Clause); 8309 } else { 8310 TClauses.push_back(nullptr); 8311 } 8312 } 8313 StmtResult AssociatedStmt; 8314 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8315 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8316 /*CurScope=*/nullptr); 8317 StmtResult Body; 8318 { 8319 Sema::CompoundScopeRAII CompoundScope(getSema()); 8320 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8321 Body = getDerived().TransformStmt(CS); 8322 } 8323 AssociatedStmt = 8324 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8325 if (AssociatedStmt.isInvalid()) { 8326 return StmtError(); 8327 } 8328 } 8329 if (TClauses.size() != Clauses.size()) { 8330 return StmtError(); 8331 } 8332 8333 // Transform directive name for 'omp critical' directive. 8334 DeclarationNameInfo DirName; 8335 if (D->getDirectiveKind() == OMPD_critical) { 8336 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8337 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8338 } 8339 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8340 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8341 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8342 } else if (D->getDirectiveKind() == OMPD_cancel) { 8343 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8344 } 8345 8346 return getDerived().RebuildOMPExecutableDirective( 8347 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8348 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8349 } 8350 8351 template <typename Derived> 8352 StmtResult 8353 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8354 DeclarationNameInfo DirName; 8355 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8356 D->getBeginLoc()); 8357 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8358 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8359 return Res; 8360 } 8361 8362 template <typename Derived> 8363 StmtResult 8364 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8365 DeclarationNameInfo DirName; 8366 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8367 D->getBeginLoc()); 8368 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8369 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8370 return Res; 8371 } 8372 8373 template <typename Derived> 8374 StmtResult 8375 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8376 DeclarationNameInfo DirName; 8377 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8378 D->getBeginLoc()); 8379 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8380 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8381 return Res; 8382 } 8383 8384 template <typename Derived> 8385 StmtResult 8386 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8387 DeclarationNameInfo DirName; 8388 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8389 D->getBeginLoc()); 8390 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8391 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8392 return Res; 8393 } 8394 8395 template <typename Derived> 8396 StmtResult 8397 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8398 DeclarationNameInfo DirName; 8399 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8400 D->getBeginLoc()); 8401 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8402 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8403 return Res; 8404 } 8405 8406 template <typename Derived> 8407 StmtResult 8408 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8409 DeclarationNameInfo DirName; 8410 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8411 D->getBeginLoc()); 8412 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8413 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8414 return Res; 8415 } 8416 8417 template <typename Derived> 8418 StmtResult 8419 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8420 DeclarationNameInfo DirName; 8421 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8422 D->getBeginLoc()); 8423 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8424 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8425 return Res; 8426 } 8427 8428 template <typename Derived> 8429 StmtResult 8430 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8431 DeclarationNameInfo DirName; 8432 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8433 D->getBeginLoc()); 8434 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8435 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8436 return Res; 8437 } 8438 8439 template <typename Derived> 8440 StmtResult 8441 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8442 getDerived().getSema().StartOpenMPDSABlock( 8443 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8444 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8445 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8446 return Res; 8447 } 8448 8449 template <typename Derived> 8450 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8451 OMPParallelForDirective *D) { 8452 DeclarationNameInfo DirName; 8453 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8454 nullptr, D->getBeginLoc()); 8455 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8456 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8457 return Res; 8458 } 8459 8460 template <typename Derived> 8461 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8462 OMPParallelForSimdDirective *D) { 8463 DeclarationNameInfo DirName; 8464 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8465 nullptr, D->getBeginLoc()); 8466 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8467 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8468 return Res; 8469 } 8470 8471 template <typename Derived> 8472 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8473 OMPParallelMasterDirective *D) { 8474 DeclarationNameInfo DirName; 8475 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8476 nullptr, D->getBeginLoc()); 8477 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8478 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8479 return Res; 8480 } 8481 8482 template <typename Derived> 8483 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8484 OMPParallelSectionsDirective *D) { 8485 DeclarationNameInfo DirName; 8486 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8487 nullptr, D->getBeginLoc()); 8488 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8489 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8490 return Res; 8491 } 8492 8493 template <typename Derived> 8494 StmtResult 8495 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8496 DeclarationNameInfo DirName; 8497 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8498 D->getBeginLoc()); 8499 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8500 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8501 return Res; 8502 } 8503 8504 template <typename Derived> 8505 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8506 OMPTaskyieldDirective *D) { 8507 DeclarationNameInfo DirName; 8508 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8509 D->getBeginLoc()); 8510 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8511 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8512 return Res; 8513 } 8514 8515 template <typename Derived> 8516 StmtResult 8517 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8518 DeclarationNameInfo DirName; 8519 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8520 D->getBeginLoc()); 8521 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8522 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8523 return Res; 8524 } 8525 8526 template <typename Derived> 8527 StmtResult 8528 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8529 DeclarationNameInfo DirName; 8530 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8531 D->getBeginLoc()); 8532 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8533 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8534 return Res; 8535 } 8536 8537 template <typename Derived> 8538 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8539 OMPTaskgroupDirective *D) { 8540 DeclarationNameInfo DirName; 8541 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8542 D->getBeginLoc()); 8543 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8544 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8545 return Res; 8546 } 8547 8548 template <typename Derived> 8549 StmtResult 8550 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8551 DeclarationNameInfo DirName; 8552 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8553 D->getBeginLoc()); 8554 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8555 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8556 return Res; 8557 } 8558 8559 template <typename Derived> 8560 StmtResult 8561 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8562 DeclarationNameInfo DirName; 8563 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8564 D->getBeginLoc()); 8565 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8566 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8567 return Res; 8568 } 8569 8570 template <typename Derived> 8571 StmtResult 8572 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8573 DeclarationNameInfo DirName; 8574 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8575 D->getBeginLoc()); 8576 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8577 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8578 return Res; 8579 } 8580 8581 template <typename Derived> 8582 StmtResult 8583 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8584 DeclarationNameInfo DirName; 8585 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8586 D->getBeginLoc()); 8587 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8588 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8589 return Res; 8590 } 8591 8592 template <typename Derived> 8593 StmtResult 8594 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8595 DeclarationNameInfo DirName; 8596 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8597 D->getBeginLoc()); 8598 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8599 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8600 return Res; 8601 } 8602 8603 template <typename Derived> 8604 StmtResult 8605 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8606 DeclarationNameInfo DirName; 8607 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8608 D->getBeginLoc()); 8609 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8610 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8611 return Res; 8612 } 8613 8614 template <typename Derived> 8615 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8616 OMPTargetDataDirective *D) { 8617 DeclarationNameInfo DirName; 8618 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8619 D->getBeginLoc()); 8620 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8621 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8622 return Res; 8623 } 8624 8625 template <typename Derived> 8626 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8627 OMPTargetEnterDataDirective *D) { 8628 DeclarationNameInfo DirName; 8629 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8630 nullptr, D->getBeginLoc()); 8631 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8632 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8633 return Res; 8634 } 8635 8636 template <typename Derived> 8637 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8638 OMPTargetExitDataDirective *D) { 8639 DeclarationNameInfo DirName; 8640 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8641 nullptr, D->getBeginLoc()); 8642 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8643 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8644 return Res; 8645 } 8646 8647 template <typename Derived> 8648 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8649 OMPTargetParallelDirective *D) { 8650 DeclarationNameInfo DirName; 8651 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8652 nullptr, D->getBeginLoc()); 8653 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8654 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8655 return Res; 8656 } 8657 8658 template <typename Derived> 8659 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8660 OMPTargetParallelForDirective *D) { 8661 DeclarationNameInfo DirName; 8662 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8663 nullptr, D->getBeginLoc()); 8664 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8665 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8666 return Res; 8667 } 8668 8669 template <typename Derived> 8670 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8671 OMPTargetUpdateDirective *D) { 8672 DeclarationNameInfo DirName; 8673 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8674 nullptr, D->getBeginLoc()); 8675 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8676 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8677 return Res; 8678 } 8679 8680 template <typename Derived> 8681 StmtResult 8682 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8683 DeclarationNameInfo DirName; 8684 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8685 D->getBeginLoc()); 8686 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8687 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8688 return Res; 8689 } 8690 8691 template <typename Derived> 8692 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8693 OMPCancellationPointDirective *D) { 8694 DeclarationNameInfo DirName; 8695 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8696 nullptr, D->getBeginLoc()); 8697 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8698 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8699 return Res; 8700 } 8701 8702 template <typename Derived> 8703 StmtResult 8704 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8705 DeclarationNameInfo DirName; 8706 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8707 D->getBeginLoc()); 8708 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8709 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8710 return Res; 8711 } 8712 8713 template <typename Derived> 8714 StmtResult 8715 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8716 DeclarationNameInfo DirName; 8717 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8718 D->getBeginLoc()); 8719 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8720 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8721 return Res; 8722 } 8723 8724 template <typename Derived> 8725 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8726 OMPTaskLoopSimdDirective *D) { 8727 DeclarationNameInfo DirName; 8728 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8729 nullptr, D->getBeginLoc()); 8730 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8731 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8732 return Res; 8733 } 8734 8735 template <typename Derived> 8736 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8737 OMPMasterTaskLoopDirective *D) { 8738 DeclarationNameInfo DirName; 8739 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8740 nullptr, D->getBeginLoc()); 8741 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8742 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8743 return Res; 8744 } 8745 8746 template <typename Derived> 8747 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8748 OMPMasterTaskLoopSimdDirective *D) { 8749 DeclarationNameInfo DirName; 8750 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8751 nullptr, D->getBeginLoc()); 8752 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8753 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8754 return Res; 8755 } 8756 8757 template <typename Derived> 8758 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8759 OMPParallelMasterTaskLoopDirective *D) { 8760 DeclarationNameInfo DirName; 8761 getDerived().getSema().StartOpenMPDSABlock( 8762 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8763 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8764 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8765 return Res; 8766 } 8767 8768 template <typename Derived> 8769 StmtResult 8770 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8771 OMPParallelMasterTaskLoopSimdDirective *D) { 8772 DeclarationNameInfo DirName; 8773 getDerived().getSema().StartOpenMPDSABlock( 8774 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8775 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8776 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8777 return Res; 8778 } 8779 8780 template <typename Derived> 8781 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8782 OMPDistributeDirective *D) { 8783 DeclarationNameInfo DirName; 8784 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8785 D->getBeginLoc()); 8786 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8787 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8788 return Res; 8789 } 8790 8791 template <typename Derived> 8792 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8793 OMPDistributeParallelForDirective *D) { 8794 DeclarationNameInfo DirName; 8795 getDerived().getSema().StartOpenMPDSABlock( 8796 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8797 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8798 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8799 return Res; 8800 } 8801 8802 template <typename Derived> 8803 StmtResult 8804 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8805 OMPDistributeParallelForSimdDirective *D) { 8806 DeclarationNameInfo DirName; 8807 getDerived().getSema().StartOpenMPDSABlock( 8808 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8809 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8810 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8811 return Res; 8812 } 8813 8814 template <typename Derived> 8815 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8816 OMPDistributeSimdDirective *D) { 8817 DeclarationNameInfo DirName; 8818 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8819 nullptr, D->getBeginLoc()); 8820 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8821 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8822 return Res; 8823 } 8824 8825 template <typename Derived> 8826 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8827 OMPTargetParallelForSimdDirective *D) { 8828 DeclarationNameInfo DirName; 8829 getDerived().getSema().StartOpenMPDSABlock( 8830 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8831 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8832 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8833 return Res; 8834 } 8835 8836 template <typename Derived> 8837 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8838 OMPTargetSimdDirective *D) { 8839 DeclarationNameInfo DirName; 8840 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8841 D->getBeginLoc()); 8842 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8843 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8844 return Res; 8845 } 8846 8847 template <typename Derived> 8848 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8849 OMPTeamsDistributeDirective *D) { 8850 DeclarationNameInfo DirName; 8851 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8852 nullptr, D->getBeginLoc()); 8853 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8854 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8855 return Res; 8856 } 8857 8858 template <typename Derived> 8859 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8860 OMPTeamsDistributeSimdDirective *D) { 8861 DeclarationNameInfo DirName; 8862 getDerived().getSema().StartOpenMPDSABlock( 8863 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8864 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8865 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8866 return Res; 8867 } 8868 8869 template <typename Derived> 8870 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8871 OMPTeamsDistributeParallelForSimdDirective *D) { 8872 DeclarationNameInfo DirName; 8873 getDerived().getSema().StartOpenMPDSABlock( 8874 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8875 D->getBeginLoc()); 8876 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8877 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8878 return Res; 8879 } 8880 8881 template <typename Derived> 8882 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8883 OMPTeamsDistributeParallelForDirective *D) { 8884 DeclarationNameInfo DirName; 8885 getDerived().getSema().StartOpenMPDSABlock( 8886 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8887 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8888 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8889 return Res; 8890 } 8891 8892 template <typename Derived> 8893 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8894 OMPTargetTeamsDirective *D) { 8895 DeclarationNameInfo DirName; 8896 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8897 nullptr, D->getBeginLoc()); 8898 auto Res = getDerived().TransformOMPExecutableDirective(D); 8899 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8900 return Res; 8901 } 8902 8903 template <typename Derived> 8904 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8905 OMPTargetTeamsDistributeDirective *D) { 8906 DeclarationNameInfo DirName; 8907 getDerived().getSema().StartOpenMPDSABlock( 8908 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8909 auto Res = getDerived().TransformOMPExecutableDirective(D); 8910 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8911 return Res; 8912 } 8913 8914 template <typename Derived> 8915 StmtResult 8916 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8917 OMPTargetTeamsDistributeParallelForDirective *D) { 8918 DeclarationNameInfo DirName; 8919 getDerived().getSema().StartOpenMPDSABlock( 8920 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8921 D->getBeginLoc()); 8922 auto Res = getDerived().TransformOMPExecutableDirective(D); 8923 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8924 return Res; 8925 } 8926 8927 template <typename Derived> 8928 StmtResult TreeTransform<Derived>:: 8929 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8930 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8931 DeclarationNameInfo DirName; 8932 getDerived().getSema().StartOpenMPDSABlock( 8933 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8934 D->getBeginLoc()); 8935 auto Res = getDerived().TransformOMPExecutableDirective(D); 8936 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8937 return Res; 8938 } 8939 8940 template <typename Derived> 8941 StmtResult 8942 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8943 OMPTargetTeamsDistributeSimdDirective *D) { 8944 DeclarationNameInfo DirName; 8945 getDerived().getSema().StartOpenMPDSABlock( 8946 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8947 auto Res = getDerived().TransformOMPExecutableDirective(D); 8948 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8949 return Res; 8950 } 8951 8952 8953 //===----------------------------------------------------------------------===// 8954 // OpenMP clause transformation 8955 //===----------------------------------------------------------------------===// 8956 template <typename Derived> 8957 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8958 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8959 if (Cond.isInvalid()) 8960 return nullptr; 8961 return getDerived().RebuildOMPIfClause( 8962 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8963 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8964 } 8965 8966 template <typename Derived> 8967 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8968 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8969 if (Cond.isInvalid()) 8970 return nullptr; 8971 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8972 C->getLParenLoc(), C->getEndLoc()); 8973 } 8974 8975 template <typename Derived> 8976 OMPClause * 8977 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8978 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8979 if (NumThreads.isInvalid()) 8980 return nullptr; 8981 return getDerived().RebuildOMPNumThreadsClause( 8982 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8983 } 8984 8985 template <typename Derived> 8986 OMPClause * 8987 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8988 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8989 if (E.isInvalid()) 8990 return nullptr; 8991 return getDerived().RebuildOMPSafelenClause( 8992 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8993 } 8994 8995 template <typename Derived> 8996 OMPClause * 8997 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8998 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8999 if (E.isInvalid()) 9000 return nullptr; 9001 return getDerived().RebuildOMPAllocatorClause( 9002 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9003 } 9004 9005 template <typename Derived> 9006 OMPClause * 9007 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9008 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9009 if (E.isInvalid()) 9010 return nullptr; 9011 return getDerived().RebuildOMPSimdlenClause( 9012 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9013 } 9014 9015 template <typename Derived> 9016 OMPClause * 9017 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9018 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9019 if (E.isInvalid()) 9020 return nullptr; 9021 return getDerived().RebuildOMPCollapseClause( 9022 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9023 } 9024 9025 template <typename Derived> 9026 OMPClause * 9027 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9028 return getDerived().RebuildOMPDefaultClause( 9029 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9030 C->getLParenLoc(), C->getEndLoc()); 9031 } 9032 9033 template <typename Derived> 9034 OMPClause * 9035 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9036 return getDerived().RebuildOMPProcBindClause( 9037 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9038 C->getLParenLoc(), C->getEndLoc()); 9039 } 9040 9041 template <typename Derived> 9042 OMPClause * 9043 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9044 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9045 if (E.isInvalid()) 9046 return nullptr; 9047 return getDerived().RebuildOMPScheduleClause( 9048 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9049 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9050 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9051 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9052 } 9053 9054 template <typename Derived> 9055 OMPClause * 9056 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9057 ExprResult E; 9058 if (auto *Num = C->getNumForLoops()) { 9059 E = getDerived().TransformExpr(Num); 9060 if (E.isInvalid()) 9061 return nullptr; 9062 } 9063 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9064 C->getLParenLoc(), E.get()); 9065 } 9066 9067 template <typename Derived> 9068 OMPClause * 9069 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9070 ExprResult E; 9071 if (Expr *Evt = C->getEventHandler()) { 9072 E = getDerived().TransformExpr(Evt); 9073 if (E.isInvalid()) 9074 return nullptr; 9075 } 9076 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9077 C->getLParenLoc(), C->getEndLoc()); 9078 } 9079 9080 template <typename Derived> 9081 OMPClause * 9082 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9083 // No need to rebuild this clause, no template-dependent parameters. 9084 return C; 9085 } 9086 9087 template <typename Derived> 9088 OMPClause * 9089 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9090 // No need to rebuild this clause, no template-dependent parameters. 9091 return C; 9092 } 9093 9094 template <typename Derived> 9095 OMPClause * 9096 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9097 // No need to rebuild this clause, no template-dependent parameters. 9098 return C; 9099 } 9100 9101 template <typename Derived> 9102 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9103 // No need to rebuild this clause, no template-dependent parameters. 9104 return C; 9105 } 9106 9107 template <typename Derived> 9108 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9109 // No need to rebuild this clause, no template-dependent parameters. 9110 return C; 9111 } 9112 9113 template <typename Derived> 9114 OMPClause * 9115 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9116 // No need to rebuild this clause, no template-dependent parameters. 9117 return C; 9118 } 9119 9120 template <typename Derived> 9121 OMPClause * 9122 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9123 // No need to rebuild this clause, no template-dependent parameters. 9124 return C; 9125 } 9126 9127 template <typename Derived> 9128 OMPClause * 9129 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9130 // No need to rebuild this clause, no template-dependent parameters. 9131 return C; 9132 } 9133 9134 template <typename Derived> 9135 OMPClause * 9136 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9137 // No need to rebuild this clause, no template-dependent parameters. 9138 return C; 9139 } 9140 9141 template <typename Derived> 9142 OMPClause * 9143 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9144 // No need to rebuild this clause, no template-dependent parameters. 9145 return C; 9146 } 9147 9148 template <typename Derived> 9149 OMPClause * 9150 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9151 // No need to rebuild this clause, no template-dependent parameters. 9152 return C; 9153 } 9154 9155 template <typename Derived> 9156 OMPClause * 9157 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9158 // No need to rebuild this clause, no template-dependent parameters. 9159 return C; 9160 } 9161 9162 template <typename Derived> 9163 OMPClause * 9164 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9165 // No need to rebuild this clause, no template-dependent parameters. 9166 return C; 9167 } 9168 9169 template <typename Derived> 9170 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9171 // No need to rebuild this clause, no template-dependent parameters. 9172 return C; 9173 } 9174 9175 template <typename Derived> 9176 OMPClause * 9177 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9178 // No need to rebuild this clause, no template-dependent parameters. 9179 return C; 9180 } 9181 9182 template <typename Derived> 9183 OMPClause * 9184 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9185 // No need to rebuild this clause, no template-dependent parameters. 9186 return C; 9187 } 9188 9189 template <typename Derived> 9190 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9191 OMPUnifiedAddressClause *C) { 9192 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9193 } 9194 9195 template <typename Derived> 9196 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9197 OMPUnifiedSharedMemoryClause *C) { 9198 llvm_unreachable( 9199 "unified_shared_memory clause cannot appear in dependent context"); 9200 } 9201 9202 template <typename Derived> 9203 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9204 OMPReverseOffloadClause *C) { 9205 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9206 } 9207 9208 template <typename Derived> 9209 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9210 OMPDynamicAllocatorsClause *C) { 9211 llvm_unreachable( 9212 "dynamic_allocators clause cannot appear in dependent context"); 9213 } 9214 9215 template <typename Derived> 9216 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9217 OMPAtomicDefaultMemOrderClause *C) { 9218 llvm_unreachable( 9219 "atomic_default_mem_order clause cannot appear in dependent context"); 9220 } 9221 9222 template <typename Derived> 9223 OMPClause * 9224 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9225 llvm::SmallVector<Expr *, 16> Vars; 9226 Vars.reserve(C->varlist_size()); 9227 for (auto *VE : C->varlists()) { 9228 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9229 if (EVar.isInvalid()) 9230 return nullptr; 9231 Vars.push_back(EVar.get()); 9232 } 9233 return getDerived().RebuildOMPPrivateClause( 9234 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9235 } 9236 9237 template <typename Derived> 9238 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9239 OMPFirstprivateClause *C) { 9240 llvm::SmallVector<Expr *, 16> Vars; 9241 Vars.reserve(C->varlist_size()); 9242 for (auto *VE : C->varlists()) { 9243 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9244 if (EVar.isInvalid()) 9245 return nullptr; 9246 Vars.push_back(EVar.get()); 9247 } 9248 return getDerived().RebuildOMPFirstprivateClause( 9249 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9250 } 9251 9252 template <typename Derived> 9253 OMPClause * 9254 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9255 llvm::SmallVector<Expr *, 16> Vars; 9256 Vars.reserve(C->varlist_size()); 9257 for (auto *VE : C->varlists()) { 9258 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9259 if (EVar.isInvalid()) 9260 return nullptr; 9261 Vars.push_back(EVar.get()); 9262 } 9263 return getDerived().RebuildOMPLastprivateClause( 9264 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9265 C->getLParenLoc(), C->getEndLoc()); 9266 } 9267 9268 template <typename Derived> 9269 OMPClause * 9270 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9271 llvm::SmallVector<Expr *, 16> Vars; 9272 Vars.reserve(C->varlist_size()); 9273 for (auto *VE : C->varlists()) { 9274 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9275 if (EVar.isInvalid()) 9276 return nullptr; 9277 Vars.push_back(EVar.get()); 9278 } 9279 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9280 C->getLParenLoc(), C->getEndLoc()); 9281 } 9282 9283 template <typename Derived> 9284 OMPClause * 9285 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9286 llvm::SmallVector<Expr *, 16> Vars; 9287 Vars.reserve(C->varlist_size()); 9288 for (auto *VE : C->varlists()) { 9289 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9290 if (EVar.isInvalid()) 9291 return nullptr; 9292 Vars.push_back(EVar.get()); 9293 } 9294 CXXScopeSpec ReductionIdScopeSpec; 9295 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9296 9297 DeclarationNameInfo NameInfo = C->getNameInfo(); 9298 if (NameInfo.getName()) { 9299 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9300 if (!NameInfo.getName()) 9301 return nullptr; 9302 } 9303 // Build a list of all UDR decls with the same names ranged by the Scopes. 9304 // The Scope boundary is a duplication of the previous decl. 9305 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9306 for (auto *E : C->reduction_ops()) { 9307 // Transform all the decls. 9308 if (E) { 9309 auto *ULE = cast<UnresolvedLookupExpr>(E); 9310 UnresolvedSet<8> Decls; 9311 for (auto *D : ULE->decls()) { 9312 NamedDecl *InstD = 9313 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9314 Decls.addDecl(InstD, InstD->getAccess()); 9315 } 9316 UnresolvedReductions.push_back( 9317 UnresolvedLookupExpr::Create( 9318 SemaRef.Context, /*NamingClass=*/nullptr, 9319 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9320 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9321 Decls.begin(), Decls.end())); 9322 } else 9323 UnresolvedReductions.push_back(nullptr); 9324 } 9325 return getDerived().RebuildOMPReductionClause( 9326 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9327 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9328 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9329 } 9330 9331 template <typename Derived> 9332 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9333 OMPTaskReductionClause *C) { 9334 llvm::SmallVector<Expr *, 16> Vars; 9335 Vars.reserve(C->varlist_size()); 9336 for (auto *VE : C->varlists()) { 9337 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9338 if (EVar.isInvalid()) 9339 return nullptr; 9340 Vars.push_back(EVar.get()); 9341 } 9342 CXXScopeSpec ReductionIdScopeSpec; 9343 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9344 9345 DeclarationNameInfo NameInfo = C->getNameInfo(); 9346 if (NameInfo.getName()) { 9347 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9348 if (!NameInfo.getName()) 9349 return nullptr; 9350 } 9351 // Build a list of all UDR decls with the same names ranged by the Scopes. 9352 // The Scope boundary is a duplication of the previous decl. 9353 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9354 for (auto *E : C->reduction_ops()) { 9355 // Transform all the decls. 9356 if (E) { 9357 auto *ULE = cast<UnresolvedLookupExpr>(E); 9358 UnresolvedSet<8> Decls; 9359 for (auto *D : ULE->decls()) { 9360 NamedDecl *InstD = 9361 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9362 Decls.addDecl(InstD, InstD->getAccess()); 9363 } 9364 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9365 SemaRef.Context, /*NamingClass=*/nullptr, 9366 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9367 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9368 } else 9369 UnresolvedReductions.push_back(nullptr); 9370 } 9371 return getDerived().RebuildOMPTaskReductionClause( 9372 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9373 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9374 } 9375 9376 template <typename Derived> 9377 OMPClause * 9378 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9379 llvm::SmallVector<Expr *, 16> Vars; 9380 Vars.reserve(C->varlist_size()); 9381 for (auto *VE : C->varlists()) { 9382 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9383 if (EVar.isInvalid()) 9384 return nullptr; 9385 Vars.push_back(EVar.get()); 9386 } 9387 CXXScopeSpec ReductionIdScopeSpec; 9388 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9389 9390 DeclarationNameInfo NameInfo = C->getNameInfo(); 9391 if (NameInfo.getName()) { 9392 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9393 if (!NameInfo.getName()) 9394 return nullptr; 9395 } 9396 // Build a list of all UDR decls with the same names ranged by the Scopes. 9397 // The Scope boundary is a duplication of the previous decl. 9398 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9399 for (auto *E : C->reduction_ops()) { 9400 // Transform all the decls. 9401 if (E) { 9402 auto *ULE = cast<UnresolvedLookupExpr>(E); 9403 UnresolvedSet<8> Decls; 9404 for (auto *D : ULE->decls()) { 9405 NamedDecl *InstD = 9406 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9407 Decls.addDecl(InstD, InstD->getAccess()); 9408 } 9409 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9410 SemaRef.Context, /*NamingClass=*/nullptr, 9411 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9412 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9413 } else 9414 UnresolvedReductions.push_back(nullptr); 9415 } 9416 return getDerived().RebuildOMPInReductionClause( 9417 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9418 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9419 } 9420 9421 template <typename Derived> 9422 OMPClause * 9423 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9424 llvm::SmallVector<Expr *, 16> Vars; 9425 Vars.reserve(C->varlist_size()); 9426 for (auto *VE : C->varlists()) { 9427 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9428 if (EVar.isInvalid()) 9429 return nullptr; 9430 Vars.push_back(EVar.get()); 9431 } 9432 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9433 if (Step.isInvalid()) 9434 return nullptr; 9435 return getDerived().RebuildOMPLinearClause( 9436 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9437 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9438 } 9439 9440 template <typename Derived> 9441 OMPClause * 9442 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9443 llvm::SmallVector<Expr *, 16> Vars; 9444 Vars.reserve(C->varlist_size()); 9445 for (auto *VE : C->varlists()) { 9446 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9447 if (EVar.isInvalid()) 9448 return nullptr; 9449 Vars.push_back(EVar.get()); 9450 } 9451 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9452 if (Alignment.isInvalid()) 9453 return nullptr; 9454 return getDerived().RebuildOMPAlignedClause( 9455 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9456 C->getColonLoc(), C->getEndLoc()); 9457 } 9458 9459 template <typename Derived> 9460 OMPClause * 9461 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9462 llvm::SmallVector<Expr *, 16> Vars; 9463 Vars.reserve(C->varlist_size()); 9464 for (auto *VE : C->varlists()) { 9465 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9466 if (EVar.isInvalid()) 9467 return nullptr; 9468 Vars.push_back(EVar.get()); 9469 } 9470 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9471 C->getLParenLoc(), C->getEndLoc()); 9472 } 9473 9474 template <typename Derived> 9475 OMPClause * 9476 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9477 llvm::SmallVector<Expr *, 16> Vars; 9478 Vars.reserve(C->varlist_size()); 9479 for (auto *VE : C->varlists()) { 9480 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9481 if (EVar.isInvalid()) 9482 return nullptr; 9483 Vars.push_back(EVar.get()); 9484 } 9485 return getDerived().RebuildOMPCopyprivateClause( 9486 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9487 } 9488 9489 template <typename Derived> 9490 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9491 llvm::SmallVector<Expr *, 16> Vars; 9492 Vars.reserve(C->varlist_size()); 9493 for (auto *VE : C->varlists()) { 9494 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9495 if (EVar.isInvalid()) 9496 return nullptr; 9497 Vars.push_back(EVar.get()); 9498 } 9499 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9500 C->getLParenLoc(), C->getEndLoc()); 9501 } 9502 9503 template <typename Derived> 9504 OMPClause * 9505 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9506 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9507 if (E.isInvalid()) 9508 return nullptr; 9509 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9510 C->getLParenLoc(), C->getEndLoc()); 9511 } 9512 9513 template <typename Derived> 9514 OMPClause * 9515 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9516 llvm::SmallVector<Expr *, 16> Vars; 9517 Expr *DepModifier = C->getModifier(); 9518 if (DepModifier) { 9519 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9520 if (DepModRes.isInvalid()) 9521 return nullptr; 9522 DepModifier = DepModRes.get(); 9523 } 9524 Vars.reserve(C->varlist_size()); 9525 for (auto *VE : C->varlists()) { 9526 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9527 if (EVar.isInvalid()) 9528 return nullptr; 9529 Vars.push_back(EVar.get()); 9530 } 9531 return getDerived().RebuildOMPDependClause( 9532 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9533 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9534 C->getEndLoc()); 9535 } 9536 9537 template <typename Derived> 9538 OMPClause * 9539 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9540 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9541 if (E.isInvalid()) 9542 return nullptr; 9543 return getDerived().RebuildOMPDeviceClause( 9544 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9545 C->getModifierLoc(), C->getEndLoc()); 9546 } 9547 9548 template <typename Derived, class T> 9549 bool transformOMPMappableExprListClause( 9550 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9551 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9552 DeclarationNameInfo &MapperIdInfo, 9553 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9554 // Transform expressions in the list. 9555 Vars.reserve(C->varlist_size()); 9556 for (auto *VE : C->varlists()) { 9557 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9558 if (EVar.isInvalid()) 9559 return true; 9560 Vars.push_back(EVar.get()); 9561 } 9562 // Transform mapper scope specifier and identifier. 9563 NestedNameSpecifierLoc QualifierLoc; 9564 if (C->getMapperQualifierLoc()) { 9565 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9566 C->getMapperQualifierLoc()); 9567 if (!QualifierLoc) 9568 return true; 9569 } 9570 MapperIdScopeSpec.Adopt(QualifierLoc); 9571 MapperIdInfo = C->getMapperIdInfo(); 9572 if (MapperIdInfo.getName()) { 9573 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9574 if (!MapperIdInfo.getName()) 9575 return true; 9576 } 9577 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9578 // the previous user-defined mapper lookup in dependent environment. 9579 for (auto *E : C->mapperlists()) { 9580 // Transform all the decls. 9581 if (E) { 9582 auto *ULE = cast<UnresolvedLookupExpr>(E); 9583 UnresolvedSet<8> Decls; 9584 for (auto *D : ULE->decls()) { 9585 NamedDecl *InstD = 9586 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9587 Decls.addDecl(InstD, InstD->getAccess()); 9588 } 9589 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9590 TT.getSema().Context, /*NamingClass=*/nullptr, 9591 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9592 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9593 Decls.end())); 9594 } else { 9595 UnresolvedMappers.push_back(nullptr); 9596 } 9597 } 9598 return false; 9599 } 9600 9601 template <typename Derived> 9602 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9603 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9604 llvm::SmallVector<Expr *, 16> Vars; 9605 CXXScopeSpec MapperIdScopeSpec; 9606 DeclarationNameInfo MapperIdInfo; 9607 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9608 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9609 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9610 return nullptr; 9611 return getDerived().RebuildOMPMapClause( 9612 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9613 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9614 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9615 } 9616 9617 template <typename Derived> 9618 OMPClause * 9619 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9620 Expr *Allocator = C->getAllocator(); 9621 if (Allocator) { 9622 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9623 if (AllocatorRes.isInvalid()) 9624 return nullptr; 9625 Allocator = AllocatorRes.get(); 9626 } 9627 llvm::SmallVector<Expr *, 16> Vars; 9628 Vars.reserve(C->varlist_size()); 9629 for (auto *VE : C->varlists()) { 9630 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9631 if (EVar.isInvalid()) 9632 return nullptr; 9633 Vars.push_back(EVar.get()); 9634 } 9635 return getDerived().RebuildOMPAllocateClause( 9636 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9637 C->getEndLoc()); 9638 } 9639 9640 template <typename Derived> 9641 OMPClause * 9642 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9643 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9644 if (E.isInvalid()) 9645 return nullptr; 9646 return getDerived().RebuildOMPNumTeamsClause( 9647 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9648 } 9649 9650 template <typename Derived> 9651 OMPClause * 9652 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9653 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9654 if (E.isInvalid()) 9655 return nullptr; 9656 return getDerived().RebuildOMPThreadLimitClause( 9657 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9658 } 9659 9660 template <typename Derived> 9661 OMPClause * 9662 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9663 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9664 if (E.isInvalid()) 9665 return nullptr; 9666 return getDerived().RebuildOMPPriorityClause( 9667 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9668 } 9669 9670 template <typename Derived> 9671 OMPClause * 9672 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9673 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9674 if (E.isInvalid()) 9675 return nullptr; 9676 return getDerived().RebuildOMPGrainsizeClause( 9677 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9678 } 9679 9680 template <typename Derived> 9681 OMPClause * 9682 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9683 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9684 if (E.isInvalid()) 9685 return nullptr; 9686 return getDerived().RebuildOMPNumTasksClause( 9687 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9688 } 9689 9690 template <typename Derived> 9691 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9692 ExprResult E = getDerived().TransformExpr(C->getHint()); 9693 if (E.isInvalid()) 9694 return nullptr; 9695 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9696 C->getLParenLoc(), C->getEndLoc()); 9697 } 9698 9699 template <typename Derived> 9700 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9701 OMPDistScheduleClause *C) { 9702 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9703 if (E.isInvalid()) 9704 return nullptr; 9705 return getDerived().RebuildOMPDistScheduleClause( 9706 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9707 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9708 } 9709 9710 template <typename Derived> 9711 OMPClause * 9712 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9713 // Rebuild Defaultmap Clause since we need to invoke the checking of 9714 // defaultmap(none:variable-category) after template initialization. 9715 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9716 C->getDefaultmapKind(), 9717 C->getBeginLoc(), 9718 C->getLParenLoc(), 9719 C->getDefaultmapModifierLoc(), 9720 C->getDefaultmapKindLoc(), 9721 C->getEndLoc()); 9722 } 9723 9724 template <typename Derived> 9725 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9726 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9727 llvm::SmallVector<Expr *, 16> Vars; 9728 CXXScopeSpec MapperIdScopeSpec; 9729 DeclarationNameInfo MapperIdInfo; 9730 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9731 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9732 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9733 return nullptr; 9734 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9735 Locs, UnresolvedMappers); 9736 } 9737 9738 template <typename Derived> 9739 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9740 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9741 llvm::SmallVector<Expr *, 16> Vars; 9742 CXXScopeSpec MapperIdScopeSpec; 9743 DeclarationNameInfo MapperIdInfo; 9744 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9745 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9746 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9747 return nullptr; 9748 return getDerived().RebuildOMPFromClause( 9749 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9750 } 9751 9752 template <typename Derived> 9753 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9754 OMPUseDevicePtrClause *C) { 9755 llvm::SmallVector<Expr *, 16> Vars; 9756 Vars.reserve(C->varlist_size()); 9757 for (auto *VE : C->varlists()) { 9758 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9759 if (EVar.isInvalid()) 9760 return nullptr; 9761 Vars.push_back(EVar.get()); 9762 } 9763 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9764 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9765 } 9766 9767 template <typename Derived> 9768 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9769 OMPUseDeviceAddrClause *C) { 9770 llvm::SmallVector<Expr *, 16> Vars; 9771 Vars.reserve(C->varlist_size()); 9772 for (auto *VE : C->varlists()) { 9773 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9774 if (EVar.isInvalid()) 9775 return nullptr; 9776 Vars.push_back(EVar.get()); 9777 } 9778 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9779 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9780 } 9781 9782 template <typename Derived> 9783 OMPClause * 9784 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9785 llvm::SmallVector<Expr *, 16> Vars; 9786 Vars.reserve(C->varlist_size()); 9787 for (auto *VE : C->varlists()) { 9788 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9789 if (EVar.isInvalid()) 9790 return nullptr; 9791 Vars.push_back(EVar.get()); 9792 } 9793 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9794 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9795 } 9796 9797 template <typename Derived> 9798 OMPClause * 9799 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9800 llvm::SmallVector<Expr *, 16> Vars; 9801 Vars.reserve(C->varlist_size()); 9802 for (auto *VE : C->varlists()) { 9803 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9804 if (EVar.isInvalid()) 9805 return nullptr; 9806 Vars.push_back(EVar.get()); 9807 } 9808 return getDerived().RebuildOMPNontemporalClause( 9809 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9810 } 9811 9812 template <typename Derived> 9813 OMPClause * 9814 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9815 llvm::SmallVector<Expr *, 16> Vars; 9816 Vars.reserve(C->varlist_size()); 9817 for (auto *VE : C->varlists()) { 9818 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9819 if (EVar.isInvalid()) 9820 return nullptr; 9821 Vars.push_back(EVar.get()); 9822 } 9823 return getDerived().RebuildOMPInclusiveClause( 9824 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9825 } 9826 9827 template <typename Derived> 9828 OMPClause * 9829 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9830 llvm::SmallVector<Expr *, 16> Vars; 9831 Vars.reserve(C->varlist_size()); 9832 for (auto *VE : C->varlists()) { 9833 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9834 if (EVar.isInvalid()) 9835 return nullptr; 9836 Vars.push_back(EVar.get()); 9837 } 9838 return getDerived().RebuildOMPExclusiveClause( 9839 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9840 } 9841 9842 template <typename Derived> 9843 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9844 OMPUsesAllocatorsClause *C) { 9845 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9846 Data.reserve(C->getNumberOfAllocators()); 9847 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9848 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9849 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9850 if (Allocator.isInvalid()) 9851 continue; 9852 ExprResult AllocatorTraits; 9853 if (Expr *AT = D.AllocatorTraits) { 9854 AllocatorTraits = getDerived().TransformExpr(AT); 9855 if (AllocatorTraits.isInvalid()) 9856 continue; 9857 } 9858 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9859 NewD.Allocator = Allocator.get(); 9860 NewD.AllocatorTraits = AllocatorTraits.get(); 9861 NewD.LParenLoc = D.LParenLoc; 9862 NewD.RParenLoc = D.RParenLoc; 9863 } 9864 return getDerived().RebuildOMPUsesAllocatorsClause( 9865 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9866 } 9867 9868 template <typename Derived> 9869 OMPClause * 9870 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9871 SmallVector<Expr *, 4> Locators; 9872 Locators.reserve(C->varlist_size()); 9873 ExprResult ModifierRes; 9874 if (Expr *Modifier = C->getModifier()) { 9875 ModifierRes = getDerived().TransformExpr(Modifier); 9876 if (ModifierRes.isInvalid()) 9877 return nullptr; 9878 } 9879 for (Expr *E : C->varlists()) { 9880 ExprResult Locator = getDerived().TransformExpr(E); 9881 if (Locator.isInvalid()) 9882 continue; 9883 Locators.push_back(Locator.get()); 9884 } 9885 return getDerived().RebuildOMPAffinityClause( 9886 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9887 ModifierRes.get(), Locators); 9888 } 9889 9890 template <typename Derived> 9891 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9892 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9893 C->getBeginLoc(), C->getLParenLoc(), 9894 C->getEndLoc()); 9895 } 9896 9897 //===----------------------------------------------------------------------===// 9898 // Expression transformation 9899 //===----------------------------------------------------------------------===// 9900 template<typename Derived> 9901 ExprResult 9902 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9903 return TransformExpr(E->getSubExpr()); 9904 } 9905 9906 template<typename Derived> 9907 ExprResult 9908 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9909 if (!E->isTypeDependent()) 9910 return E; 9911 9912 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9913 E->getIdentKind()); 9914 } 9915 9916 template<typename Derived> 9917 ExprResult 9918 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9919 NestedNameSpecifierLoc QualifierLoc; 9920 if (E->getQualifierLoc()) { 9921 QualifierLoc 9922 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9923 if (!QualifierLoc) 9924 return ExprError(); 9925 } 9926 9927 ValueDecl *ND 9928 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9929 E->getDecl())); 9930 if (!ND) 9931 return ExprError(); 9932 9933 NamedDecl *Found = ND; 9934 if (E->getFoundDecl() != E->getDecl()) { 9935 Found = cast_or_null<NamedDecl>( 9936 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9937 if (!Found) 9938 return ExprError(); 9939 } 9940 9941 DeclarationNameInfo NameInfo = E->getNameInfo(); 9942 if (NameInfo.getName()) { 9943 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9944 if (!NameInfo.getName()) 9945 return ExprError(); 9946 } 9947 9948 if (!getDerived().AlwaysRebuild() && 9949 QualifierLoc == E->getQualifierLoc() && 9950 ND == E->getDecl() && 9951 Found == E->getFoundDecl() && 9952 NameInfo.getName() == E->getDecl()->getDeclName() && 9953 !E->hasExplicitTemplateArgs()) { 9954 9955 // Mark it referenced in the new context regardless. 9956 // FIXME: this is a bit instantiation-specific. 9957 SemaRef.MarkDeclRefReferenced(E); 9958 9959 return E; 9960 } 9961 9962 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9963 if (E->hasExplicitTemplateArgs()) { 9964 TemplateArgs = &TransArgs; 9965 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9966 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9967 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9968 E->getNumTemplateArgs(), 9969 TransArgs)) 9970 return ExprError(); 9971 } 9972 9973 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9974 Found, TemplateArgs); 9975 } 9976 9977 template<typename Derived> 9978 ExprResult 9979 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9980 return E; 9981 } 9982 9983 template <typename Derived> 9984 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9985 FixedPointLiteral *E) { 9986 return E; 9987 } 9988 9989 template<typename Derived> 9990 ExprResult 9991 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9992 return E; 9993 } 9994 9995 template<typename Derived> 9996 ExprResult 9997 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9998 return E; 9999 } 10000 10001 template<typename Derived> 10002 ExprResult 10003 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10004 return E; 10005 } 10006 10007 template<typename Derived> 10008 ExprResult 10009 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10010 return E; 10011 } 10012 10013 template<typename Derived> 10014 ExprResult 10015 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10016 if (FunctionDecl *FD = E->getDirectCallee()) 10017 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10018 return SemaRef.MaybeBindToTemporary(E); 10019 } 10020 10021 template<typename Derived> 10022 ExprResult 10023 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10024 ExprResult ControllingExpr = 10025 getDerived().TransformExpr(E->getControllingExpr()); 10026 if (ControllingExpr.isInvalid()) 10027 return ExprError(); 10028 10029 SmallVector<Expr *, 4> AssocExprs; 10030 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10031 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10032 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10033 if (TSI) { 10034 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10035 if (!AssocType) 10036 return ExprError(); 10037 AssocTypes.push_back(AssocType); 10038 } else { 10039 AssocTypes.push_back(nullptr); 10040 } 10041 10042 ExprResult AssocExpr = 10043 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10044 if (AssocExpr.isInvalid()) 10045 return ExprError(); 10046 AssocExprs.push_back(AssocExpr.get()); 10047 } 10048 10049 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10050 E->getDefaultLoc(), 10051 E->getRParenLoc(), 10052 ControllingExpr.get(), 10053 AssocTypes, 10054 AssocExprs); 10055 } 10056 10057 template<typename Derived> 10058 ExprResult 10059 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10060 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10061 if (SubExpr.isInvalid()) 10062 return ExprError(); 10063 10064 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10065 return E; 10066 10067 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10068 E->getRParen()); 10069 } 10070 10071 /// The operand of a unary address-of operator has special rules: it's 10072 /// allowed to refer to a non-static member of a class even if there's no 'this' 10073 /// object available. 10074 template<typename Derived> 10075 ExprResult 10076 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10077 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10078 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10079 else 10080 return getDerived().TransformExpr(E); 10081 } 10082 10083 template<typename Derived> 10084 ExprResult 10085 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10086 ExprResult SubExpr; 10087 if (E->getOpcode() == UO_AddrOf) 10088 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10089 else 10090 SubExpr = TransformExpr(E->getSubExpr()); 10091 if (SubExpr.isInvalid()) 10092 return ExprError(); 10093 10094 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10095 return E; 10096 10097 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10098 E->getOpcode(), 10099 SubExpr.get()); 10100 } 10101 10102 template<typename Derived> 10103 ExprResult 10104 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10105 // Transform the type. 10106 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10107 if (!Type) 10108 return ExprError(); 10109 10110 // Transform all of the components into components similar to what the 10111 // parser uses. 10112 // FIXME: It would be slightly more efficient in the non-dependent case to 10113 // just map FieldDecls, rather than requiring the rebuilder to look for 10114 // the fields again. However, __builtin_offsetof is rare enough in 10115 // template code that we don't care. 10116 bool ExprChanged = false; 10117 typedef Sema::OffsetOfComponent Component; 10118 SmallVector<Component, 4> Components; 10119 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10120 const OffsetOfNode &ON = E->getComponent(I); 10121 Component Comp; 10122 Comp.isBrackets = true; 10123 Comp.LocStart = ON.getSourceRange().getBegin(); 10124 Comp.LocEnd = ON.getSourceRange().getEnd(); 10125 switch (ON.getKind()) { 10126 case OffsetOfNode::Array: { 10127 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10128 ExprResult Index = getDerived().TransformExpr(FromIndex); 10129 if (Index.isInvalid()) 10130 return ExprError(); 10131 10132 ExprChanged = ExprChanged || Index.get() != FromIndex; 10133 Comp.isBrackets = true; 10134 Comp.U.E = Index.get(); 10135 break; 10136 } 10137 10138 case OffsetOfNode::Field: 10139 case OffsetOfNode::Identifier: 10140 Comp.isBrackets = false; 10141 Comp.U.IdentInfo = ON.getFieldName(); 10142 if (!Comp.U.IdentInfo) 10143 continue; 10144 10145 break; 10146 10147 case OffsetOfNode::Base: 10148 // Will be recomputed during the rebuild. 10149 continue; 10150 } 10151 10152 Components.push_back(Comp); 10153 } 10154 10155 // If nothing changed, retain the existing expression. 10156 if (!getDerived().AlwaysRebuild() && 10157 Type == E->getTypeSourceInfo() && 10158 !ExprChanged) 10159 return E; 10160 10161 // Build a new offsetof expression. 10162 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10163 Components, E->getRParenLoc()); 10164 } 10165 10166 template<typename Derived> 10167 ExprResult 10168 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10169 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10170 "opaque value expression requires transformation"); 10171 return E; 10172 } 10173 10174 template<typename Derived> 10175 ExprResult 10176 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10177 return E; 10178 } 10179 10180 template <typename Derived> 10181 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10182 llvm::SmallVector<Expr *, 8> Children; 10183 bool Changed = false; 10184 for (Expr *C : E->subExpressions()) { 10185 ExprResult NewC = getDerived().TransformExpr(C); 10186 if (NewC.isInvalid()) 10187 return ExprError(); 10188 Children.push_back(NewC.get()); 10189 10190 Changed |= NewC.get() != C; 10191 } 10192 if (!getDerived().AlwaysRebuild() && !Changed) 10193 return E; 10194 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10195 Children); 10196 } 10197 10198 template<typename Derived> 10199 ExprResult 10200 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10201 // Rebuild the syntactic form. The original syntactic form has 10202 // opaque-value expressions in it, so strip those away and rebuild 10203 // the result. This is a really awful way of doing this, but the 10204 // better solution (rebuilding the semantic expressions and 10205 // rebinding OVEs as necessary) doesn't work; we'd need 10206 // TreeTransform to not strip away implicit conversions. 10207 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10208 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10209 if (result.isInvalid()) return ExprError(); 10210 10211 // If that gives us a pseudo-object result back, the pseudo-object 10212 // expression must have been an lvalue-to-rvalue conversion which we 10213 // should reapply. 10214 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10215 result = SemaRef.checkPseudoObjectRValue(result.get()); 10216 10217 return result; 10218 } 10219 10220 template<typename Derived> 10221 ExprResult 10222 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10223 UnaryExprOrTypeTraitExpr *E) { 10224 if (E->isArgumentType()) { 10225 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10226 10227 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10228 if (!NewT) 10229 return ExprError(); 10230 10231 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10232 return E; 10233 10234 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10235 E->getKind(), 10236 E->getSourceRange()); 10237 } 10238 10239 // C++0x [expr.sizeof]p1: 10240 // The operand is either an expression, which is an unevaluated operand 10241 // [...] 10242 EnterExpressionEvaluationContext Unevaluated( 10243 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10244 Sema::ReuseLambdaContextDecl); 10245 10246 // Try to recover if we have something like sizeof(T::X) where X is a type. 10247 // Notably, there must be *exactly* one set of parens if X is a type. 10248 TypeSourceInfo *RecoveryTSI = nullptr; 10249 ExprResult SubExpr; 10250 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10251 if (auto *DRE = 10252 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10253 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10254 PE, DRE, false, &RecoveryTSI); 10255 else 10256 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10257 10258 if (RecoveryTSI) { 10259 return getDerived().RebuildUnaryExprOrTypeTrait( 10260 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10261 } else if (SubExpr.isInvalid()) 10262 return ExprError(); 10263 10264 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10265 return E; 10266 10267 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10268 E->getOperatorLoc(), 10269 E->getKind(), 10270 E->getSourceRange()); 10271 } 10272 10273 template<typename Derived> 10274 ExprResult 10275 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10276 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10277 if (LHS.isInvalid()) 10278 return ExprError(); 10279 10280 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10281 if (RHS.isInvalid()) 10282 return ExprError(); 10283 10284 10285 if (!getDerived().AlwaysRebuild() && 10286 LHS.get() == E->getLHS() && 10287 RHS.get() == E->getRHS()) 10288 return E; 10289 10290 return getDerived().RebuildArraySubscriptExpr( 10291 LHS.get(), 10292 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10293 } 10294 10295 template <typename Derived> 10296 ExprResult 10297 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10298 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10299 if (Base.isInvalid()) 10300 return ExprError(); 10301 10302 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10303 if (RowIdx.isInvalid()) 10304 return ExprError(); 10305 10306 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10307 if (ColumnIdx.isInvalid()) 10308 return ExprError(); 10309 10310 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10311 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10312 return E; 10313 10314 return getDerived().RebuildMatrixSubscriptExpr( 10315 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10316 } 10317 10318 template <typename Derived> 10319 ExprResult 10320 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10321 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10322 if (Base.isInvalid()) 10323 return ExprError(); 10324 10325 ExprResult LowerBound; 10326 if (E->getLowerBound()) { 10327 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10328 if (LowerBound.isInvalid()) 10329 return ExprError(); 10330 } 10331 10332 ExprResult Length; 10333 if (E->getLength()) { 10334 Length = getDerived().TransformExpr(E->getLength()); 10335 if (Length.isInvalid()) 10336 return ExprError(); 10337 } 10338 10339 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10340 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10341 return E; 10342 10343 return getDerived().RebuildOMPArraySectionExpr( 10344 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 10345 Length.get(), E->getRBracketLoc()); 10346 } 10347 10348 template <typename Derived> 10349 ExprResult 10350 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10351 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10352 if (Base.isInvalid()) 10353 return ExprError(); 10354 10355 SmallVector<Expr *, 4> Dims; 10356 bool ErrorFound = false; 10357 for (Expr *Dim : E->getDimensions()) { 10358 ExprResult DimRes = getDerived().TransformExpr(Dim); 10359 if (DimRes.isInvalid()) { 10360 ErrorFound = true; 10361 continue; 10362 } 10363 Dims.push_back(DimRes.get()); 10364 } 10365 10366 if (ErrorFound) 10367 return ExprError(); 10368 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10369 E->getRParenLoc(), Dims, 10370 E->getBracketsRanges()); 10371 } 10372 10373 template <typename Derived> 10374 ExprResult 10375 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10376 unsigned NumIterators = E->numOfIterators(); 10377 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10378 10379 bool ErrorFound = false; 10380 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10381 for (unsigned I = 0; I < NumIterators; ++I) { 10382 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10383 Data[I].DeclIdent = D->getIdentifier(); 10384 Data[I].DeclIdentLoc = D->getLocation(); 10385 if (D->getLocation() == D->getBeginLoc()) { 10386 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10387 "Implicit type must be int."); 10388 } else { 10389 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10390 QualType DeclTy = getDerived().TransformType(D->getType()); 10391 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10392 } 10393 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10394 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10395 ExprResult End = getDerived().TransformExpr(Range.End); 10396 ExprResult Step = getDerived().TransformExpr(Range.Step); 10397 ErrorFound = ErrorFound || 10398 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10399 !Data[I].Type.get().isNull())) || 10400 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10401 if (ErrorFound) 10402 continue; 10403 Data[I].Range.Begin = Begin.get(); 10404 Data[I].Range.End = End.get(); 10405 Data[I].Range.Step = Step.get(); 10406 Data[I].AssignLoc = E->getAssignLoc(I); 10407 Data[I].ColonLoc = E->getColonLoc(I); 10408 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10409 NeedToRebuild = 10410 NeedToRebuild || 10411 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10412 D->getType().getTypePtrOrNull()) || 10413 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10414 Range.Step != Data[I].Range.Step; 10415 } 10416 if (ErrorFound) 10417 return ExprError(); 10418 if (!NeedToRebuild) 10419 return E; 10420 10421 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10422 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10423 if (!Res.isUsable()) 10424 return Res; 10425 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10426 for (unsigned I = 0; I < NumIterators; ++I) 10427 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10428 IE->getIteratorDecl(I)); 10429 return Res; 10430 } 10431 10432 template<typename Derived> 10433 ExprResult 10434 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10435 // Transform the callee. 10436 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10437 if (Callee.isInvalid()) 10438 return ExprError(); 10439 10440 // Transform arguments. 10441 bool ArgChanged = false; 10442 SmallVector<Expr*, 8> Args; 10443 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10444 &ArgChanged)) 10445 return ExprError(); 10446 10447 if (!getDerived().AlwaysRebuild() && 10448 Callee.get() == E->getCallee() && 10449 !ArgChanged) 10450 return SemaRef.MaybeBindToTemporary(E); 10451 10452 // FIXME: Wrong source location information for the '('. 10453 SourceLocation FakeLParenLoc 10454 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10455 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10456 Args, 10457 E->getRParenLoc()); 10458 } 10459 10460 template<typename Derived> 10461 ExprResult 10462 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10463 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10464 if (Base.isInvalid()) 10465 return ExprError(); 10466 10467 NestedNameSpecifierLoc QualifierLoc; 10468 if (E->hasQualifier()) { 10469 QualifierLoc 10470 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10471 10472 if (!QualifierLoc) 10473 return ExprError(); 10474 } 10475 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10476 10477 ValueDecl *Member 10478 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10479 E->getMemberDecl())); 10480 if (!Member) 10481 return ExprError(); 10482 10483 NamedDecl *FoundDecl = E->getFoundDecl(); 10484 if (FoundDecl == E->getMemberDecl()) { 10485 FoundDecl = Member; 10486 } else { 10487 FoundDecl = cast_or_null<NamedDecl>( 10488 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10489 if (!FoundDecl) 10490 return ExprError(); 10491 } 10492 10493 if (!getDerived().AlwaysRebuild() && 10494 Base.get() == E->getBase() && 10495 QualifierLoc == E->getQualifierLoc() && 10496 Member == E->getMemberDecl() && 10497 FoundDecl == E->getFoundDecl() && 10498 !E->hasExplicitTemplateArgs()) { 10499 10500 // Mark it referenced in the new context regardless. 10501 // FIXME: this is a bit instantiation-specific. 10502 SemaRef.MarkMemberReferenced(E); 10503 10504 return E; 10505 } 10506 10507 TemplateArgumentListInfo TransArgs; 10508 if (E->hasExplicitTemplateArgs()) { 10509 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10510 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10511 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10512 E->getNumTemplateArgs(), 10513 TransArgs)) 10514 return ExprError(); 10515 } 10516 10517 // FIXME: Bogus source location for the operator 10518 SourceLocation FakeOperatorLoc = 10519 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10520 10521 // FIXME: to do this check properly, we will need to preserve the 10522 // first-qualifier-in-scope here, just in case we had a dependent 10523 // base (and therefore couldn't do the check) and a 10524 // nested-name-qualifier (and therefore could do the lookup). 10525 NamedDecl *FirstQualifierInScope = nullptr; 10526 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10527 if (MemberNameInfo.getName()) { 10528 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10529 if (!MemberNameInfo.getName()) 10530 return ExprError(); 10531 } 10532 10533 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10534 E->isArrow(), 10535 QualifierLoc, 10536 TemplateKWLoc, 10537 MemberNameInfo, 10538 Member, 10539 FoundDecl, 10540 (E->hasExplicitTemplateArgs() 10541 ? &TransArgs : nullptr), 10542 FirstQualifierInScope); 10543 } 10544 10545 template<typename Derived> 10546 ExprResult 10547 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10548 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10549 if (LHS.isInvalid()) 10550 return ExprError(); 10551 10552 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10553 if (RHS.isInvalid()) 10554 return ExprError(); 10555 10556 if (!getDerived().AlwaysRebuild() && 10557 LHS.get() == E->getLHS() && 10558 RHS.get() == E->getRHS()) 10559 return E; 10560 10561 if (E->isCompoundAssignmentOp()) 10562 // FPFeatures has already been established from trailing storage 10563 return getDerived().RebuildBinaryOperator( 10564 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10565 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10566 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10567 10568 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10569 LHS.get(), RHS.get()); 10570 } 10571 10572 template <typename Derived> 10573 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10574 CXXRewrittenBinaryOperator *E) { 10575 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10576 10577 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10578 if (LHS.isInvalid()) 10579 return ExprError(); 10580 10581 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10582 if (RHS.isInvalid()) 10583 return ExprError(); 10584 10585 if (!getDerived().AlwaysRebuild() && 10586 LHS.get() == Decomp.LHS && 10587 RHS.get() == Decomp.RHS) 10588 return E; 10589 10590 // Extract the already-resolved callee declarations so that we can restrict 10591 // ourselves to using them as the unqualified lookup results when rebuilding. 10592 UnresolvedSet<2> UnqualLookups; 10593 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10594 const_cast<Expr *>(Decomp.InnerBinOp)}; 10595 for (Expr *PossibleBinOp : PossibleBinOps) { 10596 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10597 if (!Op) 10598 continue; 10599 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10600 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10601 continue; 10602 10603 // Transform the callee in case we built a call to a local extern 10604 // declaration. 10605 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10606 E->getOperatorLoc(), Callee->getFoundDecl())); 10607 if (!Found) 10608 return ExprError(); 10609 UnqualLookups.addDecl(Found); 10610 } 10611 10612 return getDerived().RebuildCXXRewrittenBinaryOperator( 10613 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10614 } 10615 10616 template<typename Derived> 10617 ExprResult 10618 TreeTransform<Derived>::TransformCompoundAssignOperator( 10619 CompoundAssignOperator *E) { 10620 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10621 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10622 return getDerived().TransformBinaryOperator(E); 10623 } 10624 10625 template<typename Derived> 10626 ExprResult TreeTransform<Derived>:: 10627 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10628 // Just rebuild the common and RHS expressions and see whether we 10629 // get any changes. 10630 10631 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10632 if (commonExpr.isInvalid()) 10633 return ExprError(); 10634 10635 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10636 if (rhs.isInvalid()) 10637 return ExprError(); 10638 10639 if (!getDerived().AlwaysRebuild() && 10640 commonExpr.get() == e->getCommon() && 10641 rhs.get() == e->getFalseExpr()) 10642 return e; 10643 10644 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10645 e->getQuestionLoc(), 10646 nullptr, 10647 e->getColonLoc(), 10648 rhs.get()); 10649 } 10650 10651 template<typename Derived> 10652 ExprResult 10653 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10654 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10655 if (Cond.isInvalid()) 10656 return ExprError(); 10657 10658 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10659 if (LHS.isInvalid()) 10660 return ExprError(); 10661 10662 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10663 if (RHS.isInvalid()) 10664 return ExprError(); 10665 10666 if (!getDerived().AlwaysRebuild() && 10667 Cond.get() == E->getCond() && 10668 LHS.get() == E->getLHS() && 10669 RHS.get() == E->getRHS()) 10670 return E; 10671 10672 return getDerived().RebuildConditionalOperator(Cond.get(), 10673 E->getQuestionLoc(), 10674 LHS.get(), 10675 E->getColonLoc(), 10676 RHS.get()); 10677 } 10678 10679 template<typename Derived> 10680 ExprResult 10681 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10682 // Implicit casts are eliminated during transformation, since they 10683 // will be recomputed by semantic analysis after transformation. 10684 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10685 } 10686 10687 template<typename Derived> 10688 ExprResult 10689 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10690 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10691 if (!Type) 10692 return ExprError(); 10693 10694 ExprResult SubExpr 10695 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10696 if (SubExpr.isInvalid()) 10697 return ExprError(); 10698 10699 if (!getDerived().AlwaysRebuild() && 10700 Type == E->getTypeInfoAsWritten() && 10701 SubExpr.get() == E->getSubExpr()) 10702 return E; 10703 10704 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10705 Type, 10706 E->getRParenLoc(), 10707 SubExpr.get()); 10708 } 10709 10710 template<typename Derived> 10711 ExprResult 10712 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10713 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10714 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10715 if (!NewT) 10716 return ExprError(); 10717 10718 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10719 if (Init.isInvalid()) 10720 return ExprError(); 10721 10722 if (!getDerived().AlwaysRebuild() && 10723 OldT == NewT && 10724 Init.get() == E->getInitializer()) 10725 return SemaRef.MaybeBindToTemporary(E); 10726 10727 // Note: the expression type doesn't necessarily match the 10728 // type-as-written, but that's okay, because it should always be 10729 // derivable from the initializer. 10730 10731 return getDerived().RebuildCompoundLiteralExpr( 10732 E->getLParenLoc(), NewT, 10733 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10734 } 10735 10736 template<typename Derived> 10737 ExprResult 10738 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10739 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10740 if (Base.isInvalid()) 10741 return ExprError(); 10742 10743 if (!getDerived().AlwaysRebuild() && 10744 Base.get() == E->getBase()) 10745 return E; 10746 10747 // FIXME: Bad source location 10748 SourceLocation FakeOperatorLoc = 10749 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10750 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10751 E->getAccessorLoc(), 10752 E->getAccessor()); 10753 } 10754 10755 template<typename Derived> 10756 ExprResult 10757 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10758 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10759 E = Syntactic; 10760 10761 bool InitChanged = false; 10762 10763 EnterExpressionEvaluationContext Context( 10764 getSema(), EnterExpressionEvaluationContext::InitList); 10765 10766 SmallVector<Expr*, 4> Inits; 10767 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10768 Inits, &InitChanged)) 10769 return ExprError(); 10770 10771 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10772 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10773 // in some cases. We can't reuse it in general, because the syntactic and 10774 // semantic forms are linked, and we can't know that semantic form will 10775 // match even if the syntactic form does. 10776 } 10777 10778 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10779 E->getRBraceLoc()); 10780 } 10781 10782 template<typename Derived> 10783 ExprResult 10784 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10785 Designation Desig; 10786 10787 // transform the initializer value 10788 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10789 if (Init.isInvalid()) 10790 return ExprError(); 10791 10792 // transform the designators. 10793 SmallVector<Expr*, 4> ArrayExprs; 10794 bool ExprChanged = false; 10795 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10796 if (D.isFieldDesignator()) { 10797 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10798 D.getDotLoc(), 10799 D.getFieldLoc())); 10800 if (D.getField()) { 10801 FieldDecl *Field = cast_or_null<FieldDecl>( 10802 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10803 if (Field != D.getField()) 10804 // Rebuild the expression when the transformed FieldDecl is 10805 // different to the already assigned FieldDecl. 10806 ExprChanged = true; 10807 } else { 10808 // Ensure that the designator expression is rebuilt when there isn't 10809 // a resolved FieldDecl in the designator as we don't want to assign 10810 // a FieldDecl to a pattern designator that will be instantiated again. 10811 ExprChanged = true; 10812 } 10813 continue; 10814 } 10815 10816 if (D.isArrayDesignator()) { 10817 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10818 if (Index.isInvalid()) 10819 return ExprError(); 10820 10821 Desig.AddDesignator( 10822 Designator::getArray(Index.get(), D.getLBracketLoc())); 10823 10824 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10825 ArrayExprs.push_back(Index.get()); 10826 continue; 10827 } 10828 10829 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10830 ExprResult Start 10831 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10832 if (Start.isInvalid()) 10833 return ExprError(); 10834 10835 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10836 if (End.isInvalid()) 10837 return ExprError(); 10838 10839 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10840 End.get(), 10841 D.getLBracketLoc(), 10842 D.getEllipsisLoc())); 10843 10844 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10845 End.get() != E->getArrayRangeEnd(D); 10846 10847 ArrayExprs.push_back(Start.get()); 10848 ArrayExprs.push_back(End.get()); 10849 } 10850 10851 if (!getDerived().AlwaysRebuild() && 10852 Init.get() == E->getInit() && 10853 !ExprChanged) 10854 return E; 10855 10856 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10857 E->getEqualOrColonLoc(), 10858 E->usesGNUSyntax(), Init.get()); 10859 } 10860 10861 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10862 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10863 template<typename Derived> 10864 ExprResult 10865 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10866 DesignatedInitUpdateExpr *E) { 10867 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10868 "initializer"); 10869 return ExprError(); 10870 } 10871 10872 template<typename Derived> 10873 ExprResult 10874 TreeTransform<Derived>::TransformNoInitExpr( 10875 NoInitExpr *E) { 10876 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10877 return ExprError(); 10878 } 10879 10880 template<typename Derived> 10881 ExprResult 10882 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10883 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10884 return ExprError(); 10885 } 10886 10887 template<typename Derived> 10888 ExprResult 10889 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10890 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10891 return ExprError(); 10892 } 10893 10894 template<typename Derived> 10895 ExprResult 10896 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10897 ImplicitValueInitExpr *E) { 10898 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10899 10900 // FIXME: Will we ever have proper type location here? Will we actually 10901 // need to transform the type? 10902 QualType T = getDerived().TransformType(E->getType()); 10903 if (T.isNull()) 10904 return ExprError(); 10905 10906 if (!getDerived().AlwaysRebuild() && 10907 T == E->getType()) 10908 return E; 10909 10910 return getDerived().RebuildImplicitValueInitExpr(T); 10911 } 10912 10913 template<typename Derived> 10914 ExprResult 10915 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10916 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10917 if (!TInfo) 10918 return ExprError(); 10919 10920 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10921 if (SubExpr.isInvalid()) 10922 return ExprError(); 10923 10924 if (!getDerived().AlwaysRebuild() && 10925 TInfo == E->getWrittenTypeInfo() && 10926 SubExpr.get() == E->getSubExpr()) 10927 return E; 10928 10929 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10930 TInfo, E->getRParenLoc()); 10931 } 10932 10933 template<typename Derived> 10934 ExprResult 10935 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10936 bool ArgumentChanged = false; 10937 SmallVector<Expr*, 4> Inits; 10938 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10939 &ArgumentChanged)) 10940 return ExprError(); 10941 10942 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10943 Inits, 10944 E->getRParenLoc()); 10945 } 10946 10947 /// Transform an address-of-label expression. 10948 /// 10949 /// By default, the transformation of an address-of-label expression always 10950 /// rebuilds the expression, so that the label identifier can be resolved to 10951 /// the corresponding label statement by semantic analysis. 10952 template<typename Derived> 10953 ExprResult 10954 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10955 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10956 E->getLabel()); 10957 if (!LD) 10958 return ExprError(); 10959 10960 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10961 cast<LabelDecl>(LD)); 10962 } 10963 10964 template<typename Derived> 10965 ExprResult 10966 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10967 SemaRef.ActOnStartStmtExpr(); 10968 StmtResult SubStmt 10969 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10970 if (SubStmt.isInvalid()) { 10971 SemaRef.ActOnStmtExprError(); 10972 return ExprError(); 10973 } 10974 10975 unsigned OldDepth = E->getTemplateDepth(); 10976 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 10977 10978 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 10979 SubStmt.get() == E->getSubStmt()) { 10980 // Calling this an 'error' is unintuitive, but it does the right thing. 10981 SemaRef.ActOnStmtExprError(); 10982 return SemaRef.MaybeBindToTemporary(E); 10983 } 10984 10985 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 10986 E->getRParenLoc(), NewDepth); 10987 } 10988 10989 template<typename Derived> 10990 ExprResult 10991 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10992 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10993 if (Cond.isInvalid()) 10994 return ExprError(); 10995 10996 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10997 if (LHS.isInvalid()) 10998 return ExprError(); 10999 11000 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11001 if (RHS.isInvalid()) 11002 return ExprError(); 11003 11004 if (!getDerived().AlwaysRebuild() && 11005 Cond.get() == E->getCond() && 11006 LHS.get() == E->getLHS() && 11007 RHS.get() == E->getRHS()) 11008 return E; 11009 11010 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11011 Cond.get(), LHS.get(), RHS.get(), 11012 E->getRParenLoc()); 11013 } 11014 11015 template<typename Derived> 11016 ExprResult 11017 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11018 return E; 11019 } 11020 11021 template<typename Derived> 11022 ExprResult 11023 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11024 switch (E->getOperator()) { 11025 case OO_New: 11026 case OO_Delete: 11027 case OO_Array_New: 11028 case OO_Array_Delete: 11029 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11030 11031 case OO_Call: { 11032 // This is a call to an object's operator(). 11033 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11034 11035 // Transform the object itself. 11036 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11037 if (Object.isInvalid()) 11038 return ExprError(); 11039 11040 // FIXME: Poor location information 11041 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11042 static_cast<Expr *>(Object.get())->getEndLoc()); 11043 11044 // Transform the call arguments. 11045 SmallVector<Expr*, 8> Args; 11046 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11047 Args)) 11048 return ExprError(); 11049 11050 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11051 E->getEndLoc()); 11052 } 11053 11054 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11055 case OO_##Name: 11056 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11057 #include "clang/Basic/OperatorKinds.def" 11058 case OO_Subscript: 11059 // Handled below. 11060 break; 11061 11062 case OO_Conditional: 11063 llvm_unreachable("conditional operator is not actually overloadable"); 11064 11065 case OO_None: 11066 case NUM_OVERLOADED_OPERATORS: 11067 llvm_unreachable("not an overloaded operator?"); 11068 } 11069 11070 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11071 if (Callee.isInvalid()) 11072 return ExprError(); 11073 11074 ExprResult First; 11075 if (E->getOperator() == OO_Amp) 11076 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11077 else 11078 First = getDerived().TransformExpr(E->getArg(0)); 11079 if (First.isInvalid()) 11080 return ExprError(); 11081 11082 ExprResult Second; 11083 if (E->getNumArgs() == 2) { 11084 Second = getDerived().TransformExpr(E->getArg(1)); 11085 if (Second.isInvalid()) 11086 return ExprError(); 11087 } 11088 11089 if (!getDerived().AlwaysRebuild() && 11090 Callee.get() == E->getCallee() && 11091 First.get() == E->getArg(0) && 11092 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11093 return SemaRef.MaybeBindToTemporary(E); 11094 11095 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11096 getSema().CurFPFeatures = E->getFPFeatures(); 11097 11098 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11099 E->getOperatorLoc(), 11100 Callee.get(), 11101 First.get(), 11102 Second.get()); 11103 } 11104 11105 template<typename Derived> 11106 ExprResult 11107 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11108 return getDerived().TransformCallExpr(E); 11109 } 11110 11111 template <typename Derived> 11112 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11113 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11114 getSema().CurContext != E->getParentContext(); 11115 11116 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11117 return E; 11118 11119 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11120 E->getEndLoc(), 11121 getSema().CurContext); 11122 } 11123 11124 template<typename Derived> 11125 ExprResult 11126 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11127 // Transform the callee. 11128 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11129 if (Callee.isInvalid()) 11130 return ExprError(); 11131 11132 // Transform exec config. 11133 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11134 if (EC.isInvalid()) 11135 return ExprError(); 11136 11137 // Transform arguments. 11138 bool ArgChanged = false; 11139 SmallVector<Expr*, 8> Args; 11140 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11141 &ArgChanged)) 11142 return ExprError(); 11143 11144 if (!getDerived().AlwaysRebuild() && 11145 Callee.get() == E->getCallee() && 11146 !ArgChanged) 11147 return SemaRef.MaybeBindToTemporary(E); 11148 11149 // FIXME: Wrong source location information for the '('. 11150 SourceLocation FakeLParenLoc 11151 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11152 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11153 Args, 11154 E->getRParenLoc(), EC.get()); 11155 } 11156 11157 template<typename Derived> 11158 ExprResult 11159 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11160 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11161 if (!Type) 11162 return ExprError(); 11163 11164 ExprResult SubExpr 11165 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11166 if (SubExpr.isInvalid()) 11167 return ExprError(); 11168 11169 if (!getDerived().AlwaysRebuild() && 11170 Type == E->getTypeInfoAsWritten() && 11171 SubExpr.get() == E->getSubExpr()) 11172 return E; 11173 return getDerived().RebuildCXXNamedCastExpr( 11174 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11175 Type, E->getAngleBrackets().getEnd(), 11176 // FIXME. this should be '(' location 11177 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11178 } 11179 11180 template<typename Derived> 11181 ExprResult 11182 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11183 TypeSourceInfo *TSI = 11184 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11185 if (!TSI) 11186 return ExprError(); 11187 11188 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11189 if (Sub.isInvalid()) 11190 return ExprError(); 11191 11192 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11193 Sub.get(), BCE->getEndLoc()); 11194 } 11195 11196 template<typename Derived> 11197 ExprResult 11198 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11199 return getDerived().TransformCXXNamedCastExpr(E); 11200 } 11201 11202 template<typename Derived> 11203 ExprResult 11204 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11205 return getDerived().TransformCXXNamedCastExpr(E); 11206 } 11207 11208 template<typename Derived> 11209 ExprResult 11210 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11211 CXXReinterpretCastExpr *E) { 11212 return getDerived().TransformCXXNamedCastExpr(E); 11213 } 11214 11215 template<typename Derived> 11216 ExprResult 11217 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11218 return getDerived().TransformCXXNamedCastExpr(E); 11219 } 11220 11221 template<typename Derived> 11222 ExprResult 11223 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11224 return getDerived().TransformCXXNamedCastExpr(E); 11225 } 11226 11227 template<typename Derived> 11228 ExprResult 11229 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11230 CXXFunctionalCastExpr *E) { 11231 TypeSourceInfo *Type = 11232 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11233 if (!Type) 11234 return ExprError(); 11235 11236 ExprResult SubExpr 11237 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11238 if (SubExpr.isInvalid()) 11239 return ExprError(); 11240 11241 if (!getDerived().AlwaysRebuild() && 11242 Type == E->getTypeInfoAsWritten() && 11243 SubExpr.get() == E->getSubExpr()) 11244 return E; 11245 11246 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11247 E->getLParenLoc(), 11248 SubExpr.get(), 11249 E->getRParenLoc(), 11250 E->isListInitialization()); 11251 } 11252 11253 template<typename Derived> 11254 ExprResult 11255 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11256 if (E->isTypeOperand()) { 11257 TypeSourceInfo *TInfo 11258 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11259 if (!TInfo) 11260 return ExprError(); 11261 11262 if (!getDerived().AlwaysRebuild() && 11263 TInfo == E->getTypeOperandSourceInfo()) 11264 return E; 11265 11266 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11267 TInfo, E->getEndLoc()); 11268 } 11269 11270 // We don't know whether the subexpression is potentially evaluated until 11271 // after we perform semantic analysis. We speculatively assume it is 11272 // unevaluated; it will get fixed later if the subexpression is in fact 11273 // potentially evaluated. 11274 EnterExpressionEvaluationContext Unevaluated( 11275 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11276 Sema::ReuseLambdaContextDecl); 11277 11278 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11279 if (SubExpr.isInvalid()) 11280 return ExprError(); 11281 11282 if (!getDerived().AlwaysRebuild() && 11283 SubExpr.get() == E->getExprOperand()) 11284 return E; 11285 11286 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11287 SubExpr.get(), E->getEndLoc()); 11288 } 11289 11290 template<typename Derived> 11291 ExprResult 11292 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11293 if (E->isTypeOperand()) { 11294 TypeSourceInfo *TInfo 11295 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11296 if (!TInfo) 11297 return ExprError(); 11298 11299 if (!getDerived().AlwaysRebuild() && 11300 TInfo == E->getTypeOperandSourceInfo()) 11301 return E; 11302 11303 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11304 TInfo, E->getEndLoc()); 11305 } 11306 11307 EnterExpressionEvaluationContext Unevaluated( 11308 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11309 11310 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11311 if (SubExpr.isInvalid()) 11312 return ExprError(); 11313 11314 if (!getDerived().AlwaysRebuild() && 11315 SubExpr.get() == E->getExprOperand()) 11316 return E; 11317 11318 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11319 SubExpr.get(), E->getEndLoc()); 11320 } 11321 11322 template<typename Derived> 11323 ExprResult 11324 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11325 return E; 11326 } 11327 11328 template<typename Derived> 11329 ExprResult 11330 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11331 CXXNullPtrLiteralExpr *E) { 11332 return E; 11333 } 11334 11335 template<typename Derived> 11336 ExprResult 11337 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11338 QualType T = getSema().getCurrentThisType(); 11339 11340 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11341 // Mark it referenced in the new context regardless. 11342 // FIXME: this is a bit instantiation-specific. 11343 getSema().MarkThisReferenced(E); 11344 return E; 11345 } 11346 11347 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11348 } 11349 11350 template<typename Derived> 11351 ExprResult 11352 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11353 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11354 if (SubExpr.isInvalid()) 11355 return ExprError(); 11356 11357 if (!getDerived().AlwaysRebuild() && 11358 SubExpr.get() == E->getSubExpr()) 11359 return E; 11360 11361 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11362 E->isThrownVariableInScope()); 11363 } 11364 11365 template<typename Derived> 11366 ExprResult 11367 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11368 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11369 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11370 if (!Param) 11371 return ExprError(); 11372 11373 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11374 E->getUsedContext() == SemaRef.CurContext) 11375 return E; 11376 11377 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11378 } 11379 11380 template<typename Derived> 11381 ExprResult 11382 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11383 FieldDecl *Field = cast_or_null<FieldDecl>( 11384 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11385 if (!Field) 11386 return ExprError(); 11387 11388 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11389 E->getUsedContext() == SemaRef.CurContext) 11390 return E; 11391 11392 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11393 } 11394 11395 template<typename Derived> 11396 ExprResult 11397 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11398 CXXScalarValueInitExpr *E) { 11399 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11400 if (!T) 11401 return ExprError(); 11402 11403 if (!getDerived().AlwaysRebuild() && 11404 T == E->getTypeSourceInfo()) 11405 return E; 11406 11407 return getDerived().RebuildCXXScalarValueInitExpr(T, 11408 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11409 E->getRParenLoc()); 11410 } 11411 11412 template<typename Derived> 11413 ExprResult 11414 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11415 // Transform the type that we're allocating 11416 TypeSourceInfo *AllocTypeInfo = 11417 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11418 if (!AllocTypeInfo) 11419 return ExprError(); 11420 11421 // Transform the size of the array we're allocating (if any). 11422 Optional<Expr *> ArraySize; 11423 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11424 ExprResult NewArraySize; 11425 if (*OldArraySize) { 11426 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11427 if (NewArraySize.isInvalid()) 11428 return ExprError(); 11429 } 11430 ArraySize = NewArraySize.get(); 11431 } 11432 11433 // Transform the placement arguments (if any). 11434 bool ArgumentChanged = false; 11435 SmallVector<Expr*, 8> PlacementArgs; 11436 if (getDerived().TransformExprs(E->getPlacementArgs(), 11437 E->getNumPlacementArgs(), true, 11438 PlacementArgs, &ArgumentChanged)) 11439 return ExprError(); 11440 11441 // Transform the initializer (if any). 11442 Expr *OldInit = E->getInitializer(); 11443 ExprResult NewInit; 11444 if (OldInit) 11445 NewInit = getDerived().TransformInitializer(OldInit, true); 11446 if (NewInit.isInvalid()) 11447 return ExprError(); 11448 11449 // Transform new operator and delete operator. 11450 FunctionDecl *OperatorNew = nullptr; 11451 if (E->getOperatorNew()) { 11452 OperatorNew = cast_or_null<FunctionDecl>( 11453 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11454 if (!OperatorNew) 11455 return ExprError(); 11456 } 11457 11458 FunctionDecl *OperatorDelete = nullptr; 11459 if (E->getOperatorDelete()) { 11460 OperatorDelete = cast_or_null<FunctionDecl>( 11461 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11462 if (!OperatorDelete) 11463 return ExprError(); 11464 } 11465 11466 if (!getDerived().AlwaysRebuild() && 11467 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11468 ArraySize == E->getArraySize() && 11469 NewInit.get() == OldInit && 11470 OperatorNew == E->getOperatorNew() && 11471 OperatorDelete == E->getOperatorDelete() && 11472 !ArgumentChanged) { 11473 // Mark any declarations we need as referenced. 11474 // FIXME: instantiation-specific. 11475 if (OperatorNew) 11476 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11477 if (OperatorDelete) 11478 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11479 11480 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11481 QualType ElementType 11482 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11483 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11484 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11485 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11486 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11487 } 11488 } 11489 } 11490 11491 return E; 11492 } 11493 11494 QualType AllocType = AllocTypeInfo->getType(); 11495 if (!ArraySize) { 11496 // If no array size was specified, but the new expression was 11497 // instantiated with an array type (e.g., "new T" where T is 11498 // instantiated with "int[4]"), extract the outer bound from the 11499 // array type as our array size. We do this with constant and 11500 // dependently-sized array types. 11501 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11502 if (!ArrayT) { 11503 // Do nothing 11504 } else if (const ConstantArrayType *ConsArrayT 11505 = dyn_cast<ConstantArrayType>(ArrayT)) { 11506 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11507 SemaRef.Context.getSizeType(), 11508 /*FIXME:*/ E->getBeginLoc()); 11509 AllocType = ConsArrayT->getElementType(); 11510 } else if (const DependentSizedArrayType *DepArrayT 11511 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11512 if (DepArrayT->getSizeExpr()) { 11513 ArraySize = DepArrayT->getSizeExpr(); 11514 AllocType = DepArrayT->getElementType(); 11515 } 11516 } 11517 } 11518 11519 return getDerived().RebuildCXXNewExpr( 11520 E->getBeginLoc(), E->isGlobalNew(), 11521 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11522 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11523 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11524 } 11525 11526 template<typename Derived> 11527 ExprResult 11528 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11529 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11530 if (Operand.isInvalid()) 11531 return ExprError(); 11532 11533 // Transform the delete operator, if known. 11534 FunctionDecl *OperatorDelete = nullptr; 11535 if (E->getOperatorDelete()) { 11536 OperatorDelete = cast_or_null<FunctionDecl>( 11537 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11538 if (!OperatorDelete) 11539 return ExprError(); 11540 } 11541 11542 if (!getDerived().AlwaysRebuild() && 11543 Operand.get() == E->getArgument() && 11544 OperatorDelete == E->getOperatorDelete()) { 11545 // Mark any declarations we need as referenced. 11546 // FIXME: instantiation-specific. 11547 if (OperatorDelete) 11548 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11549 11550 if (!E->getArgument()->isTypeDependent()) { 11551 QualType Destroyed = SemaRef.Context.getBaseElementType( 11552 E->getDestroyedType()); 11553 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11554 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11555 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11556 SemaRef.LookupDestructor(Record)); 11557 } 11558 } 11559 11560 return E; 11561 } 11562 11563 return getDerived().RebuildCXXDeleteExpr( 11564 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11565 } 11566 11567 template<typename Derived> 11568 ExprResult 11569 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11570 CXXPseudoDestructorExpr *E) { 11571 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11572 if (Base.isInvalid()) 11573 return ExprError(); 11574 11575 ParsedType ObjectTypePtr; 11576 bool MayBePseudoDestructor = false; 11577 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11578 E->getOperatorLoc(), 11579 E->isArrow()? tok::arrow : tok::period, 11580 ObjectTypePtr, 11581 MayBePseudoDestructor); 11582 if (Base.isInvalid()) 11583 return ExprError(); 11584 11585 QualType ObjectType = ObjectTypePtr.get(); 11586 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11587 if (QualifierLoc) { 11588 QualifierLoc 11589 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11590 if (!QualifierLoc) 11591 return ExprError(); 11592 } 11593 CXXScopeSpec SS; 11594 SS.Adopt(QualifierLoc); 11595 11596 PseudoDestructorTypeStorage Destroyed; 11597 if (E->getDestroyedTypeInfo()) { 11598 TypeSourceInfo *DestroyedTypeInfo 11599 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11600 ObjectType, nullptr, SS); 11601 if (!DestroyedTypeInfo) 11602 return ExprError(); 11603 Destroyed = DestroyedTypeInfo; 11604 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11605 // We aren't likely to be able to resolve the identifier down to a type 11606 // now anyway, so just retain the identifier. 11607 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11608 E->getDestroyedTypeLoc()); 11609 } else { 11610 // Look for a destructor known with the given name. 11611 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11612 *E->getDestroyedTypeIdentifier(), 11613 E->getDestroyedTypeLoc(), 11614 /*Scope=*/nullptr, 11615 SS, ObjectTypePtr, 11616 false); 11617 if (!T) 11618 return ExprError(); 11619 11620 Destroyed 11621 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11622 E->getDestroyedTypeLoc()); 11623 } 11624 11625 TypeSourceInfo *ScopeTypeInfo = nullptr; 11626 if (E->getScopeTypeInfo()) { 11627 CXXScopeSpec EmptySS; 11628 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11629 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11630 if (!ScopeTypeInfo) 11631 return ExprError(); 11632 } 11633 11634 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11635 E->getOperatorLoc(), 11636 E->isArrow(), 11637 SS, 11638 ScopeTypeInfo, 11639 E->getColonColonLoc(), 11640 E->getTildeLoc(), 11641 Destroyed); 11642 } 11643 11644 template <typename Derived> 11645 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11646 bool RequiresADL, 11647 LookupResult &R) { 11648 // Transform all the decls. 11649 bool AllEmptyPacks = true; 11650 for (auto *OldD : Old->decls()) { 11651 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11652 if (!InstD) { 11653 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11654 // This can happen because of dependent hiding. 11655 if (isa<UsingShadowDecl>(OldD)) 11656 continue; 11657 else { 11658 R.clear(); 11659 return true; 11660 } 11661 } 11662 11663 // Expand using pack declarations. 11664 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11665 ArrayRef<NamedDecl*> Decls = SingleDecl; 11666 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11667 Decls = UPD->expansions(); 11668 11669 // Expand using declarations. 11670 for (auto *D : Decls) { 11671 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11672 for (auto *SD : UD->shadows()) 11673 R.addDecl(SD); 11674 } else { 11675 R.addDecl(D); 11676 } 11677 } 11678 11679 AllEmptyPacks &= Decls.empty(); 11680 }; 11681 11682 // C++ [temp.res]/8.4.2: 11683 // The program is ill-formed, no diagnostic required, if [...] lookup for 11684 // a name in the template definition found a using-declaration, but the 11685 // lookup in the corresponding scope in the instantiation odoes not find 11686 // any declarations because the using-declaration was a pack expansion and 11687 // the corresponding pack is empty 11688 if (AllEmptyPacks && !RequiresADL) { 11689 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11690 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11691 return true; 11692 } 11693 11694 // Resolve a kind, but don't do any further analysis. If it's 11695 // ambiguous, the callee needs to deal with it. 11696 R.resolveKind(); 11697 return false; 11698 } 11699 11700 template<typename Derived> 11701 ExprResult 11702 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11703 UnresolvedLookupExpr *Old) { 11704 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11705 Sema::LookupOrdinaryName); 11706 11707 // Transform the declaration set. 11708 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11709 return ExprError(); 11710 11711 // Rebuild the nested-name qualifier, if present. 11712 CXXScopeSpec SS; 11713 if (Old->getQualifierLoc()) { 11714 NestedNameSpecifierLoc QualifierLoc 11715 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11716 if (!QualifierLoc) 11717 return ExprError(); 11718 11719 SS.Adopt(QualifierLoc); 11720 } 11721 11722 if (Old->getNamingClass()) { 11723 CXXRecordDecl *NamingClass 11724 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11725 Old->getNameLoc(), 11726 Old->getNamingClass())); 11727 if (!NamingClass) { 11728 R.clear(); 11729 return ExprError(); 11730 } 11731 11732 R.setNamingClass(NamingClass); 11733 } 11734 11735 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11736 11737 // If we have neither explicit template arguments, nor the template keyword, 11738 // it's a normal declaration name or member reference. 11739 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11740 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11741 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11742 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11743 // give a good diagnostic. 11744 if (D && D->isCXXInstanceMember()) { 11745 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11746 /*TemplateArgs=*/nullptr, 11747 /*Scope=*/nullptr); 11748 } 11749 11750 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11751 } 11752 11753 // If we have template arguments, rebuild them, then rebuild the 11754 // templateid expression. 11755 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11756 if (Old->hasExplicitTemplateArgs() && 11757 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11758 Old->getNumTemplateArgs(), 11759 TransArgs)) { 11760 R.clear(); 11761 return ExprError(); 11762 } 11763 11764 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11765 Old->requiresADL(), &TransArgs); 11766 } 11767 11768 template<typename Derived> 11769 ExprResult 11770 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11771 bool ArgChanged = false; 11772 SmallVector<TypeSourceInfo *, 4> Args; 11773 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11774 TypeSourceInfo *From = E->getArg(I); 11775 TypeLoc FromTL = From->getTypeLoc(); 11776 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11777 TypeLocBuilder TLB; 11778 TLB.reserve(FromTL.getFullDataSize()); 11779 QualType To = getDerived().TransformType(TLB, FromTL); 11780 if (To.isNull()) 11781 return ExprError(); 11782 11783 if (To == From->getType()) 11784 Args.push_back(From); 11785 else { 11786 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11787 ArgChanged = true; 11788 } 11789 continue; 11790 } 11791 11792 ArgChanged = true; 11793 11794 // We have a pack expansion. Instantiate it. 11795 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11796 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11797 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11798 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11799 11800 // Determine whether the set of unexpanded parameter packs can and should 11801 // be expanded. 11802 bool Expand = true; 11803 bool RetainExpansion = false; 11804 Optional<unsigned> OrigNumExpansions = 11805 ExpansionTL.getTypePtr()->getNumExpansions(); 11806 Optional<unsigned> NumExpansions = OrigNumExpansions; 11807 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11808 PatternTL.getSourceRange(), 11809 Unexpanded, 11810 Expand, RetainExpansion, 11811 NumExpansions)) 11812 return ExprError(); 11813 11814 if (!Expand) { 11815 // The transform has determined that we should perform a simple 11816 // transformation on the pack expansion, producing another pack 11817 // expansion. 11818 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11819 11820 TypeLocBuilder TLB; 11821 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11822 11823 QualType To = getDerived().TransformType(TLB, PatternTL); 11824 if (To.isNull()) 11825 return ExprError(); 11826 11827 To = getDerived().RebuildPackExpansionType(To, 11828 PatternTL.getSourceRange(), 11829 ExpansionTL.getEllipsisLoc(), 11830 NumExpansions); 11831 if (To.isNull()) 11832 return ExprError(); 11833 11834 PackExpansionTypeLoc ToExpansionTL 11835 = TLB.push<PackExpansionTypeLoc>(To); 11836 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11837 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11838 continue; 11839 } 11840 11841 // Expand the pack expansion by substituting for each argument in the 11842 // pack(s). 11843 for (unsigned I = 0; I != *NumExpansions; ++I) { 11844 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11845 TypeLocBuilder TLB; 11846 TLB.reserve(PatternTL.getFullDataSize()); 11847 QualType To = getDerived().TransformType(TLB, PatternTL); 11848 if (To.isNull()) 11849 return ExprError(); 11850 11851 if (To->containsUnexpandedParameterPack()) { 11852 To = getDerived().RebuildPackExpansionType(To, 11853 PatternTL.getSourceRange(), 11854 ExpansionTL.getEllipsisLoc(), 11855 NumExpansions); 11856 if (To.isNull()) 11857 return ExprError(); 11858 11859 PackExpansionTypeLoc ToExpansionTL 11860 = TLB.push<PackExpansionTypeLoc>(To); 11861 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11862 } 11863 11864 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11865 } 11866 11867 if (!RetainExpansion) 11868 continue; 11869 11870 // If we're supposed to retain a pack expansion, do so by temporarily 11871 // forgetting the partially-substituted parameter pack. 11872 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11873 11874 TypeLocBuilder TLB; 11875 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11876 11877 QualType To = getDerived().TransformType(TLB, PatternTL); 11878 if (To.isNull()) 11879 return ExprError(); 11880 11881 To = getDerived().RebuildPackExpansionType(To, 11882 PatternTL.getSourceRange(), 11883 ExpansionTL.getEllipsisLoc(), 11884 NumExpansions); 11885 if (To.isNull()) 11886 return ExprError(); 11887 11888 PackExpansionTypeLoc ToExpansionTL 11889 = TLB.push<PackExpansionTypeLoc>(To); 11890 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11891 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11892 } 11893 11894 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11895 return E; 11896 11897 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11898 E->getEndLoc()); 11899 } 11900 11901 template<typename Derived> 11902 ExprResult 11903 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11904 ConceptSpecializationExpr *E) { 11905 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11906 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11907 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11908 Old->NumTemplateArgs, TransArgs)) 11909 return ExprError(); 11910 11911 return getDerived().RebuildConceptSpecializationExpr( 11912 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11913 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11914 &TransArgs); 11915 } 11916 11917 template<typename Derived> 11918 ExprResult 11919 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11920 SmallVector<ParmVarDecl*, 4> TransParams; 11921 SmallVector<QualType, 4> TransParamTypes; 11922 Sema::ExtParameterInfoBuilder ExtParamInfos; 11923 11924 // C++2a [expr.prim.req]p2 11925 // Expressions appearing within a requirement-body are unevaluated operands. 11926 EnterExpressionEvaluationContext Ctx( 11927 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11928 11929 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11930 getSema().Context, getSema().CurContext, 11931 E->getBody()->getBeginLoc()); 11932 11933 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11934 11935 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11936 E->getLocalParameters(), 11937 /*ParamTypes=*/nullptr, 11938 /*ParamInfos=*/nullptr, 11939 TransParamTypes, &TransParams, 11940 ExtParamInfos)) 11941 return ExprError(); 11942 11943 for (ParmVarDecl *Param : TransParams) 11944 Param->setDeclContext(Body); 11945 11946 SmallVector<concepts::Requirement *, 4> TransReqs; 11947 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11948 TransReqs)) 11949 return ExprError(); 11950 11951 for (concepts::Requirement *Req : TransReqs) { 11952 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11953 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11954 ER->getReturnTypeRequirement() 11955 .getTypeConstraintTemplateParameterList()->getParam(0) 11956 ->setDeclContext(Body); 11957 } 11958 } 11959 } 11960 11961 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11962 TransParams, TransReqs, 11963 E->getRBraceLoc()); 11964 } 11965 11966 template<typename Derived> 11967 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11968 ArrayRef<concepts::Requirement *> Reqs, 11969 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11970 for (concepts::Requirement *Req : Reqs) { 11971 concepts::Requirement *TransReq = nullptr; 11972 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11973 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11974 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11975 TransReq = getDerived().TransformExprRequirement(ExprReq); 11976 else 11977 TransReq = getDerived().TransformNestedRequirement( 11978 cast<concepts::NestedRequirement>(Req)); 11979 if (!TransReq) 11980 return true; 11981 Transformed.push_back(TransReq); 11982 } 11983 return false; 11984 } 11985 11986 template<typename Derived> 11987 concepts::TypeRequirement * 11988 TreeTransform<Derived>::TransformTypeRequirement( 11989 concepts::TypeRequirement *Req) { 11990 if (Req->isSubstitutionFailure()) { 11991 if (getDerived().AlwaysRebuild()) 11992 return getDerived().RebuildTypeRequirement( 11993 Req->getSubstitutionDiagnostic()); 11994 return Req; 11995 } 11996 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11997 if (!TransType) 11998 return nullptr; 11999 return getDerived().RebuildTypeRequirement(TransType); 12000 } 12001 12002 template<typename Derived> 12003 concepts::ExprRequirement * 12004 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12005 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12006 if (Req->isExprSubstitutionFailure()) 12007 TransExpr = Req->getExprSubstitutionDiagnostic(); 12008 else { 12009 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12010 if (TransExprRes.isInvalid()) 12011 return nullptr; 12012 TransExpr = TransExprRes.get(); 12013 } 12014 12015 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12016 const auto &RetReq = Req->getReturnTypeRequirement(); 12017 if (RetReq.isEmpty()) 12018 TransRetReq.emplace(); 12019 else if (RetReq.isSubstitutionFailure()) 12020 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12021 else if (RetReq.isTypeConstraint()) { 12022 TemplateParameterList *OrigTPL = 12023 RetReq.getTypeConstraintTemplateParameterList(); 12024 TemplateParameterList *TPL = 12025 getDerived().TransformTemplateParameterList(OrigTPL); 12026 if (!TPL) 12027 return nullptr; 12028 TransRetReq.emplace(TPL); 12029 } 12030 assert(TransRetReq.hasValue() && 12031 "All code paths leading here must set TransRetReq"); 12032 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12033 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12034 Req->getNoexceptLoc(), 12035 std::move(*TransRetReq)); 12036 return getDerived().RebuildExprRequirement( 12037 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12038 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12039 } 12040 12041 template<typename Derived> 12042 concepts::NestedRequirement * 12043 TreeTransform<Derived>::TransformNestedRequirement( 12044 concepts::NestedRequirement *Req) { 12045 if (Req->isSubstitutionFailure()) { 12046 if (getDerived().AlwaysRebuild()) 12047 return getDerived().RebuildNestedRequirement( 12048 Req->getSubstitutionDiagnostic()); 12049 return Req; 12050 } 12051 ExprResult TransConstraint = 12052 getDerived().TransformExpr(Req->getConstraintExpr()); 12053 if (TransConstraint.isInvalid()) 12054 return nullptr; 12055 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12056 } 12057 12058 template<typename Derived> 12059 ExprResult 12060 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12061 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12062 if (!T) 12063 return ExprError(); 12064 12065 if (!getDerived().AlwaysRebuild() && 12066 T == E->getQueriedTypeSourceInfo()) 12067 return E; 12068 12069 ExprResult SubExpr; 12070 { 12071 EnterExpressionEvaluationContext Unevaluated( 12072 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12073 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12074 if (SubExpr.isInvalid()) 12075 return ExprError(); 12076 12077 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12078 return E; 12079 } 12080 12081 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12082 SubExpr.get(), E->getEndLoc()); 12083 } 12084 12085 template<typename Derived> 12086 ExprResult 12087 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12088 ExprResult SubExpr; 12089 { 12090 EnterExpressionEvaluationContext Unevaluated( 12091 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12092 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12093 if (SubExpr.isInvalid()) 12094 return ExprError(); 12095 12096 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12097 return E; 12098 } 12099 12100 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12101 SubExpr.get(), E->getEndLoc()); 12102 } 12103 12104 template <typename Derived> 12105 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12106 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12107 TypeSourceInfo **RecoveryTSI) { 12108 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12109 DRE, AddrTaken, RecoveryTSI); 12110 12111 // Propagate both errors and recovered types, which return ExprEmpty. 12112 if (!NewDRE.isUsable()) 12113 return NewDRE; 12114 12115 // We got an expr, wrap it up in parens. 12116 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12117 return PE; 12118 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12119 PE->getRParen()); 12120 } 12121 12122 template <typename Derived> 12123 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12124 DependentScopeDeclRefExpr *E) { 12125 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12126 nullptr); 12127 } 12128 12129 template<typename Derived> 12130 ExprResult 12131 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12132 DependentScopeDeclRefExpr *E, 12133 bool IsAddressOfOperand, 12134 TypeSourceInfo **RecoveryTSI) { 12135 assert(E->getQualifierLoc()); 12136 NestedNameSpecifierLoc QualifierLoc 12137 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12138 if (!QualifierLoc) 12139 return ExprError(); 12140 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12141 12142 // TODO: If this is a conversion-function-id, verify that the 12143 // destination type name (if present) resolves the same way after 12144 // instantiation as it did in the local scope. 12145 12146 DeclarationNameInfo NameInfo 12147 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12148 if (!NameInfo.getName()) 12149 return ExprError(); 12150 12151 if (!E->hasExplicitTemplateArgs()) { 12152 if (!getDerived().AlwaysRebuild() && 12153 QualifierLoc == E->getQualifierLoc() && 12154 // Note: it is sufficient to compare the Name component of NameInfo: 12155 // if name has not changed, DNLoc has not changed either. 12156 NameInfo.getName() == E->getDeclName()) 12157 return E; 12158 12159 return getDerived().RebuildDependentScopeDeclRefExpr( 12160 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12161 IsAddressOfOperand, RecoveryTSI); 12162 } 12163 12164 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12165 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12166 E->getNumTemplateArgs(), 12167 TransArgs)) 12168 return ExprError(); 12169 12170 return getDerived().RebuildDependentScopeDeclRefExpr( 12171 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12172 RecoveryTSI); 12173 } 12174 12175 template<typename Derived> 12176 ExprResult 12177 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12178 // CXXConstructExprs other than for list-initialization and 12179 // CXXTemporaryObjectExpr are always implicit, so when we have 12180 // a 1-argument construction we just transform that argument. 12181 if (getDerived().AllowSkippingCXXConstructExpr() && 12182 ((E->getNumArgs() == 1 || 12183 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12184 (!getDerived().DropCallArgument(E->getArg(0))) && 12185 !E->isListInitialization())) 12186 return getDerived().TransformExpr(E->getArg(0)); 12187 12188 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12189 12190 QualType T = getDerived().TransformType(E->getType()); 12191 if (T.isNull()) 12192 return ExprError(); 12193 12194 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12195 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12196 if (!Constructor) 12197 return ExprError(); 12198 12199 bool ArgumentChanged = false; 12200 SmallVector<Expr*, 8> Args; 12201 { 12202 EnterExpressionEvaluationContext Context( 12203 getSema(), EnterExpressionEvaluationContext::InitList, 12204 E->isListInitialization()); 12205 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12206 &ArgumentChanged)) 12207 return ExprError(); 12208 } 12209 12210 if (!getDerived().AlwaysRebuild() && 12211 T == E->getType() && 12212 Constructor == E->getConstructor() && 12213 !ArgumentChanged) { 12214 // Mark the constructor as referenced. 12215 // FIXME: Instantiation-specific 12216 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12217 return E; 12218 } 12219 12220 return getDerived().RebuildCXXConstructExpr( 12221 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12222 E->hadMultipleCandidates(), E->isListInitialization(), 12223 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12224 E->getConstructionKind(), E->getParenOrBraceRange()); 12225 } 12226 12227 template<typename Derived> 12228 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12229 CXXInheritedCtorInitExpr *E) { 12230 QualType T = getDerived().TransformType(E->getType()); 12231 if (T.isNull()) 12232 return ExprError(); 12233 12234 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12235 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12236 if (!Constructor) 12237 return ExprError(); 12238 12239 if (!getDerived().AlwaysRebuild() && 12240 T == E->getType() && 12241 Constructor == E->getConstructor()) { 12242 // Mark the constructor as referenced. 12243 // FIXME: Instantiation-specific 12244 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12245 return E; 12246 } 12247 12248 return getDerived().RebuildCXXInheritedCtorInitExpr( 12249 T, E->getLocation(), Constructor, 12250 E->constructsVBase(), E->inheritedFromVBase()); 12251 } 12252 12253 /// Transform a C++ temporary-binding expression. 12254 /// 12255 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12256 /// transform the subexpression and return that. 12257 template<typename Derived> 12258 ExprResult 12259 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12260 return getDerived().TransformExpr(E->getSubExpr()); 12261 } 12262 12263 /// Transform a C++ expression that contains cleanups that should 12264 /// be run after the expression is evaluated. 12265 /// 12266 /// Since ExprWithCleanups nodes are implicitly generated, we 12267 /// just transform the subexpression and return that. 12268 template<typename Derived> 12269 ExprResult 12270 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12271 return getDerived().TransformExpr(E->getSubExpr()); 12272 } 12273 12274 template<typename Derived> 12275 ExprResult 12276 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12277 CXXTemporaryObjectExpr *E) { 12278 TypeSourceInfo *T = 12279 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12280 if (!T) 12281 return ExprError(); 12282 12283 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12284 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12285 if (!Constructor) 12286 return ExprError(); 12287 12288 bool ArgumentChanged = false; 12289 SmallVector<Expr*, 8> Args; 12290 Args.reserve(E->getNumArgs()); 12291 { 12292 EnterExpressionEvaluationContext Context( 12293 getSema(), EnterExpressionEvaluationContext::InitList, 12294 E->isListInitialization()); 12295 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12296 &ArgumentChanged)) 12297 return ExprError(); 12298 } 12299 12300 if (!getDerived().AlwaysRebuild() && 12301 T == E->getTypeSourceInfo() && 12302 Constructor == E->getConstructor() && 12303 !ArgumentChanged) { 12304 // FIXME: Instantiation-specific 12305 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12306 return SemaRef.MaybeBindToTemporary(E); 12307 } 12308 12309 // FIXME: We should just pass E->isListInitialization(), but we're not 12310 // prepared to handle list-initialization without a child InitListExpr. 12311 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12312 return getDerived().RebuildCXXTemporaryObjectExpr( 12313 T, LParenLoc, Args, E->getEndLoc(), 12314 /*ListInitialization=*/LParenLoc.isInvalid()); 12315 } 12316 12317 template<typename Derived> 12318 ExprResult 12319 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12320 // Transform any init-capture expressions before entering the scope of the 12321 // lambda body, because they are not semantically within that scope. 12322 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12323 struct TransformedInitCapture { 12324 // The location of the ... if the result is retaining a pack expansion. 12325 SourceLocation EllipsisLoc; 12326 // Zero or more expansions of the init-capture. 12327 SmallVector<InitCaptureInfoTy, 4> Expansions; 12328 }; 12329 SmallVector<TransformedInitCapture, 4> InitCaptures; 12330 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12331 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12332 CEnd = E->capture_end(); 12333 C != CEnd; ++C) { 12334 if (!E->isInitCapture(C)) 12335 continue; 12336 12337 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12338 VarDecl *OldVD = C->getCapturedVar(); 12339 12340 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12341 Optional<unsigned> NumExpansions) { 12342 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12343 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12344 12345 if (NewExprInitResult.isInvalid()) { 12346 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12347 return; 12348 } 12349 Expr *NewExprInit = NewExprInitResult.get(); 12350 12351 QualType NewInitCaptureType = 12352 getSema().buildLambdaInitCaptureInitialization( 12353 C->getLocation(), OldVD->getType()->isReferenceType(), 12354 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12355 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12356 NewExprInit); 12357 Result.Expansions.push_back( 12358 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12359 }; 12360 12361 // If this is an init-capture pack, consider expanding the pack now. 12362 if (OldVD->isParameterPack()) { 12363 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12364 ->getTypeLoc() 12365 .castAs<PackExpansionTypeLoc>(); 12366 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12367 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12368 12369 // Determine whether the set of unexpanded parameter packs can and should 12370 // be expanded. 12371 bool Expand = true; 12372 bool RetainExpansion = false; 12373 Optional<unsigned> OrigNumExpansions = 12374 ExpansionTL.getTypePtr()->getNumExpansions(); 12375 Optional<unsigned> NumExpansions = OrigNumExpansions; 12376 if (getDerived().TryExpandParameterPacks( 12377 ExpansionTL.getEllipsisLoc(), 12378 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12379 RetainExpansion, NumExpansions)) 12380 return ExprError(); 12381 if (Expand) { 12382 for (unsigned I = 0; I != *NumExpansions; ++I) { 12383 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12384 SubstInitCapture(SourceLocation(), None); 12385 } 12386 } 12387 if (!Expand || RetainExpansion) { 12388 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12389 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12390 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12391 } 12392 } else { 12393 SubstInitCapture(SourceLocation(), None); 12394 } 12395 } 12396 12397 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12398 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12399 12400 // Transform the template parameters, and add them to the current 12401 // instantiation scope. The null case is handled correctly. 12402 auto TPL = getDerived().TransformTemplateParameterList( 12403 E->getTemplateParameterList()); 12404 LSI->GLTemplateParameterList = TPL; 12405 12406 // Transform the type of the original lambda's call operator. 12407 // The transformation MUST be done in the CurrentInstantiationScope since 12408 // it introduces a mapping of the original to the newly created 12409 // transformed parameters. 12410 TypeSourceInfo *NewCallOpTSI = nullptr; 12411 { 12412 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12413 FunctionProtoTypeLoc OldCallOpFPTL = 12414 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12415 12416 TypeLocBuilder NewCallOpTLBuilder; 12417 SmallVector<QualType, 4> ExceptionStorage; 12418 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12419 QualType NewCallOpType = TransformFunctionProtoType( 12420 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12421 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12422 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12423 ExceptionStorage, Changed); 12424 }); 12425 if (NewCallOpType.isNull()) 12426 return ExprError(); 12427 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12428 NewCallOpType); 12429 } 12430 12431 // Transform the trailing requires clause 12432 ExprResult NewTrailingRequiresClause; 12433 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12434 // FIXME: Concepts: Substitution into requires clause should only happen 12435 // when checking satisfaction. 12436 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12437 12438 // Create the local class that will describe the lambda. 12439 // FIXME: KnownDependent below is wrong when substituting inside a templated 12440 // context that isn't a DeclContext (such as a variable template). 12441 CXXRecordDecl *OldClass = E->getLambdaClass(); 12442 CXXRecordDecl *Class 12443 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12444 NewCallOpTSI, 12445 /*KnownDependent=*/false, 12446 E->getCaptureDefault()); 12447 getDerived().transformedLocalDecl(OldClass, {Class}); 12448 12449 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12450 if (getDerived().ReplacingOriginal()) 12451 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12452 OldClass->hasKnownLambdaInternalLinkage(), 12453 OldClass->getLambdaContextDecl()); 12454 12455 // Build the call operator. 12456 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12457 Class, E->getIntroducerRange(), NewCallOpTSI, 12458 E->getCallOperator()->getEndLoc(), 12459 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12460 E->getCallOperator()->getConstexprKind(), 12461 NewTrailingRequiresClause.get()); 12462 12463 LSI->CallOperator = NewCallOperator; 12464 12465 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12466 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12467 12468 // Number the lambda for linkage purposes if necessary. 12469 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12470 12471 // Introduce the context of the call operator. 12472 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12473 /*NewThisContext*/false); 12474 12475 // Enter the scope of the lambda. 12476 getSema().buildLambdaScope(LSI, NewCallOperator, 12477 E->getIntroducerRange(), 12478 E->getCaptureDefault(), 12479 E->getCaptureDefaultLoc(), 12480 E->hasExplicitParameters(), 12481 E->hasExplicitResultType(), 12482 E->isMutable()); 12483 12484 bool Invalid = false; 12485 12486 // Transform captures. 12487 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12488 CEnd = E->capture_end(); 12489 C != CEnd; ++C) { 12490 // When we hit the first implicit capture, tell Sema that we've finished 12491 // the list of explicit captures. 12492 if (C->isImplicit()) 12493 break; 12494 12495 // Capturing 'this' is trivial. 12496 if (C->capturesThis()) { 12497 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12498 /*BuildAndDiagnose*/ true, nullptr, 12499 C->getCaptureKind() == LCK_StarThis); 12500 continue; 12501 } 12502 // Captured expression will be recaptured during captured variables 12503 // rebuilding. 12504 if (C->capturesVLAType()) 12505 continue; 12506 12507 // Rebuild init-captures, including the implied field declaration. 12508 if (E->isInitCapture(C)) { 12509 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12510 12511 VarDecl *OldVD = C->getCapturedVar(); 12512 llvm::SmallVector<Decl*, 4> NewVDs; 12513 12514 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12515 ExprResult Init = Info.first; 12516 QualType InitQualType = Info.second; 12517 if (Init.isInvalid() || InitQualType.isNull()) { 12518 Invalid = true; 12519 break; 12520 } 12521 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12522 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12523 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12524 if (!NewVD) { 12525 Invalid = true; 12526 break; 12527 } 12528 NewVDs.push_back(NewVD); 12529 getSema().addInitCapture(LSI, NewVD); 12530 } 12531 12532 if (Invalid) 12533 break; 12534 12535 getDerived().transformedLocalDecl(OldVD, NewVDs); 12536 continue; 12537 } 12538 12539 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12540 12541 // Determine the capture kind for Sema. 12542 Sema::TryCaptureKind Kind 12543 = C->isImplicit()? Sema::TryCapture_Implicit 12544 : C->getCaptureKind() == LCK_ByCopy 12545 ? Sema::TryCapture_ExplicitByVal 12546 : Sema::TryCapture_ExplicitByRef; 12547 SourceLocation EllipsisLoc; 12548 if (C->isPackExpansion()) { 12549 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12550 bool ShouldExpand = false; 12551 bool RetainExpansion = false; 12552 Optional<unsigned> NumExpansions; 12553 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12554 C->getLocation(), 12555 Unexpanded, 12556 ShouldExpand, RetainExpansion, 12557 NumExpansions)) { 12558 Invalid = true; 12559 continue; 12560 } 12561 12562 if (ShouldExpand) { 12563 // The transform has determined that we should perform an expansion; 12564 // transform and capture each of the arguments. 12565 // expansion of the pattern. Do so. 12566 VarDecl *Pack = C->getCapturedVar(); 12567 for (unsigned I = 0; I != *NumExpansions; ++I) { 12568 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12569 VarDecl *CapturedVar 12570 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12571 Pack)); 12572 if (!CapturedVar) { 12573 Invalid = true; 12574 continue; 12575 } 12576 12577 // Capture the transformed variable. 12578 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12579 } 12580 12581 // FIXME: Retain a pack expansion if RetainExpansion is true. 12582 12583 continue; 12584 } 12585 12586 EllipsisLoc = C->getEllipsisLoc(); 12587 } 12588 12589 // Transform the captured variable. 12590 VarDecl *CapturedVar 12591 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12592 C->getCapturedVar())); 12593 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12594 Invalid = true; 12595 continue; 12596 } 12597 12598 // Capture the transformed variable. 12599 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12600 EllipsisLoc); 12601 } 12602 getSema().finishLambdaExplicitCaptures(LSI); 12603 12604 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12605 // evaluation context even if we're not transforming the function body. 12606 getSema().PushExpressionEvaluationContext( 12607 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12608 12609 // Instantiate the body of the lambda expression. 12610 StmtResult Body = 12611 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12612 12613 // ActOnLambda* will pop the function scope for us. 12614 FuncScopeCleanup.disable(); 12615 12616 if (Body.isInvalid()) { 12617 SavedContext.pop(); 12618 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12619 /*IsInstantiation=*/true); 12620 return ExprError(); 12621 } 12622 12623 // Copy the LSI before ActOnFinishFunctionBody removes it. 12624 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12625 // the call operator. 12626 auto LSICopy = *LSI; 12627 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12628 /*IsInstantiation*/ true); 12629 SavedContext.pop(); 12630 12631 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12632 &LSICopy); 12633 } 12634 12635 template<typename Derived> 12636 StmtResult 12637 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12638 return TransformStmt(S); 12639 } 12640 12641 template<typename Derived> 12642 StmtResult 12643 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12644 // Transform captures. 12645 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12646 CEnd = E->capture_end(); 12647 C != CEnd; ++C) { 12648 // When we hit the first implicit capture, tell Sema that we've finished 12649 // the list of explicit captures. 12650 if (!C->isImplicit()) 12651 continue; 12652 12653 // Capturing 'this' is trivial. 12654 if (C->capturesThis()) { 12655 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12656 /*BuildAndDiagnose*/ true, nullptr, 12657 C->getCaptureKind() == LCK_StarThis); 12658 continue; 12659 } 12660 // Captured expression will be recaptured during captured variables 12661 // rebuilding. 12662 if (C->capturesVLAType()) 12663 continue; 12664 12665 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12666 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12667 12668 // Transform the captured variable. 12669 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12670 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12671 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12672 return StmtError(); 12673 12674 // Capture the transformed variable. 12675 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12676 } 12677 12678 return S; 12679 } 12680 12681 template<typename Derived> 12682 ExprResult 12683 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12684 CXXUnresolvedConstructExpr *E) { 12685 TypeSourceInfo *T = 12686 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12687 if (!T) 12688 return ExprError(); 12689 12690 bool ArgumentChanged = false; 12691 SmallVector<Expr*, 8> Args; 12692 Args.reserve(E->arg_size()); 12693 { 12694 EnterExpressionEvaluationContext Context( 12695 getSema(), EnterExpressionEvaluationContext::InitList, 12696 E->isListInitialization()); 12697 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12698 &ArgumentChanged)) 12699 return ExprError(); 12700 } 12701 12702 if (!getDerived().AlwaysRebuild() && 12703 T == E->getTypeSourceInfo() && 12704 !ArgumentChanged) 12705 return E; 12706 12707 // FIXME: we're faking the locations of the commas 12708 return getDerived().RebuildCXXUnresolvedConstructExpr( 12709 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12710 } 12711 12712 template<typename Derived> 12713 ExprResult 12714 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12715 CXXDependentScopeMemberExpr *E) { 12716 // Transform the base of the expression. 12717 ExprResult Base((Expr*) nullptr); 12718 Expr *OldBase; 12719 QualType BaseType; 12720 QualType ObjectType; 12721 if (!E->isImplicitAccess()) { 12722 OldBase = E->getBase(); 12723 Base = getDerived().TransformExpr(OldBase); 12724 if (Base.isInvalid()) 12725 return ExprError(); 12726 12727 // Start the member reference and compute the object's type. 12728 ParsedType ObjectTy; 12729 bool MayBePseudoDestructor = false; 12730 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12731 E->getOperatorLoc(), 12732 E->isArrow()? tok::arrow : tok::period, 12733 ObjectTy, 12734 MayBePseudoDestructor); 12735 if (Base.isInvalid()) 12736 return ExprError(); 12737 12738 ObjectType = ObjectTy.get(); 12739 BaseType = ((Expr*) Base.get())->getType(); 12740 } else { 12741 OldBase = nullptr; 12742 BaseType = getDerived().TransformType(E->getBaseType()); 12743 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12744 } 12745 12746 // Transform the first part of the nested-name-specifier that qualifies 12747 // the member name. 12748 NamedDecl *FirstQualifierInScope 12749 = getDerived().TransformFirstQualifierInScope( 12750 E->getFirstQualifierFoundInScope(), 12751 E->getQualifierLoc().getBeginLoc()); 12752 12753 NestedNameSpecifierLoc QualifierLoc; 12754 if (E->getQualifier()) { 12755 QualifierLoc 12756 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12757 ObjectType, 12758 FirstQualifierInScope); 12759 if (!QualifierLoc) 12760 return ExprError(); 12761 } 12762 12763 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12764 12765 // TODO: If this is a conversion-function-id, verify that the 12766 // destination type name (if present) resolves the same way after 12767 // instantiation as it did in the local scope. 12768 12769 DeclarationNameInfo NameInfo 12770 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12771 if (!NameInfo.getName()) 12772 return ExprError(); 12773 12774 if (!E->hasExplicitTemplateArgs()) { 12775 // This is a reference to a member without an explicitly-specified 12776 // template argument list. Optimize for this common case. 12777 if (!getDerived().AlwaysRebuild() && 12778 Base.get() == OldBase && 12779 BaseType == E->getBaseType() && 12780 QualifierLoc == E->getQualifierLoc() && 12781 NameInfo.getName() == E->getMember() && 12782 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12783 return E; 12784 12785 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12786 BaseType, 12787 E->isArrow(), 12788 E->getOperatorLoc(), 12789 QualifierLoc, 12790 TemplateKWLoc, 12791 FirstQualifierInScope, 12792 NameInfo, 12793 /*TemplateArgs*/nullptr); 12794 } 12795 12796 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12797 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12798 E->getNumTemplateArgs(), 12799 TransArgs)) 12800 return ExprError(); 12801 12802 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12803 BaseType, 12804 E->isArrow(), 12805 E->getOperatorLoc(), 12806 QualifierLoc, 12807 TemplateKWLoc, 12808 FirstQualifierInScope, 12809 NameInfo, 12810 &TransArgs); 12811 } 12812 12813 template<typename Derived> 12814 ExprResult 12815 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12816 // Transform the base of the expression. 12817 ExprResult Base((Expr*) nullptr); 12818 QualType BaseType; 12819 if (!Old->isImplicitAccess()) { 12820 Base = getDerived().TransformExpr(Old->getBase()); 12821 if (Base.isInvalid()) 12822 return ExprError(); 12823 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12824 Old->isArrow()); 12825 if (Base.isInvalid()) 12826 return ExprError(); 12827 BaseType = Base.get()->getType(); 12828 } else { 12829 BaseType = getDerived().TransformType(Old->getBaseType()); 12830 } 12831 12832 NestedNameSpecifierLoc QualifierLoc; 12833 if (Old->getQualifierLoc()) { 12834 QualifierLoc 12835 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12836 if (!QualifierLoc) 12837 return ExprError(); 12838 } 12839 12840 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12841 12842 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12843 Sema::LookupOrdinaryName); 12844 12845 // Transform the declaration set. 12846 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12847 return ExprError(); 12848 12849 // Determine the naming class. 12850 if (Old->getNamingClass()) { 12851 CXXRecordDecl *NamingClass 12852 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12853 Old->getMemberLoc(), 12854 Old->getNamingClass())); 12855 if (!NamingClass) 12856 return ExprError(); 12857 12858 R.setNamingClass(NamingClass); 12859 } 12860 12861 TemplateArgumentListInfo TransArgs; 12862 if (Old->hasExplicitTemplateArgs()) { 12863 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12864 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12865 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12866 Old->getNumTemplateArgs(), 12867 TransArgs)) 12868 return ExprError(); 12869 } 12870 12871 // FIXME: to do this check properly, we will need to preserve the 12872 // first-qualifier-in-scope here, just in case we had a dependent 12873 // base (and therefore couldn't do the check) and a 12874 // nested-name-qualifier (and therefore could do the lookup). 12875 NamedDecl *FirstQualifierInScope = nullptr; 12876 12877 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12878 BaseType, 12879 Old->getOperatorLoc(), 12880 Old->isArrow(), 12881 QualifierLoc, 12882 TemplateKWLoc, 12883 FirstQualifierInScope, 12884 R, 12885 (Old->hasExplicitTemplateArgs() 12886 ? &TransArgs : nullptr)); 12887 } 12888 12889 template<typename Derived> 12890 ExprResult 12891 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12892 EnterExpressionEvaluationContext Unevaluated( 12893 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12894 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12895 if (SubExpr.isInvalid()) 12896 return ExprError(); 12897 12898 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12899 return E; 12900 12901 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12902 } 12903 12904 template<typename Derived> 12905 ExprResult 12906 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12907 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12908 if (Pattern.isInvalid()) 12909 return ExprError(); 12910 12911 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12912 return E; 12913 12914 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12915 E->getNumExpansions()); 12916 } 12917 12918 template<typename Derived> 12919 ExprResult 12920 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12921 // If E is not value-dependent, then nothing will change when we transform it. 12922 // Note: This is an instantiation-centric view. 12923 if (!E->isValueDependent()) 12924 return E; 12925 12926 EnterExpressionEvaluationContext Unevaluated( 12927 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12928 12929 ArrayRef<TemplateArgument> PackArgs; 12930 TemplateArgument ArgStorage; 12931 12932 // Find the argument list to transform. 12933 if (E->isPartiallySubstituted()) { 12934 PackArgs = E->getPartialArguments(); 12935 } else if (E->isValueDependent()) { 12936 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12937 bool ShouldExpand = false; 12938 bool RetainExpansion = false; 12939 Optional<unsigned> NumExpansions; 12940 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12941 Unexpanded, 12942 ShouldExpand, RetainExpansion, 12943 NumExpansions)) 12944 return ExprError(); 12945 12946 // If we need to expand the pack, build a template argument from it and 12947 // expand that. 12948 if (ShouldExpand) { 12949 auto *Pack = E->getPack(); 12950 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12951 ArgStorage = getSema().Context.getPackExpansionType( 12952 getSema().Context.getTypeDeclType(TTPD), None); 12953 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12954 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12955 } else { 12956 auto *VD = cast<ValueDecl>(Pack); 12957 ExprResult DRE = getSema().BuildDeclRefExpr( 12958 VD, VD->getType().getNonLValueExprType(getSema().Context), 12959 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12960 E->getPackLoc()); 12961 if (DRE.isInvalid()) 12962 return ExprError(); 12963 ArgStorage = new (getSema().Context) PackExpansionExpr( 12964 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12965 } 12966 PackArgs = ArgStorage; 12967 } 12968 } 12969 12970 // If we're not expanding the pack, just transform the decl. 12971 if (!PackArgs.size()) { 12972 auto *Pack = cast_or_null<NamedDecl>( 12973 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12974 if (!Pack) 12975 return ExprError(); 12976 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12977 E->getPackLoc(), 12978 E->getRParenLoc(), None, None); 12979 } 12980 12981 // Try to compute the result without performing a partial substitution. 12982 Optional<unsigned> Result = 0; 12983 for (const TemplateArgument &Arg : PackArgs) { 12984 if (!Arg.isPackExpansion()) { 12985 Result = *Result + 1; 12986 continue; 12987 } 12988 12989 TemplateArgumentLoc ArgLoc; 12990 InventTemplateArgumentLoc(Arg, ArgLoc); 12991 12992 // Find the pattern of the pack expansion. 12993 SourceLocation Ellipsis; 12994 Optional<unsigned> OrigNumExpansions; 12995 TemplateArgumentLoc Pattern = 12996 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12997 OrigNumExpansions); 12998 12999 // Substitute under the pack expansion. Do not expand the pack (yet). 13000 TemplateArgumentLoc OutPattern; 13001 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13002 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13003 /*Uneval*/ true)) 13004 return true; 13005 13006 // See if we can determine the number of arguments from the result. 13007 Optional<unsigned> NumExpansions = 13008 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13009 if (!NumExpansions) { 13010 // No: we must be in an alias template expansion, and we're going to need 13011 // to actually expand the packs. 13012 Result = None; 13013 break; 13014 } 13015 13016 Result = *Result + *NumExpansions; 13017 } 13018 13019 // Common case: we could determine the number of expansions without 13020 // substituting. 13021 if (Result) 13022 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13023 E->getPackLoc(), 13024 E->getRParenLoc(), *Result, None); 13025 13026 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13027 E->getPackLoc()); 13028 { 13029 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13030 typedef TemplateArgumentLocInventIterator< 13031 Derived, const TemplateArgument*> PackLocIterator; 13032 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13033 PackLocIterator(*this, PackArgs.end()), 13034 TransformedPackArgs, /*Uneval*/true)) 13035 return ExprError(); 13036 } 13037 13038 // Check whether we managed to fully-expand the pack. 13039 // FIXME: Is it possible for us to do so and not hit the early exit path? 13040 SmallVector<TemplateArgument, 8> Args; 13041 bool PartialSubstitution = false; 13042 for (auto &Loc : TransformedPackArgs.arguments()) { 13043 Args.push_back(Loc.getArgument()); 13044 if (Loc.getArgument().isPackExpansion()) 13045 PartialSubstitution = true; 13046 } 13047 13048 if (PartialSubstitution) 13049 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13050 E->getPackLoc(), 13051 E->getRParenLoc(), None, Args); 13052 13053 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13054 E->getPackLoc(), E->getRParenLoc(), 13055 Args.size(), None); 13056 } 13057 13058 template<typename Derived> 13059 ExprResult 13060 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13061 SubstNonTypeTemplateParmPackExpr *E) { 13062 // Default behavior is to do nothing with this transformation. 13063 return E; 13064 } 13065 13066 template<typename Derived> 13067 ExprResult 13068 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13069 SubstNonTypeTemplateParmExpr *E) { 13070 // Default behavior is to do nothing with this transformation. 13071 return E; 13072 } 13073 13074 template<typename Derived> 13075 ExprResult 13076 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13077 // Default behavior is to do nothing with this transformation. 13078 return E; 13079 } 13080 13081 template<typename Derived> 13082 ExprResult 13083 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13084 MaterializeTemporaryExpr *E) { 13085 return getDerived().TransformExpr(E->getSubExpr()); 13086 } 13087 13088 template<typename Derived> 13089 ExprResult 13090 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13091 Expr *Pattern = E->getPattern(); 13092 13093 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13094 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13095 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13096 13097 // Determine whether the set of unexpanded parameter packs can and should 13098 // be expanded. 13099 bool Expand = true; 13100 bool RetainExpansion = false; 13101 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13102 NumExpansions = OrigNumExpansions; 13103 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13104 Pattern->getSourceRange(), 13105 Unexpanded, 13106 Expand, RetainExpansion, 13107 NumExpansions)) 13108 return true; 13109 13110 if (!Expand) { 13111 // Do not expand any packs here, just transform and rebuild a fold 13112 // expression. 13113 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13114 13115 ExprResult LHS = 13116 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13117 if (LHS.isInvalid()) 13118 return true; 13119 13120 ExprResult RHS = 13121 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13122 if (RHS.isInvalid()) 13123 return true; 13124 13125 if (!getDerived().AlwaysRebuild() && 13126 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13127 return E; 13128 13129 return getDerived().RebuildCXXFoldExpr( 13130 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 13131 RHS.get(), E->getEndLoc(), NumExpansions); 13132 } 13133 13134 // The transform has determined that we should perform an elementwise 13135 // expansion of the pattern. Do so. 13136 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13137 if (Result.isInvalid()) 13138 return true; 13139 bool LeftFold = E->isLeftFold(); 13140 13141 // If we're retaining an expansion for a right fold, it is the innermost 13142 // component and takes the init (if any). 13143 if (!LeftFold && RetainExpansion) { 13144 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13145 13146 ExprResult Out = getDerived().TransformExpr(Pattern); 13147 if (Out.isInvalid()) 13148 return true; 13149 13150 Result = getDerived().RebuildCXXFoldExpr( 13151 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 13152 Result.get(), E->getEndLoc(), OrigNumExpansions); 13153 if (Result.isInvalid()) 13154 return true; 13155 } 13156 13157 for (unsigned I = 0; I != *NumExpansions; ++I) { 13158 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13159 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13160 ExprResult Out = getDerived().TransformExpr(Pattern); 13161 if (Out.isInvalid()) 13162 return true; 13163 13164 if (Out.get()->containsUnexpandedParameterPack()) { 13165 // We still have a pack; retain a pack expansion for this slice. 13166 Result = getDerived().RebuildCXXFoldExpr( 13167 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13168 E->getOperator(), E->getEllipsisLoc(), 13169 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13170 OrigNumExpansions); 13171 } else if (Result.isUsable()) { 13172 // We've got down to a single element; build a binary operator. 13173 Result = getDerived().RebuildBinaryOperator( 13174 E->getEllipsisLoc(), E->getOperator(), 13175 LeftFold ? Result.get() : Out.get(), 13176 LeftFold ? Out.get() : Result.get()); 13177 } else 13178 Result = Out; 13179 13180 if (Result.isInvalid()) 13181 return true; 13182 } 13183 13184 // If we're retaining an expansion for a left fold, it is the outermost 13185 // component and takes the complete expansion so far as its init (if any). 13186 if (LeftFold && RetainExpansion) { 13187 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13188 13189 ExprResult Out = getDerived().TransformExpr(Pattern); 13190 if (Out.isInvalid()) 13191 return true; 13192 13193 Result = getDerived().RebuildCXXFoldExpr( 13194 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 13195 Out.get(), E->getEndLoc(), OrigNumExpansions); 13196 if (Result.isInvalid()) 13197 return true; 13198 } 13199 13200 // If we had no init and an empty pack, and we're not retaining an expansion, 13201 // then produce a fallback value or error. 13202 if (Result.isUnset()) 13203 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13204 E->getOperator()); 13205 13206 return Result; 13207 } 13208 13209 template<typename Derived> 13210 ExprResult 13211 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13212 CXXStdInitializerListExpr *E) { 13213 return getDerived().TransformExpr(E->getSubExpr()); 13214 } 13215 13216 template<typename Derived> 13217 ExprResult 13218 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13219 return SemaRef.MaybeBindToTemporary(E); 13220 } 13221 13222 template<typename Derived> 13223 ExprResult 13224 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13225 return E; 13226 } 13227 13228 template<typename Derived> 13229 ExprResult 13230 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13231 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13232 if (SubExpr.isInvalid()) 13233 return ExprError(); 13234 13235 if (!getDerived().AlwaysRebuild() && 13236 SubExpr.get() == E->getSubExpr()) 13237 return E; 13238 13239 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13240 } 13241 13242 template<typename Derived> 13243 ExprResult 13244 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13245 // Transform each of the elements. 13246 SmallVector<Expr *, 8> Elements; 13247 bool ArgChanged = false; 13248 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13249 /*IsCall=*/false, Elements, &ArgChanged)) 13250 return ExprError(); 13251 13252 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13253 return SemaRef.MaybeBindToTemporary(E); 13254 13255 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13256 Elements.data(), 13257 Elements.size()); 13258 } 13259 13260 template<typename Derived> 13261 ExprResult 13262 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13263 ObjCDictionaryLiteral *E) { 13264 // Transform each of the elements. 13265 SmallVector<ObjCDictionaryElement, 8> Elements; 13266 bool ArgChanged = false; 13267 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13268 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13269 13270 if (OrigElement.isPackExpansion()) { 13271 // This key/value element is a pack expansion. 13272 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13273 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13274 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13275 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13276 13277 // Determine whether the set of unexpanded parameter packs can 13278 // and should be expanded. 13279 bool Expand = true; 13280 bool RetainExpansion = false; 13281 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13282 Optional<unsigned> NumExpansions = OrigNumExpansions; 13283 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13284 OrigElement.Value->getEndLoc()); 13285 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13286 PatternRange, Unexpanded, Expand, 13287 RetainExpansion, NumExpansions)) 13288 return ExprError(); 13289 13290 if (!Expand) { 13291 // The transform has determined that we should perform a simple 13292 // transformation on the pack expansion, producing another pack 13293 // expansion. 13294 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13295 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13296 if (Key.isInvalid()) 13297 return ExprError(); 13298 13299 if (Key.get() != OrigElement.Key) 13300 ArgChanged = true; 13301 13302 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13303 if (Value.isInvalid()) 13304 return ExprError(); 13305 13306 if (Value.get() != OrigElement.Value) 13307 ArgChanged = true; 13308 13309 ObjCDictionaryElement Expansion = { 13310 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13311 }; 13312 Elements.push_back(Expansion); 13313 continue; 13314 } 13315 13316 // Record right away that the argument was changed. This needs 13317 // to happen even if the array expands to nothing. 13318 ArgChanged = true; 13319 13320 // The transform has determined that we should perform an elementwise 13321 // expansion of the pattern. Do so. 13322 for (unsigned I = 0; I != *NumExpansions; ++I) { 13323 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13324 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13325 if (Key.isInvalid()) 13326 return ExprError(); 13327 13328 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13329 if (Value.isInvalid()) 13330 return ExprError(); 13331 13332 ObjCDictionaryElement Element = { 13333 Key.get(), Value.get(), SourceLocation(), NumExpansions 13334 }; 13335 13336 // If any unexpanded parameter packs remain, we still have a 13337 // pack expansion. 13338 // FIXME: Can this really happen? 13339 if (Key.get()->containsUnexpandedParameterPack() || 13340 Value.get()->containsUnexpandedParameterPack()) 13341 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13342 13343 Elements.push_back(Element); 13344 } 13345 13346 // FIXME: Retain a pack expansion if RetainExpansion is true. 13347 13348 // We've finished with this pack expansion. 13349 continue; 13350 } 13351 13352 // Transform and check key. 13353 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13354 if (Key.isInvalid()) 13355 return ExprError(); 13356 13357 if (Key.get() != OrigElement.Key) 13358 ArgChanged = true; 13359 13360 // Transform and check value. 13361 ExprResult Value 13362 = getDerived().TransformExpr(OrigElement.Value); 13363 if (Value.isInvalid()) 13364 return ExprError(); 13365 13366 if (Value.get() != OrigElement.Value) 13367 ArgChanged = true; 13368 13369 ObjCDictionaryElement Element = { 13370 Key.get(), Value.get(), SourceLocation(), None 13371 }; 13372 Elements.push_back(Element); 13373 } 13374 13375 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13376 return SemaRef.MaybeBindToTemporary(E); 13377 13378 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13379 Elements); 13380 } 13381 13382 template<typename Derived> 13383 ExprResult 13384 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13385 TypeSourceInfo *EncodedTypeInfo 13386 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13387 if (!EncodedTypeInfo) 13388 return ExprError(); 13389 13390 if (!getDerived().AlwaysRebuild() && 13391 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13392 return E; 13393 13394 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13395 EncodedTypeInfo, 13396 E->getRParenLoc()); 13397 } 13398 13399 template<typename Derived> 13400 ExprResult TreeTransform<Derived>:: 13401 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13402 // This is a kind of implicit conversion, and it needs to get dropped 13403 // and recomputed for the same general reasons that ImplicitCastExprs 13404 // do, as well a more specific one: this expression is only valid when 13405 // it appears *immediately* as an argument expression. 13406 return getDerived().TransformExpr(E->getSubExpr()); 13407 } 13408 13409 template<typename Derived> 13410 ExprResult TreeTransform<Derived>:: 13411 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13412 TypeSourceInfo *TSInfo 13413 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13414 if (!TSInfo) 13415 return ExprError(); 13416 13417 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13418 if (Result.isInvalid()) 13419 return ExprError(); 13420 13421 if (!getDerived().AlwaysRebuild() && 13422 TSInfo == E->getTypeInfoAsWritten() && 13423 Result.get() == E->getSubExpr()) 13424 return E; 13425 13426 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13427 E->getBridgeKeywordLoc(), TSInfo, 13428 Result.get()); 13429 } 13430 13431 template <typename Derived> 13432 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13433 ObjCAvailabilityCheckExpr *E) { 13434 return E; 13435 } 13436 13437 template<typename Derived> 13438 ExprResult 13439 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13440 // Transform arguments. 13441 bool ArgChanged = false; 13442 SmallVector<Expr*, 8> Args; 13443 Args.reserve(E->getNumArgs()); 13444 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13445 &ArgChanged)) 13446 return ExprError(); 13447 13448 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13449 // Class message: transform the receiver type. 13450 TypeSourceInfo *ReceiverTypeInfo 13451 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13452 if (!ReceiverTypeInfo) 13453 return ExprError(); 13454 13455 // If nothing changed, just retain the existing message send. 13456 if (!getDerived().AlwaysRebuild() && 13457 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13458 return SemaRef.MaybeBindToTemporary(E); 13459 13460 // Build a new class message send. 13461 SmallVector<SourceLocation, 16> SelLocs; 13462 E->getSelectorLocs(SelLocs); 13463 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13464 E->getSelector(), 13465 SelLocs, 13466 E->getMethodDecl(), 13467 E->getLeftLoc(), 13468 Args, 13469 E->getRightLoc()); 13470 } 13471 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13472 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13473 if (!E->getMethodDecl()) 13474 return ExprError(); 13475 13476 // Build a new class message send to 'super'. 13477 SmallVector<SourceLocation, 16> SelLocs; 13478 E->getSelectorLocs(SelLocs); 13479 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13480 E->getSelector(), 13481 SelLocs, 13482 E->getReceiverType(), 13483 E->getMethodDecl(), 13484 E->getLeftLoc(), 13485 Args, 13486 E->getRightLoc()); 13487 } 13488 13489 // Instance message: transform the receiver 13490 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13491 "Only class and instance messages may be instantiated"); 13492 ExprResult Receiver 13493 = getDerived().TransformExpr(E->getInstanceReceiver()); 13494 if (Receiver.isInvalid()) 13495 return ExprError(); 13496 13497 // If nothing changed, just retain the existing message send. 13498 if (!getDerived().AlwaysRebuild() && 13499 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13500 return SemaRef.MaybeBindToTemporary(E); 13501 13502 // Build a new instance message send. 13503 SmallVector<SourceLocation, 16> SelLocs; 13504 E->getSelectorLocs(SelLocs); 13505 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13506 E->getSelector(), 13507 SelLocs, 13508 E->getMethodDecl(), 13509 E->getLeftLoc(), 13510 Args, 13511 E->getRightLoc()); 13512 } 13513 13514 template<typename Derived> 13515 ExprResult 13516 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13517 return E; 13518 } 13519 13520 template<typename Derived> 13521 ExprResult 13522 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13523 return E; 13524 } 13525 13526 template<typename Derived> 13527 ExprResult 13528 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13529 // Transform the base expression. 13530 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13531 if (Base.isInvalid()) 13532 return ExprError(); 13533 13534 // We don't need to transform the ivar; it will never change. 13535 13536 // If nothing changed, just retain the existing expression. 13537 if (!getDerived().AlwaysRebuild() && 13538 Base.get() == E->getBase()) 13539 return E; 13540 13541 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13542 E->getLocation(), 13543 E->isArrow(), E->isFreeIvar()); 13544 } 13545 13546 template<typename Derived> 13547 ExprResult 13548 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13549 // 'super' and types never change. Property never changes. Just 13550 // retain the existing expression. 13551 if (!E->isObjectReceiver()) 13552 return E; 13553 13554 // Transform the base expression. 13555 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13556 if (Base.isInvalid()) 13557 return ExprError(); 13558 13559 // We don't need to transform the property; it will never change. 13560 13561 // If nothing changed, just retain the existing expression. 13562 if (!getDerived().AlwaysRebuild() && 13563 Base.get() == E->getBase()) 13564 return E; 13565 13566 if (E->isExplicitProperty()) 13567 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13568 E->getExplicitProperty(), 13569 E->getLocation()); 13570 13571 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13572 SemaRef.Context.PseudoObjectTy, 13573 E->getImplicitPropertyGetter(), 13574 E->getImplicitPropertySetter(), 13575 E->getLocation()); 13576 } 13577 13578 template<typename Derived> 13579 ExprResult 13580 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13581 // Transform the base expression. 13582 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13583 if (Base.isInvalid()) 13584 return ExprError(); 13585 13586 // Transform the key expression. 13587 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13588 if (Key.isInvalid()) 13589 return ExprError(); 13590 13591 // If nothing changed, just retain the existing expression. 13592 if (!getDerived().AlwaysRebuild() && 13593 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13594 return E; 13595 13596 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13597 Base.get(), Key.get(), 13598 E->getAtIndexMethodDecl(), 13599 E->setAtIndexMethodDecl()); 13600 } 13601 13602 template<typename Derived> 13603 ExprResult 13604 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13605 // Transform the base expression. 13606 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13607 if (Base.isInvalid()) 13608 return ExprError(); 13609 13610 // If nothing changed, just retain the existing expression. 13611 if (!getDerived().AlwaysRebuild() && 13612 Base.get() == E->getBase()) 13613 return E; 13614 13615 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13616 E->getOpLoc(), 13617 E->isArrow()); 13618 } 13619 13620 template<typename Derived> 13621 ExprResult 13622 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13623 bool ArgumentChanged = false; 13624 SmallVector<Expr*, 8> SubExprs; 13625 SubExprs.reserve(E->getNumSubExprs()); 13626 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13627 SubExprs, &ArgumentChanged)) 13628 return ExprError(); 13629 13630 if (!getDerived().AlwaysRebuild() && 13631 !ArgumentChanged) 13632 return E; 13633 13634 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13635 SubExprs, 13636 E->getRParenLoc()); 13637 } 13638 13639 template<typename Derived> 13640 ExprResult 13641 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13642 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13643 if (SrcExpr.isInvalid()) 13644 return ExprError(); 13645 13646 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13647 if (!Type) 13648 return ExprError(); 13649 13650 if (!getDerived().AlwaysRebuild() && 13651 Type == E->getTypeSourceInfo() && 13652 SrcExpr.get() == E->getSrcExpr()) 13653 return E; 13654 13655 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13656 SrcExpr.get(), Type, 13657 E->getRParenLoc()); 13658 } 13659 13660 template<typename Derived> 13661 ExprResult 13662 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13663 BlockDecl *oldBlock = E->getBlockDecl(); 13664 13665 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13666 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13667 13668 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13669 blockScope->TheDecl->setBlockMissingReturnType( 13670 oldBlock->blockMissingReturnType()); 13671 13672 SmallVector<ParmVarDecl*, 4> params; 13673 SmallVector<QualType, 4> paramTypes; 13674 13675 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13676 13677 // Parameter substitution. 13678 Sema::ExtParameterInfoBuilder extParamInfos; 13679 if (getDerived().TransformFunctionTypeParams( 13680 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13681 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13682 extParamInfos)) { 13683 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13684 return ExprError(); 13685 } 13686 13687 QualType exprResultType = 13688 getDerived().TransformType(exprFunctionType->getReturnType()); 13689 13690 auto epi = exprFunctionType->getExtProtoInfo(); 13691 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13692 13693 QualType functionType = 13694 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13695 blockScope->FunctionType = functionType; 13696 13697 // Set the parameters on the block decl. 13698 if (!params.empty()) 13699 blockScope->TheDecl->setParams(params); 13700 13701 if (!oldBlock->blockMissingReturnType()) { 13702 blockScope->HasImplicitReturnType = false; 13703 blockScope->ReturnType = exprResultType; 13704 } 13705 13706 // Transform the body 13707 StmtResult body = getDerived().TransformStmt(E->getBody()); 13708 if (body.isInvalid()) { 13709 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13710 return ExprError(); 13711 } 13712 13713 #ifndef NDEBUG 13714 // In builds with assertions, make sure that we captured everything we 13715 // captured before. 13716 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13717 for (const auto &I : oldBlock->captures()) { 13718 VarDecl *oldCapture = I.getVariable(); 13719 13720 // Ignore parameter packs. 13721 if (oldCapture->isParameterPack()) 13722 continue; 13723 13724 VarDecl *newCapture = 13725 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13726 oldCapture)); 13727 assert(blockScope->CaptureMap.count(newCapture)); 13728 } 13729 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13730 } 13731 #endif 13732 13733 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13734 /*Scope=*/nullptr); 13735 } 13736 13737 template<typename Derived> 13738 ExprResult 13739 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13740 llvm_unreachable("Cannot transform asType expressions yet"); 13741 } 13742 13743 template<typename Derived> 13744 ExprResult 13745 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13746 bool ArgumentChanged = false; 13747 SmallVector<Expr*, 8> SubExprs; 13748 SubExprs.reserve(E->getNumSubExprs()); 13749 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13750 SubExprs, &ArgumentChanged)) 13751 return ExprError(); 13752 13753 if (!getDerived().AlwaysRebuild() && 13754 !ArgumentChanged) 13755 return E; 13756 13757 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13758 E->getOp(), E->getRParenLoc()); 13759 } 13760 13761 //===----------------------------------------------------------------------===// 13762 // Type reconstruction 13763 //===----------------------------------------------------------------------===// 13764 13765 template<typename Derived> 13766 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13767 SourceLocation Star) { 13768 return SemaRef.BuildPointerType(PointeeType, Star, 13769 getDerived().getBaseEntity()); 13770 } 13771 13772 template<typename Derived> 13773 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13774 SourceLocation Star) { 13775 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13776 getDerived().getBaseEntity()); 13777 } 13778 13779 template<typename Derived> 13780 QualType 13781 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13782 bool WrittenAsLValue, 13783 SourceLocation Sigil) { 13784 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13785 Sigil, getDerived().getBaseEntity()); 13786 } 13787 13788 template<typename Derived> 13789 QualType 13790 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13791 QualType ClassType, 13792 SourceLocation Sigil) { 13793 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13794 getDerived().getBaseEntity()); 13795 } 13796 13797 template<typename Derived> 13798 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13799 const ObjCTypeParamDecl *Decl, 13800 SourceLocation ProtocolLAngleLoc, 13801 ArrayRef<ObjCProtocolDecl *> Protocols, 13802 ArrayRef<SourceLocation> ProtocolLocs, 13803 SourceLocation ProtocolRAngleLoc) { 13804 return SemaRef.BuildObjCTypeParamType(Decl, 13805 ProtocolLAngleLoc, Protocols, 13806 ProtocolLocs, ProtocolRAngleLoc, 13807 /*FailOnError=*/true); 13808 } 13809 13810 template<typename Derived> 13811 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13812 QualType BaseType, 13813 SourceLocation Loc, 13814 SourceLocation TypeArgsLAngleLoc, 13815 ArrayRef<TypeSourceInfo *> TypeArgs, 13816 SourceLocation TypeArgsRAngleLoc, 13817 SourceLocation ProtocolLAngleLoc, 13818 ArrayRef<ObjCProtocolDecl *> Protocols, 13819 ArrayRef<SourceLocation> ProtocolLocs, 13820 SourceLocation ProtocolRAngleLoc) { 13821 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13822 TypeArgs, TypeArgsRAngleLoc, 13823 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13824 ProtocolRAngleLoc, 13825 /*FailOnError=*/true); 13826 } 13827 13828 template<typename Derived> 13829 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13830 QualType PointeeType, 13831 SourceLocation Star) { 13832 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13833 } 13834 13835 template<typename Derived> 13836 QualType 13837 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13838 ArrayType::ArraySizeModifier SizeMod, 13839 const llvm::APInt *Size, 13840 Expr *SizeExpr, 13841 unsigned IndexTypeQuals, 13842 SourceRange BracketsRange) { 13843 if (SizeExpr || !Size) 13844 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13845 IndexTypeQuals, BracketsRange, 13846 getDerived().getBaseEntity()); 13847 13848 QualType Types[] = { 13849 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13850 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13851 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13852 }; 13853 const unsigned NumTypes = llvm::array_lengthof(Types); 13854 QualType SizeType; 13855 for (unsigned I = 0; I != NumTypes; ++I) 13856 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13857 SizeType = Types[I]; 13858 break; 13859 } 13860 13861 // Note that we can return a VariableArrayType here in the case where 13862 // the element type was a dependent VariableArrayType. 13863 IntegerLiteral *ArraySize 13864 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13865 /*FIXME*/BracketsRange.getBegin()); 13866 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13867 IndexTypeQuals, BracketsRange, 13868 getDerived().getBaseEntity()); 13869 } 13870 13871 template<typename Derived> 13872 QualType 13873 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13874 ArrayType::ArraySizeModifier SizeMod, 13875 const llvm::APInt &Size, 13876 Expr *SizeExpr, 13877 unsigned IndexTypeQuals, 13878 SourceRange BracketsRange) { 13879 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13880 IndexTypeQuals, BracketsRange); 13881 } 13882 13883 template<typename Derived> 13884 QualType 13885 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13886 ArrayType::ArraySizeModifier SizeMod, 13887 unsigned IndexTypeQuals, 13888 SourceRange BracketsRange) { 13889 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13890 IndexTypeQuals, BracketsRange); 13891 } 13892 13893 template<typename Derived> 13894 QualType 13895 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13896 ArrayType::ArraySizeModifier SizeMod, 13897 Expr *SizeExpr, 13898 unsigned IndexTypeQuals, 13899 SourceRange BracketsRange) { 13900 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13901 SizeExpr, 13902 IndexTypeQuals, BracketsRange); 13903 } 13904 13905 template<typename Derived> 13906 QualType 13907 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13908 ArrayType::ArraySizeModifier SizeMod, 13909 Expr *SizeExpr, 13910 unsigned IndexTypeQuals, 13911 SourceRange BracketsRange) { 13912 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13913 SizeExpr, 13914 IndexTypeQuals, BracketsRange); 13915 } 13916 13917 template <typename Derived> 13918 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13919 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13920 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13921 AttributeLoc); 13922 } 13923 13924 template <typename Derived> 13925 QualType 13926 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13927 unsigned NumElements, 13928 VectorType::VectorKind VecKind) { 13929 // FIXME: semantic checking! 13930 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13931 } 13932 13933 template <typename Derived> 13934 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13935 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13936 VectorType::VectorKind VecKind) { 13937 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13938 } 13939 13940 template<typename Derived> 13941 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13942 unsigned NumElements, 13943 SourceLocation AttributeLoc) { 13944 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13945 NumElements, true); 13946 IntegerLiteral *VectorSize 13947 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13948 AttributeLoc); 13949 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13950 } 13951 13952 template<typename Derived> 13953 QualType 13954 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13955 Expr *SizeExpr, 13956 SourceLocation AttributeLoc) { 13957 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13958 } 13959 13960 template <typename Derived> 13961 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 13962 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 13963 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 13964 NumColumns); 13965 } 13966 13967 template <typename Derived> 13968 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 13969 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 13970 SourceLocation AttributeLoc) { 13971 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 13972 AttributeLoc); 13973 } 13974 13975 template<typename Derived> 13976 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13977 QualType T, 13978 MutableArrayRef<QualType> ParamTypes, 13979 const FunctionProtoType::ExtProtoInfo &EPI) { 13980 return SemaRef.BuildFunctionType(T, ParamTypes, 13981 getDerived().getBaseLocation(), 13982 getDerived().getBaseEntity(), 13983 EPI); 13984 } 13985 13986 template<typename Derived> 13987 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13988 return SemaRef.Context.getFunctionNoProtoType(T); 13989 } 13990 13991 template<typename Derived> 13992 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13993 Decl *D) { 13994 assert(D && "no decl found"); 13995 if (D->isInvalidDecl()) return QualType(); 13996 13997 // FIXME: Doesn't account for ObjCInterfaceDecl! 13998 TypeDecl *Ty; 13999 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14000 // A valid resolved using typename pack expansion decl can have multiple 14001 // UsingDecls, but they must each have exactly one type, and it must be 14002 // the same type in every case. But we must have at least one expansion! 14003 if (UPD->expansions().empty()) { 14004 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14005 << UPD->isCXXClassMember() << UPD; 14006 return QualType(); 14007 } 14008 14009 // We might still have some unresolved types. Try to pick a resolved type 14010 // if we can. The final instantiation will check that the remaining 14011 // unresolved types instantiate to the type we pick. 14012 QualType FallbackT; 14013 QualType T; 14014 for (auto *E : UPD->expansions()) { 14015 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14016 if (ThisT.isNull()) 14017 continue; 14018 else if (ThisT->getAs<UnresolvedUsingType>()) 14019 FallbackT = ThisT; 14020 else if (T.isNull()) 14021 T = ThisT; 14022 else 14023 assert(getSema().Context.hasSameType(ThisT, T) && 14024 "mismatched resolved types in using pack expansion"); 14025 } 14026 return T.isNull() ? FallbackT : T; 14027 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14028 assert(Using->hasTypename() && 14029 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14030 14031 // A valid resolved using typename decl points to exactly one type decl. 14032 assert(++Using->shadow_begin() == Using->shadow_end()); 14033 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14034 } else { 14035 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14036 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14037 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14038 } 14039 14040 return SemaRef.Context.getTypeDeclType(Ty); 14041 } 14042 14043 template<typename Derived> 14044 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14045 SourceLocation Loc) { 14046 return SemaRef.BuildTypeofExprType(E, Loc); 14047 } 14048 14049 template<typename Derived> 14050 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14051 return SemaRef.Context.getTypeOfType(Underlying); 14052 } 14053 14054 template<typename Derived> 14055 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14056 SourceLocation Loc) { 14057 return SemaRef.BuildDecltypeType(E, Loc); 14058 } 14059 14060 template<typename Derived> 14061 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14062 UnaryTransformType::UTTKind UKind, 14063 SourceLocation Loc) { 14064 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14065 } 14066 14067 template<typename Derived> 14068 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14069 TemplateName Template, 14070 SourceLocation TemplateNameLoc, 14071 TemplateArgumentListInfo &TemplateArgs) { 14072 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14073 } 14074 14075 template<typename Derived> 14076 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14077 SourceLocation KWLoc) { 14078 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14079 } 14080 14081 template<typename Derived> 14082 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14083 SourceLocation KWLoc, 14084 bool isReadPipe) { 14085 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14086 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14087 } 14088 14089 template <typename Derived> 14090 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14091 unsigned NumBits, 14092 SourceLocation Loc) { 14093 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14094 NumBits, true); 14095 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14096 SemaRef.Context.IntTy, Loc); 14097 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14098 } 14099 14100 template <typename Derived> 14101 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14102 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14103 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14104 } 14105 14106 template<typename Derived> 14107 TemplateName 14108 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14109 bool TemplateKW, 14110 TemplateDecl *Template) { 14111 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14112 Template); 14113 } 14114 14115 template<typename Derived> 14116 TemplateName 14117 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14118 SourceLocation TemplateKWLoc, 14119 const IdentifierInfo &Name, 14120 SourceLocation NameLoc, 14121 QualType ObjectType, 14122 NamedDecl *FirstQualifierInScope, 14123 bool AllowInjectedClassName) { 14124 UnqualifiedId TemplateName; 14125 TemplateName.setIdentifier(&Name, NameLoc); 14126 Sema::TemplateTy Template; 14127 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14128 TemplateName, ParsedType::make(ObjectType), 14129 /*EnteringContext=*/false, Template, 14130 AllowInjectedClassName); 14131 return Template.get(); 14132 } 14133 14134 template<typename Derived> 14135 TemplateName 14136 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14137 SourceLocation TemplateKWLoc, 14138 OverloadedOperatorKind Operator, 14139 SourceLocation NameLoc, 14140 QualType ObjectType, 14141 bool AllowInjectedClassName) { 14142 UnqualifiedId Name; 14143 // FIXME: Bogus location information. 14144 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14145 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14146 Sema::TemplateTy Template; 14147 getSema().ActOnTemplateName( 14148 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14149 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14150 return Template.get(); 14151 } 14152 14153 template<typename Derived> 14154 ExprResult 14155 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14156 SourceLocation OpLoc, 14157 Expr *OrigCallee, 14158 Expr *First, 14159 Expr *Second) { 14160 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14161 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14162 14163 if (First->getObjectKind() == OK_ObjCProperty) { 14164 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14165 if (BinaryOperator::isAssignmentOp(Opc)) 14166 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14167 First, Second); 14168 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14169 if (Result.isInvalid()) 14170 return ExprError(); 14171 First = Result.get(); 14172 } 14173 14174 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14175 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14176 if (Result.isInvalid()) 14177 return ExprError(); 14178 Second = Result.get(); 14179 } 14180 14181 // Determine whether this should be a builtin operation. 14182 if (Op == OO_Subscript) { 14183 if (!First->getType()->isOverloadableType() && 14184 !Second->getType()->isOverloadableType()) 14185 return getSema().CreateBuiltinArraySubscriptExpr( 14186 First, Callee->getBeginLoc(), Second, OpLoc); 14187 } else if (Op == OO_Arrow) { 14188 // -> is never a builtin operation. 14189 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14190 } else if (Second == nullptr || isPostIncDec) { 14191 if (!First->getType()->isOverloadableType() || 14192 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14193 // The argument is not of overloadable type, or this is an expression 14194 // of the form &Class::member, so try to create a built-in unary 14195 // operation. 14196 UnaryOperatorKind Opc 14197 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14198 14199 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14200 } 14201 } else { 14202 if (!First->getType()->isOverloadableType() && 14203 !Second->getType()->isOverloadableType()) { 14204 // Neither of the arguments is an overloadable type, so try to 14205 // create a built-in binary operation. 14206 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14207 ExprResult Result 14208 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14209 if (Result.isInvalid()) 14210 return ExprError(); 14211 14212 return Result; 14213 } 14214 } 14215 14216 // Compute the transformed set of functions (and function templates) to be 14217 // used during overload resolution. 14218 UnresolvedSet<16> Functions; 14219 bool RequiresADL; 14220 14221 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14222 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14223 // If the overload could not be resolved in the template definition 14224 // (because we had a dependent argument), ADL is performed as part of 14225 // template instantiation. 14226 RequiresADL = ULE->requiresADL(); 14227 } else { 14228 // If we've resolved this to a particular non-member function, just call 14229 // that function. If we resolved it to a member function, 14230 // CreateOverloaded* will find that function for us. 14231 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14232 if (!isa<CXXMethodDecl>(ND)) 14233 Functions.addDecl(ND); 14234 RequiresADL = false; 14235 } 14236 14237 // Add any functions found via argument-dependent lookup. 14238 Expr *Args[2] = { First, Second }; 14239 unsigned NumArgs = 1 + (Second != nullptr); 14240 14241 // Create the overloaded operator invocation for unary operators. 14242 if (NumArgs == 1 || isPostIncDec) { 14243 UnaryOperatorKind Opc 14244 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14245 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14246 RequiresADL); 14247 } 14248 14249 if (Op == OO_Subscript) { 14250 SourceLocation LBrace; 14251 SourceLocation RBrace; 14252 14253 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14254 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14255 LBrace = SourceLocation::getFromRawEncoding( 14256 NameLoc.CXXOperatorName.BeginOpNameLoc); 14257 RBrace = SourceLocation::getFromRawEncoding( 14258 NameLoc.CXXOperatorName.EndOpNameLoc); 14259 } else { 14260 LBrace = Callee->getBeginLoc(); 14261 RBrace = OpLoc; 14262 } 14263 14264 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14265 First, Second); 14266 } 14267 14268 // Create the overloaded operator invocation for binary operators. 14269 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14270 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14271 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14272 if (Result.isInvalid()) 14273 return ExprError(); 14274 14275 return Result; 14276 } 14277 14278 template<typename Derived> 14279 ExprResult 14280 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14281 SourceLocation OperatorLoc, 14282 bool isArrow, 14283 CXXScopeSpec &SS, 14284 TypeSourceInfo *ScopeType, 14285 SourceLocation CCLoc, 14286 SourceLocation TildeLoc, 14287 PseudoDestructorTypeStorage Destroyed) { 14288 QualType BaseType = Base->getType(); 14289 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14290 (!isArrow && !BaseType->getAs<RecordType>()) || 14291 (isArrow && BaseType->getAs<PointerType>() && 14292 !BaseType->castAs<PointerType>()->getPointeeType() 14293 ->template getAs<RecordType>())){ 14294 // This pseudo-destructor expression is still a pseudo-destructor. 14295 return SemaRef.BuildPseudoDestructorExpr( 14296 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14297 CCLoc, TildeLoc, Destroyed); 14298 } 14299 14300 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14301 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14302 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14303 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14304 NameInfo.setNamedTypeInfo(DestroyedType); 14305 14306 // The scope type is now known to be a valid nested name specifier 14307 // component. Tack it on to the end of the nested name specifier. 14308 if (ScopeType) { 14309 if (!ScopeType->getType()->getAs<TagType>()) { 14310 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14311 diag::err_expected_class_or_namespace) 14312 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14313 return ExprError(); 14314 } 14315 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14316 CCLoc); 14317 } 14318 14319 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14320 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14321 OperatorLoc, isArrow, 14322 SS, TemplateKWLoc, 14323 /*FIXME: FirstQualifier*/ nullptr, 14324 NameInfo, 14325 /*TemplateArgs*/ nullptr, 14326 /*S*/nullptr); 14327 } 14328 14329 template<typename Derived> 14330 StmtResult 14331 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14332 SourceLocation Loc = S->getBeginLoc(); 14333 CapturedDecl *CD = S->getCapturedDecl(); 14334 unsigned NumParams = CD->getNumParams(); 14335 unsigned ContextParamPos = CD->getContextParamPosition(); 14336 SmallVector<Sema::CapturedParamNameType, 4> Params; 14337 for (unsigned I = 0; I < NumParams; ++I) { 14338 if (I != ContextParamPos) { 14339 Params.push_back( 14340 std::make_pair( 14341 CD->getParam(I)->getName(), 14342 getDerived().TransformType(CD->getParam(I)->getType()))); 14343 } else { 14344 Params.push_back(std::make_pair(StringRef(), QualType())); 14345 } 14346 } 14347 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14348 S->getCapturedRegionKind(), Params); 14349 StmtResult Body; 14350 { 14351 Sema::CompoundScopeRAII CompoundScope(getSema()); 14352 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14353 } 14354 14355 if (Body.isInvalid()) { 14356 getSema().ActOnCapturedRegionError(); 14357 return StmtError(); 14358 } 14359 14360 return getSema().ActOnCapturedRegionEnd(Body.get()); 14361 } 14362 14363 } // end namespace clang 14364 14365 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14366