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 'is_device_ptr' 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 *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2044 const OMPVarListLocTy &Locs) { 2045 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2046 } 2047 2048 /// Build a new OpenMP 'defaultmap' 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 *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2053 OpenMPDefaultmapClauseKind Kind, 2054 SourceLocation StartLoc, 2055 SourceLocation LParenLoc, 2056 SourceLocation MLoc, 2057 SourceLocation KindLoc, 2058 SourceLocation EndLoc) { 2059 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2060 MLoc, KindLoc, EndLoc); 2061 } 2062 2063 /// Build a new OpenMP 'nontemporal' clause. 2064 /// 2065 /// By default, performs semantic analysis to build the new OpenMP clause. 2066 /// Subclasses may override this routine to provide different behavior. 2067 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2068 SourceLocation StartLoc, 2069 SourceLocation LParenLoc, 2070 SourceLocation EndLoc) { 2071 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2072 EndLoc); 2073 } 2074 2075 /// Build a new OpenMP 'inclusive' clause. 2076 /// 2077 /// By default, performs semantic analysis to build the new OpenMP clause. 2078 /// Subclasses may override this routine to provide different behavior. 2079 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2080 SourceLocation StartLoc, 2081 SourceLocation LParenLoc, 2082 SourceLocation EndLoc) { 2083 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2084 EndLoc); 2085 } 2086 2087 /// Build a new OpenMP 'exclusive' clause. 2088 /// 2089 /// By default, performs semantic analysis to build the new OpenMP clause. 2090 /// Subclasses may override this routine to provide different behavior. 2091 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2092 SourceLocation StartLoc, 2093 SourceLocation LParenLoc, 2094 SourceLocation EndLoc) { 2095 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2096 EndLoc); 2097 } 2098 2099 /// Build a new OpenMP 'uses_allocators' clause. 2100 /// 2101 /// By default, performs semantic analysis to build the new OpenMP clause. 2102 /// Subclasses may override this routine to provide different behavior. 2103 OMPClause *RebuildOMPUsesAllocatorsClause( 2104 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2105 SourceLocation LParenLoc, SourceLocation EndLoc) { 2106 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2107 Data); 2108 } 2109 2110 /// Build a new OpenMP 'affinity' clause. 2111 /// 2112 /// By default, performs semantic analysis to build the new OpenMP clause. 2113 /// Subclasses may override this routine to provide different behavior. 2114 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2115 SourceLocation LParenLoc, 2116 SourceLocation ColonLoc, 2117 SourceLocation EndLoc, Expr *Modifier, 2118 ArrayRef<Expr *> Locators) { 2119 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2120 EndLoc, Modifier, Locators); 2121 } 2122 2123 /// Build a new OpenMP 'order' clause. 2124 /// 2125 /// By default, performs semantic analysis to build the new OpenMP clause. 2126 /// Subclasses may override this routine to provide different behavior. 2127 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2128 SourceLocation KindKwLoc, 2129 SourceLocation StartLoc, 2130 SourceLocation LParenLoc, 2131 SourceLocation EndLoc) { 2132 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2133 LParenLoc, EndLoc); 2134 } 2135 2136 /// Rebuild the operand to an Objective-C \@synchronized statement. 2137 /// 2138 /// By default, performs semantic analysis to build the new statement. 2139 /// Subclasses may override this routine to provide different behavior. 2140 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2141 Expr *object) { 2142 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2143 } 2144 2145 /// Build a new 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 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2150 Expr *Object, Stmt *Body) { 2151 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2152 } 2153 2154 /// Build a new Objective-C \@autoreleasepool 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 RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2159 Stmt *Body) { 2160 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2161 } 2162 2163 /// Build a new Objective-C fast enumeration 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 RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2168 Stmt *Element, 2169 Expr *Collection, 2170 SourceLocation RParenLoc, 2171 Stmt *Body) { 2172 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2173 Element, 2174 Collection, 2175 RParenLoc); 2176 if (ForEachStmt.isInvalid()) 2177 return StmtError(); 2178 2179 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2180 } 2181 2182 /// Build a new C++ exception declaration. 2183 /// 2184 /// By default, performs semantic analysis to build the new decaration. 2185 /// Subclasses may override this routine to provide different behavior. 2186 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2187 TypeSourceInfo *Declarator, 2188 SourceLocation StartLoc, 2189 SourceLocation IdLoc, 2190 IdentifierInfo *Id) { 2191 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2192 StartLoc, IdLoc, Id); 2193 if (Var) 2194 getSema().CurContext->addDecl(Var); 2195 return Var; 2196 } 2197 2198 /// Build a new C++ catch statement. 2199 /// 2200 /// By default, performs semantic analysis to build the new statement. 2201 /// Subclasses may override this routine to provide different behavior. 2202 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2203 VarDecl *ExceptionDecl, 2204 Stmt *Handler) { 2205 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2206 Handler)); 2207 } 2208 2209 /// Build a new C++ try statement. 2210 /// 2211 /// By default, performs semantic analysis to build the new statement. 2212 /// Subclasses may override this routine to provide different behavior. 2213 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2214 ArrayRef<Stmt *> Handlers) { 2215 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2216 } 2217 2218 /// Build a new C++0x range-based for 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 RebuildCXXForRangeStmt(SourceLocation ForLoc, 2223 SourceLocation CoawaitLoc, Stmt *Init, 2224 SourceLocation ColonLoc, Stmt *Range, 2225 Stmt *Begin, Stmt *End, Expr *Cond, 2226 Expr *Inc, Stmt *LoopVar, 2227 SourceLocation RParenLoc) { 2228 // If we've just learned that the range is actually an Objective-C 2229 // collection, treat this as an Objective-C fast enumeration loop. 2230 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2231 if (RangeStmt->isSingleDecl()) { 2232 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2233 if (RangeVar->isInvalidDecl()) 2234 return StmtError(); 2235 2236 Expr *RangeExpr = RangeVar->getInit(); 2237 if (!RangeExpr->isTypeDependent() && 2238 RangeExpr->getType()->isObjCObjectPointerType()) { 2239 // FIXME: Support init-statements in Objective-C++20 ranged for 2240 // statement. 2241 if (Init) { 2242 return SemaRef.Diag(Init->getBeginLoc(), 2243 diag::err_objc_for_range_init_stmt) 2244 << Init->getSourceRange(); 2245 } 2246 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2247 RangeExpr, RParenLoc); 2248 } 2249 } 2250 } 2251 } 2252 2253 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2254 Range, Begin, End, Cond, Inc, LoopVar, 2255 RParenLoc, Sema::BFRK_Rebuild); 2256 } 2257 2258 /// Build a new C++0x range-based for statement. 2259 /// 2260 /// By default, performs semantic analysis to build the new statement. 2261 /// Subclasses may override this routine to provide different behavior. 2262 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2263 bool IsIfExists, 2264 NestedNameSpecifierLoc QualifierLoc, 2265 DeclarationNameInfo NameInfo, 2266 Stmt *Nested) { 2267 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2268 QualifierLoc, NameInfo, Nested); 2269 } 2270 2271 /// Attach body to a C++0x range-based for statement. 2272 /// 2273 /// By default, performs semantic analysis to finish the new statement. 2274 /// Subclasses may override this routine to provide different behavior. 2275 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2276 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2277 } 2278 2279 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2280 Stmt *TryBlock, Stmt *Handler) { 2281 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2282 } 2283 2284 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2285 Stmt *Block) { 2286 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2287 } 2288 2289 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2290 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2291 } 2292 2293 /// Build a new predefined expression. 2294 /// 2295 /// By default, performs semantic analysis to build the new expression. 2296 /// Subclasses may override this routine to provide different behavior. 2297 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2298 PredefinedExpr::IdentKind IK) { 2299 return getSema().BuildPredefinedExpr(Loc, IK); 2300 } 2301 2302 /// Build a new expression that references a declaration. 2303 /// 2304 /// By default, performs semantic analysis to build the new expression. 2305 /// Subclasses may override this routine to provide different behavior. 2306 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2307 LookupResult &R, 2308 bool RequiresADL) { 2309 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2310 } 2311 2312 2313 /// Build a new expression that references a declaration. 2314 /// 2315 /// By default, performs semantic analysis to build the new expression. 2316 /// Subclasses may override this routine to provide different behavior. 2317 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2318 ValueDecl *VD, 2319 const DeclarationNameInfo &NameInfo, 2320 NamedDecl *Found, 2321 TemplateArgumentListInfo *TemplateArgs) { 2322 CXXScopeSpec SS; 2323 SS.Adopt(QualifierLoc); 2324 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2325 TemplateArgs); 2326 } 2327 2328 /// Build a new expression in parentheses. 2329 /// 2330 /// By default, performs semantic analysis to build the new expression. 2331 /// Subclasses may override this routine to provide different behavior. 2332 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2333 SourceLocation RParen) { 2334 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2335 } 2336 2337 /// Build a new pseudo-destructor expression. 2338 /// 2339 /// By default, performs semantic analysis to build the new expression. 2340 /// Subclasses may override this routine to provide different behavior. 2341 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2342 SourceLocation OperatorLoc, 2343 bool isArrow, 2344 CXXScopeSpec &SS, 2345 TypeSourceInfo *ScopeType, 2346 SourceLocation CCLoc, 2347 SourceLocation TildeLoc, 2348 PseudoDestructorTypeStorage Destroyed); 2349 2350 /// Build a new unary operator expression. 2351 /// 2352 /// By default, performs semantic analysis to build the new expression. 2353 /// Subclasses may override this routine to provide different behavior. 2354 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2355 UnaryOperatorKind Opc, 2356 Expr *SubExpr) { 2357 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2358 } 2359 2360 /// Build a new builtin offsetof expression. 2361 /// 2362 /// By default, performs semantic analysis to build the new expression. 2363 /// Subclasses may override this routine to provide different behavior. 2364 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2365 TypeSourceInfo *Type, 2366 ArrayRef<Sema::OffsetOfComponent> Components, 2367 SourceLocation RParenLoc) { 2368 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2369 RParenLoc); 2370 } 2371 2372 /// Build a new sizeof, alignof or vec_step expression with a 2373 /// type argument. 2374 /// 2375 /// By default, performs semantic analysis to build the new expression. 2376 /// Subclasses may override this routine to provide different behavior. 2377 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2378 SourceLocation OpLoc, 2379 UnaryExprOrTypeTrait ExprKind, 2380 SourceRange R) { 2381 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2382 } 2383 2384 /// Build a new sizeof, alignof or vec step expression with an 2385 /// expression argument. 2386 /// 2387 /// By default, performs semantic analysis to build the new expression. 2388 /// Subclasses may override this routine to provide different behavior. 2389 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2390 UnaryExprOrTypeTrait ExprKind, 2391 SourceRange R) { 2392 ExprResult Result 2393 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2394 if (Result.isInvalid()) 2395 return ExprError(); 2396 2397 return Result; 2398 } 2399 2400 /// Build a new array subscript expression. 2401 /// 2402 /// By default, performs semantic analysis to build the new expression. 2403 /// Subclasses may override this routine to provide different behavior. 2404 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2405 SourceLocation LBracketLoc, 2406 Expr *RHS, 2407 SourceLocation RBracketLoc) { 2408 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2409 LBracketLoc, RHS, 2410 RBracketLoc); 2411 } 2412 2413 /// Build a new array section expression. 2414 /// 2415 /// By default, performs semantic analysis to build the new expression. 2416 /// Subclasses may override this routine to provide different behavior. 2417 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2418 Expr *LowerBound, 2419 SourceLocation ColonLoc, Expr *Length, 2420 SourceLocation RBracketLoc) { 2421 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2422 ColonLoc, Length, RBracketLoc); 2423 } 2424 2425 /// Build a new array shaping expression. 2426 /// 2427 /// By default, performs semantic analysis to build the new expression. 2428 /// Subclasses may override this routine to provide different behavior. 2429 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2430 SourceLocation RParenLoc, 2431 ArrayRef<Expr *> Dims, 2432 ArrayRef<SourceRange> BracketsRanges) { 2433 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2434 BracketsRanges); 2435 } 2436 2437 /// Build a new iterator expression. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildOMPIteratorExpr( 2442 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2443 ArrayRef<Sema::OMPIteratorData> Data) { 2444 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2445 LLoc, RLoc, Data); 2446 } 2447 2448 /// Build a new call expression. 2449 /// 2450 /// By default, performs semantic analysis to build the new expression. 2451 /// Subclasses may override this routine to provide different behavior. 2452 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2453 MultiExprArg Args, 2454 SourceLocation RParenLoc, 2455 Expr *ExecConfig = nullptr) { 2456 return getSema().ActOnCallExpr( 2457 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2458 } 2459 2460 /// Build a new member access expression. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2465 bool isArrow, 2466 NestedNameSpecifierLoc QualifierLoc, 2467 SourceLocation TemplateKWLoc, 2468 const DeclarationNameInfo &MemberNameInfo, 2469 ValueDecl *Member, 2470 NamedDecl *FoundDecl, 2471 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2472 NamedDecl *FirstQualifierInScope) { 2473 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2474 isArrow); 2475 if (!Member->getDeclName()) { 2476 // We have a reference to an unnamed field. This is always the 2477 // base of an anonymous struct/union member access, i.e. the 2478 // field is always of record type. 2479 assert(Member->getType()->isRecordType() && 2480 "unnamed member not of record type?"); 2481 2482 BaseResult = 2483 getSema().PerformObjectMemberConversion(BaseResult.get(), 2484 QualifierLoc.getNestedNameSpecifier(), 2485 FoundDecl, Member); 2486 if (BaseResult.isInvalid()) 2487 return ExprError(); 2488 Base = BaseResult.get(); 2489 2490 CXXScopeSpec EmptySS; 2491 return getSema().BuildFieldReferenceExpr( 2492 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2493 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2494 } 2495 2496 CXXScopeSpec SS; 2497 SS.Adopt(QualifierLoc); 2498 2499 Base = BaseResult.get(); 2500 QualType BaseType = Base->getType(); 2501 2502 if (isArrow && !BaseType->isPointerType()) 2503 return ExprError(); 2504 2505 // FIXME: this involves duplicating earlier analysis in a lot of 2506 // cases; we should avoid this when possible. 2507 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2508 R.addDecl(FoundDecl); 2509 R.resolveKind(); 2510 2511 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2512 SS, TemplateKWLoc, 2513 FirstQualifierInScope, 2514 R, ExplicitTemplateArgs, 2515 /*S*/nullptr); 2516 } 2517 2518 /// Build a new binary operator expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2523 BinaryOperatorKind Opc, 2524 Expr *LHS, Expr *RHS) { 2525 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2526 } 2527 2528 /// Build a new rewritten operator expression. 2529 /// 2530 /// By default, performs semantic analysis to build the new expression. 2531 /// Subclasses may override this routine to provide different behavior. 2532 ExprResult RebuildCXXRewrittenBinaryOperator( 2533 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2534 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2535 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2536 RHS, /*RequiresADL*/false); 2537 } 2538 2539 /// Build a new conditional operator expression. 2540 /// 2541 /// By default, performs semantic analysis to build the new expression. 2542 /// Subclasses may override this routine to provide different behavior. 2543 ExprResult RebuildConditionalOperator(Expr *Cond, 2544 SourceLocation QuestionLoc, 2545 Expr *LHS, 2546 SourceLocation ColonLoc, 2547 Expr *RHS) { 2548 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2549 LHS, RHS); 2550 } 2551 2552 /// Build a new C-style cast expression. 2553 /// 2554 /// By default, performs semantic analysis to build the new expression. 2555 /// Subclasses may override this routine to provide different behavior. 2556 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2557 TypeSourceInfo *TInfo, 2558 SourceLocation RParenLoc, 2559 Expr *SubExpr) { 2560 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2561 SubExpr); 2562 } 2563 2564 /// Build a new compound literal expression. 2565 /// 2566 /// By default, performs semantic analysis to build the new expression. 2567 /// Subclasses may override this routine to provide different behavior. 2568 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2569 TypeSourceInfo *TInfo, 2570 SourceLocation RParenLoc, 2571 Expr *Init) { 2572 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2573 Init); 2574 } 2575 2576 /// Build a new extended vector element access expression. 2577 /// 2578 /// By default, performs semantic analysis to build the new expression. 2579 /// Subclasses may override this routine to provide different behavior. 2580 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2581 SourceLocation OpLoc, 2582 SourceLocation AccessorLoc, 2583 IdentifierInfo &Accessor) { 2584 2585 CXXScopeSpec SS; 2586 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2587 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2588 OpLoc, /*IsArrow*/ false, 2589 SS, SourceLocation(), 2590 /*FirstQualifierInScope*/ nullptr, 2591 NameInfo, 2592 /* TemplateArgs */ nullptr, 2593 /*S*/ nullptr); 2594 } 2595 2596 /// Build a new initializer list 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 RebuildInitList(SourceLocation LBraceLoc, 2601 MultiExprArg Inits, 2602 SourceLocation RBraceLoc) { 2603 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2604 } 2605 2606 /// Build a new designated initializer expression. 2607 /// 2608 /// By default, performs semantic analysis to build the new expression. 2609 /// Subclasses may override this routine to provide different behavior. 2610 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2611 MultiExprArg ArrayExprs, 2612 SourceLocation EqualOrColonLoc, 2613 bool GNUSyntax, 2614 Expr *Init) { 2615 ExprResult Result 2616 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2617 Init); 2618 if (Result.isInvalid()) 2619 return ExprError(); 2620 2621 return Result; 2622 } 2623 2624 /// Build a new value-initialized expression. 2625 /// 2626 /// By default, builds the implicit value initialization without performing 2627 /// any semantic analysis. Subclasses may override this routine to provide 2628 /// different behavior. 2629 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2630 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2631 } 2632 2633 /// Build a new \c va_arg expression. 2634 /// 2635 /// By default, performs semantic analysis to build the new expression. 2636 /// Subclasses may override this routine to provide different behavior. 2637 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2638 Expr *SubExpr, TypeSourceInfo *TInfo, 2639 SourceLocation RParenLoc) { 2640 return getSema().BuildVAArgExpr(BuiltinLoc, 2641 SubExpr, TInfo, 2642 RParenLoc); 2643 } 2644 2645 /// Build a new expression list in parentheses. 2646 /// 2647 /// By default, performs semantic analysis to build the new expression. 2648 /// Subclasses may override this routine to provide different behavior. 2649 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2650 MultiExprArg SubExprs, 2651 SourceLocation RParenLoc) { 2652 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2653 } 2654 2655 /// Build a new address-of-label expression. 2656 /// 2657 /// By default, performs semantic analysis, using the name of the label 2658 /// rather than attempting to map the label statement itself. 2659 /// Subclasses may override this routine to provide different behavior. 2660 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2661 SourceLocation LabelLoc, LabelDecl *Label) { 2662 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2663 } 2664 2665 /// Build a new GNU statement expression. 2666 /// 2667 /// By default, performs semantic analysis to build the new expression. 2668 /// Subclasses may override this routine to provide different behavior. 2669 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2670 SourceLocation RParenLoc, unsigned TemplateDepth) { 2671 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2672 TemplateDepth); 2673 } 2674 2675 /// Build a new __builtin_choose_expr expression. 2676 /// 2677 /// By default, performs semantic analysis to build the new expression. 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2680 Expr *Cond, Expr *LHS, Expr *RHS, 2681 SourceLocation RParenLoc) { 2682 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2683 Cond, LHS, RHS, 2684 RParenLoc); 2685 } 2686 2687 /// Build a new generic selection expression. 2688 /// 2689 /// By default, performs semantic analysis to build the new expression. 2690 /// Subclasses may override this routine to provide different behavior. 2691 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2692 SourceLocation DefaultLoc, 2693 SourceLocation RParenLoc, 2694 Expr *ControllingExpr, 2695 ArrayRef<TypeSourceInfo *> Types, 2696 ArrayRef<Expr *> Exprs) { 2697 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2698 ControllingExpr, Types, Exprs); 2699 } 2700 2701 /// Build a new overloaded operator call expression. 2702 /// 2703 /// By default, performs semantic analysis to build the new expression. 2704 /// The semantic analysis provides the behavior of template instantiation, 2705 /// copying with transformations that turn what looks like an overloaded 2706 /// operator call into a use of a builtin operator, performing 2707 /// argument-dependent lookup, etc. Subclasses may override this routine to 2708 /// provide different behavior. 2709 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2710 SourceLocation OpLoc, 2711 Expr *Callee, 2712 Expr *First, 2713 Expr *Second); 2714 2715 /// Build a new C++ "named" cast expression, such as static_cast or 2716 /// reinterpret_cast. 2717 /// 2718 /// By default, this routine dispatches to one of the more-specific routines 2719 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2720 /// Subclasses may override this routine to provide different behavior. 2721 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2722 Stmt::StmtClass Class, 2723 SourceLocation LAngleLoc, 2724 TypeSourceInfo *TInfo, 2725 SourceLocation RAngleLoc, 2726 SourceLocation LParenLoc, 2727 Expr *SubExpr, 2728 SourceLocation RParenLoc) { 2729 switch (Class) { 2730 case Stmt::CXXStaticCastExprClass: 2731 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2732 RAngleLoc, LParenLoc, 2733 SubExpr, RParenLoc); 2734 2735 case Stmt::CXXDynamicCastExprClass: 2736 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2737 RAngleLoc, LParenLoc, 2738 SubExpr, RParenLoc); 2739 2740 case Stmt::CXXReinterpretCastExprClass: 2741 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2742 RAngleLoc, LParenLoc, 2743 SubExpr, 2744 RParenLoc); 2745 2746 case Stmt::CXXConstCastExprClass: 2747 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2748 RAngleLoc, LParenLoc, 2749 SubExpr, RParenLoc); 2750 2751 case Stmt::CXXAddrspaceCastExprClass: 2752 return getDerived().RebuildCXXAddrspaceCastExpr( 2753 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2754 2755 default: 2756 llvm_unreachable("Invalid C++ named cast"); 2757 } 2758 } 2759 2760 /// Build a new C++ static_cast expression. 2761 /// 2762 /// By default, performs semantic analysis to build the new expression. 2763 /// Subclasses may override this routine to provide different behavior. 2764 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2765 SourceLocation LAngleLoc, 2766 TypeSourceInfo *TInfo, 2767 SourceLocation RAngleLoc, 2768 SourceLocation LParenLoc, 2769 Expr *SubExpr, 2770 SourceLocation RParenLoc) { 2771 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2772 TInfo, SubExpr, 2773 SourceRange(LAngleLoc, RAngleLoc), 2774 SourceRange(LParenLoc, RParenLoc)); 2775 } 2776 2777 /// Build a new C++ dynamic_cast expression. 2778 /// 2779 /// By default, performs semantic analysis to build the new expression. 2780 /// Subclasses may override this routine to provide different behavior. 2781 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2782 SourceLocation LAngleLoc, 2783 TypeSourceInfo *TInfo, 2784 SourceLocation RAngleLoc, 2785 SourceLocation LParenLoc, 2786 Expr *SubExpr, 2787 SourceLocation RParenLoc) { 2788 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2789 TInfo, SubExpr, 2790 SourceRange(LAngleLoc, RAngleLoc), 2791 SourceRange(LParenLoc, RParenLoc)); 2792 } 2793 2794 /// Build a new C++ reinterpret_cast expression. 2795 /// 2796 /// By default, performs semantic analysis to build the new expression. 2797 /// Subclasses may override this routine to provide different behavior. 2798 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2799 SourceLocation LAngleLoc, 2800 TypeSourceInfo *TInfo, 2801 SourceLocation RAngleLoc, 2802 SourceLocation LParenLoc, 2803 Expr *SubExpr, 2804 SourceLocation RParenLoc) { 2805 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2806 TInfo, SubExpr, 2807 SourceRange(LAngleLoc, RAngleLoc), 2808 SourceRange(LParenLoc, RParenLoc)); 2809 } 2810 2811 /// Build a new C++ const_cast expression. 2812 /// 2813 /// By default, performs semantic analysis to build the new expression. 2814 /// Subclasses may override this routine to provide different behavior. 2815 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2816 SourceLocation LAngleLoc, 2817 TypeSourceInfo *TInfo, 2818 SourceLocation RAngleLoc, 2819 SourceLocation LParenLoc, 2820 Expr *SubExpr, 2821 SourceLocation RParenLoc) { 2822 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2823 TInfo, SubExpr, 2824 SourceRange(LAngleLoc, RAngleLoc), 2825 SourceRange(LParenLoc, RParenLoc)); 2826 } 2827 2828 ExprResult 2829 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2830 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2831 SourceLocation LParenLoc, Expr *SubExpr, 2832 SourceLocation RParenLoc) { 2833 return getSema().BuildCXXNamedCast( 2834 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2835 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2836 } 2837 2838 /// Build a new C++ functional-style cast expression. 2839 /// 2840 /// By default, performs semantic analysis to build the new expression. 2841 /// Subclasses may override this routine to provide different behavior. 2842 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2843 SourceLocation LParenLoc, 2844 Expr *Sub, 2845 SourceLocation RParenLoc, 2846 bool ListInitialization) { 2847 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2848 MultiExprArg(&Sub, 1), RParenLoc, 2849 ListInitialization); 2850 } 2851 2852 /// Build a new C++ __builtin_bit_cast expression. 2853 /// 2854 /// By default, performs semantic analysis to build the new expression. 2855 /// Subclasses may override this routine to provide different behavior. 2856 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2857 TypeSourceInfo *TSI, Expr *Sub, 2858 SourceLocation RParenLoc) { 2859 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2860 } 2861 2862 /// Build a new C++ typeid(type) expression. 2863 /// 2864 /// By default, performs semantic analysis to build the new expression. 2865 /// Subclasses may override this routine to provide different behavior. 2866 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2867 SourceLocation TypeidLoc, 2868 TypeSourceInfo *Operand, 2869 SourceLocation RParenLoc) { 2870 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2871 RParenLoc); 2872 } 2873 2874 2875 /// Build a new C++ typeid(expr) expression. 2876 /// 2877 /// By default, performs semantic analysis to build the new expression. 2878 /// Subclasses may override this routine to provide different behavior. 2879 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2880 SourceLocation TypeidLoc, 2881 Expr *Operand, 2882 SourceLocation RParenLoc) { 2883 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2884 RParenLoc); 2885 } 2886 2887 /// Build a new C++ __uuidof(type) expression. 2888 /// 2889 /// By default, performs semantic analysis to build the new expression. 2890 /// Subclasses may override this routine to provide different behavior. 2891 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2892 TypeSourceInfo *Operand, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2895 } 2896 2897 /// Build a new C++ __uuidof(expr) expression. 2898 /// 2899 /// By default, performs semantic analysis to build the new expression. 2900 /// Subclasses may override this routine to provide different behavior. 2901 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2902 Expr *Operand, SourceLocation RParenLoc) { 2903 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2904 } 2905 2906 /// Build a new C++ "this" expression. 2907 /// 2908 /// By default, builds a new "this" expression without performing any 2909 /// semantic analysis. Subclasses may override this routine to provide 2910 /// different behavior. 2911 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2912 QualType ThisType, 2913 bool isImplicit) { 2914 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2915 } 2916 2917 /// Build a new C++ throw 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 RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2922 bool IsThrownVariableInScope) { 2923 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2924 } 2925 2926 /// Build a new C++ default-argument expression. 2927 /// 2928 /// By default, builds a new default-argument expression, which does not 2929 /// require any semantic analysis. Subclasses may override this routine to 2930 /// provide different behavior. 2931 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2932 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2933 getSema().CurContext); 2934 } 2935 2936 /// Build a new C++11 default-initialization expression. 2937 /// 2938 /// By default, builds a new default field initialization expression, which 2939 /// does not require any semantic analysis. Subclasses may override this 2940 /// routine to provide different behavior. 2941 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2942 FieldDecl *Field) { 2943 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2944 getSema().CurContext); 2945 } 2946 2947 /// Build a new C++ zero-initialization expression. 2948 /// 2949 /// By default, performs semantic analysis to build the new expression. 2950 /// Subclasses may override this routine to provide different behavior. 2951 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2952 SourceLocation LParenLoc, 2953 SourceLocation RParenLoc) { 2954 return getSema().BuildCXXTypeConstructExpr( 2955 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2956 } 2957 2958 /// Build a new C++ "new" expression. 2959 /// 2960 /// By default, performs semantic analysis to build the new expression. 2961 /// Subclasses may override this routine to provide different behavior. 2962 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2963 bool UseGlobal, 2964 SourceLocation PlacementLParen, 2965 MultiExprArg PlacementArgs, 2966 SourceLocation PlacementRParen, 2967 SourceRange TypeIdParens, 2968 QualType AllocatedType, 2969 TypeSourceInfo *AllocatedTypeInfo, 2970 Optional<Expr *> ArraySize, 2971 SourceRange DirectInitRange, 2972 Expr *Initializer) { 2973 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2974 PlacementLParen, 2975 PlacementArgs, 2976 PlacementRParen, 2977 TypeIdParens, 2978 AllocatedType, 2979 AllocatedTypeInfo, 2980 ArraySize, 2981 DirectInitRange, 2982 Initializer); 2983 } 2984 2985 /// Build a new C++ "delete" expression. 2986 /// 2987 /// By default, performs semantic analysis to build the new expression. 2988 /// Subclasses may override this routine to provide different behavior. 2989 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2990 bool IsGlobalDelete, 2991 bool IsArrayForm, 2992 Expr *Operand) { 2993 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2994 Operand); 2995 } 2996 2997 /// Build a new type trait expression. 2998 /// 2999 /// By default, performs semantic analysis to build the new expression. 3000 /// Subclasses may override this routine to provide different behavior. 3001 ExprResult RebuildTypeTrait(TypeTrait Trait, 3002 SourceLocation StartLoc, 3003 ArrayRef<TypeSourceInfo *> Args, 3004 SourceLocation RParenLoc) { 3005 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3006 } 3007 3008 /// Build a new array type trait expression. 3009 /// 3010 /// By default, performs semantic analysis to build the new expression. 3011 /// Subclasses may override this routine to provide different behavior. 3012 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3013 SourceLocation StartLoc, 3014 TypeSourceInfo *TSInfo, 3015 Expr *DimExpr, 3016 SourceLocation RParenLoc) { 3017 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3018 } 3019 3020 /// Build a new expression trait expression. 3021 /// 3022 /// By default, performs semantic analysis to build the new expression. 3023 /// Subclasses may override this routine to provide different behavior. 3024 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3025 SourceLocation StartLoc, 3026 Expr *Queried, 3027 SourceLocation RParenLoc) { 3028 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3029 } 3030 3031 /// Build a new (previously unresolved) declaration reference 3032 /// expression. 3033 /// 3034 /// By default, performs semantic analysis to build the new expression. 3035 /// Subclasses may override this routine to provide different behavior. 3036 ExprResult RebuildDependentScopeDeclRefExpr( 3037 NestedNameSpecifierLoc QualifierLoc, 3038 SourceLocation TemplateKWLoc, 3039 const DeclarationNameInfo &NameInfo, 3040 const TemplateArgumentListInfo *TemplateArgs, 3041 bool IsAddressOfOperand, 3042 TypeSourceInfo **RecoveryTSI) { 3043 CXXScopeSpec SS; 3044 SS.Adopt(QualifierLoc); 3045 3046 if (TemplateArgs || TemplateKWLoc.isValid()) 3047 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3048 TemplateArgs); 3049 3050 return getSema().BuildQualifiedDeclarationNameExpr( 3051 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3052 } 3053 3054 /// Build a new template-id expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3059 SourceLocation TemplateKWLoc, 3060 LookupResult &R, 3061 bool RequiresADL, 3062 const TemplateArgumentListInfo *TemplateArgs) { 3063 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3064 TemplateArgs); 3065 } 3066 3067 /// Build a new object-construction expression. 3068 /// 3069 /// By default, performs semantic analysis to build the new expression. 3070 /// Subclasses may override this routine to provide different behavior. 3071 ExprResult RebuildCXXConstructExpr(QualType T, 3072 SourceLocation Loc, 3073 CXXConstructorDecl *Constructor, 3074 bool IsElidable, 3075 MultiExprArg Args, 3076 bool HadMultipleCandidates, 3077 bool ListInitialization, 3078 bool StdInitListInitialization, 3079 bool RequiresZeroInit, 3080 CXXConstructExpr::ConstructionKind ConstructKind, 3081 SourceRange ParenRange) { 3082 // Reconstruct the constructor we originally found, which might be 3083 // different if this is a call to an inherited constructor. 3084 CXXConstructorDecl *FoundCtor = Constructor; 3085 if (Constructor->isInheritingConstructor()) 3086 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3087 3088 SmallVector<Expr*, 8> ConvertedArgs; 3089 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3090 return ExprError(); 3091 3092 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3093 IsElidable, 3094 ConvertedArgs, 3095 HadMultipleCandidates, 3096 ListInitialization, 3097 StdInitListInitialization, 3098 RequiresZeroInit, ConstructKind, 3099 ParenRange); 3100 } 3101 3102 /// Build a new implicit construction via inherited constructor 3103 /// expression. 3104 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3105 CXXConstructorDecl *Constructor, 3106 bool ConstructsVBase, 3107 bool InheritedFromVBase) { 3108 return new (getSema().Context) CXXInheritedCtorInitExpr( 3109 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3110 } 3111 3112 /// Build a new object-construction expression. 3113 /// 3114 /// By default, performs semantic analysis to build the new expression. 3115 /// Subclasses may override this routine to provide different behavior. 3116 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3117 SourceLocation LParenOrBraceLoc, 3118 MultiExprArg Args, 3119 SourceLocation RParenOrBraceLoc, 3120 bool ListInitialization) { 3121 return getSema().BuildCXXTypeConstructExpr( 3122 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3123 } 3124 3125 /// Build a new object-construction expression. 3126 /// 3127 /// By default, performs semantic analysis to build the new expression. 3128 /// Subclasses may override this routine to provide different behavior. 3129 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3130 SourceLocation LParenLoc, 3131 MultiExprArg Args, 3132 SourceLocation RParenLoc, 3133 bool ListInitialization) { 3134 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3135 RParenLoc, ListInitialization); 3136 } 3137 3138 /// Build a new member reference expression. 3139 /// 3140 /// By default, performs semantic analysis to build the new expression. 3141 /// Subclasses may override this routine to provide different behavior. 3142 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3143 QualType BaseType, 3144 bool IsArrow, 3145 SourceLocation OperatorLoc, 3146 NestedNameSpecifierLoc QualifierLoc, 3147 SourceLocation TemplateKWLoc, 3148 NamedDecl *FirstQualifierInScope, 3149 const DeclarationNameInfo &MemberNameInfo, 3150 const TemplateArgumentListInfo *TemplateArgs) { 3151 CXXScopeSpec SS; 3152 SS.Adopt(QualifierLoc); 3153 3154 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3155 OperatorLoc, IsArrow, 3156 SS, TemplateKWLoc, 3157 FirstQualifierInScope, 3158 MemberNameInfo, 3159 TemplateArgs, /*S*/nullptr); 3160 } 3161 3162 /// Build a new member reference expression. 3163 /// 3164 /// By default, performs semantic analysis to build the new expression. 3165 /// Subclasses may override this routine to provide different behavior. 3166 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3167 SourceLocation OperatorLoc, 3168 bool IsArrow, 3169 NestedNameSpecifierLoc QualifierLoc, 3170 SourceLocation TemplateKWLoc, 3171 NamedDecl *FirstQualifierInScope, 3172 LookupResult &R, 3173 const TemplateArgumentListInfo *TemplateArgs) { 3174 CXXScopeSpec SS; 3175 SS.Adopt(QualifierLoc); 3176 3177 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3178 OperatorLoc, IsArrow, 3179 SS, TemplateKWLoc, 3180 FirstQualifierInScope, 3181 R, TemplateArgs, /*S*/nullptr); 3182 } 3183 3184 /// Build a new noexcept expression. 3185 /// 3186 /// By default, performs semantic analysis to build the new expression. 3187 /// Subclasses may override this routine to provide different behavior. 3188 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3189 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3190 } 3191 3192 /// Build a new expression to compute the length of a parameter pack. 3193 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3194 NamedDecl *Pack, 3195 SourceLocation PackLoc, 3196 SourceLocation RParenLoc, 3197 Optional<unsigned> Length, 3198 ArrayRef<TemplateArgument> PartialArgs) { 3199 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3200 RParenLoc, Length, PartialArgs); 3201 } 3202 3203 /// Build a new expression representing a call to a source location 3204 /// builtin. 3205 /// 3206 /// By default, performs semantic analysis to build the new expression. 3207 /// Subclasses may override this routine to provide different behavior. 3208 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3209 SourceLocation BuiltinLoc, 3210 SourceLocation RPLoc, 3211 DeclContext *ParentContext) { 3212 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3213 } 3214 3215 /// Build a new Objective-C boxed expression. 3216 /// 3217 /// By default, performs semantic analysis to build the new expression. 3218 /// Subclasses may override this routine to provide different behavior. 3219 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3220 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3221 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3222 TemplateArgumentListInfo *TALI) { 3223 CXXScopeSpec SS; 3224 SS.Adopt(NNS); 3225 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3226 ConceptNameInfo, 3227 FoundDecl, 3228 NamedConcept, TALI); 3229 if (Result.isInvalid()) 3230 return ExprError(); 3231 return Result; 3232 } 3233 3234 /// \brief Build a new requires expression. 3235 /// 3236 /// By default, performs semantic analysis to build the new expression. 3237 /// Subclasses may override this routine to provide different behavior. 3238 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3239 RequiresExprBodyDecl *Body, 3240 ArrayRef<ParmVarDecl *> LocalParameters, 3241 ArrayRef<concepts::Requirement *> Requirements, 3242 SourceLocation ClosingBraceLoc) { 3243 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3244 LocalParameters, Requirements, ClosingBraceLoc); 3245 } 3246 3247 concepts::TypeRequirement * 3248 RebuildTypeRequirement( 3249 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3250 return SemaRef.BuildTypeRequirement(SubstDiag); 3251 } 3252 3253 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3254 return SemaRef.BuildTypeRequirement(T); 3255 } 3256 3257 concepts::ExprRequirement * 3258 RebuildExprRequirement( 3259 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3260 SourceLocation NoexceptLoc, 3261 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3262 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3263 std::move(Ret)); 3264 } 3265 3266 concepts::ExprRequirement * 3267 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3268 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3269 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3270 std::move(Ret)); 3271 } 3272 3273 concepts::NestedRequirement * 3274 RebuildNestedRequirement( 3275 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3276 return SemaRef.BuildNestedRequirement(SubstDiag); 3277 } 3278 3279 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3280 return SemaRef.BuildNestedRequirement(Constraint); 3281 } 3282 3283 /// \brief Build a new Objective-C boxed expression. 3284 /// 3285 /// By default, performs semantic analysis to build the new expression. 3286 /// Subclasses may override this routine to provide different behavior. 3287 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3288 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3289 } 3290 3291 /// Build a new Objective-C array literal. 3292 /// 3293 /// By default, performs semantic analysis to build the new expression. 3294 /// Subclasses may override this routine to provide different behavior. 3295 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3296 Expr **Elements, unsigned NumElements) { 3297 return getSema().BuildObjCArrayLiteral(Range, 3298 MultiExprArg(Elements, NumElements)); 3299 } 3300 3301 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3302 Expr *Base, Expr *Key, 3303 ObjCMethodDecl *getterMethod, 3304 ObjCMethodDecl *setterMethod) { 3305 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3306 getterMethod, setterMethod); 3307 } 3308 3309 /// Build a new Objective-C dictionary literal. 3310 /// 3311 /// By default, performs semantic analysis to build the new expression. 3312 /// Subclasses may override this routine to provide different behavior. 3313 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3314 MutableArrayRef<ObjCDictionaryElement> Elements) { 3315 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3316 } 3317 3318 /// Build a new Objective-C \@encode expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3323 TypeSourceInfo *EncodeTypeInfo, 3324 SourceLocation RParenLoc) { 3325 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3326 } 3327 3328 /// Build a new Objective-C class message. 3329 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3330 Selector Sel, 3331 ArrayRef<SourceLocation> SelectorLocs, 3332 ObjCMethodDecl *Method, 3333 SourceLocation LBracLoc, 3334 MultiExprArg Args, 3335 SourceLocation RBracLoc) { 3336 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3337 ReceiverTypeInfo->getType(), 3338 /*SuperLoc=*/SourceLocation(), 3339 Sel, Method, LBracLoc, SelectorLocs, 3340 RBracLoc, Args); 3341 } 3342 3343 /// Build a new Objective-C instance message. 3344 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3345 Selector Sel, 3346 ArrayRef<SourceLocation> SelectorLocs, 3347 ObjCMethodDecl *Method, 3348 SourceLocation LBracLoc, 3349 MultiExprArg Args, 3350 SourceLocation RBracLoc) { 3351 return SemaRef.BuildInstanceMessage(Receiver, 3352 Receiver->getType(), 3353 /*SuperLoc=*/SourceLocation(), 3354 Sel, Method, LBracLoc, SelectorLocs, 3355 RBracLoc, Args); 3356 } 3357 3358 /// Build a new Objective-C instance/class message to 'super'. 3359 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3360 Selector Sel, 3361 ArrayRef<SourceLocation> SelectorLocs, 3362 QualType SuperType, 3363 ObjCMethodDecl *Method, 3364 SourceLocation LBracLoc, 3365 MultiExprArg Args, 3366 SourceLocation RBracLoc) { 3367 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3368 SuperType, 3369 SuperLoc, 3370 Sel, Method, LBracLoc, SelectorLocs, 3371 RBracLoc, Args) 3372 : SemaRef.BuildClassMessage(nullptr, 3373 SuperType, 3374 SuperLoc, 3375 Sel, Method, LBracLoc, SelectorLocs, 3376 RBracLoc, Args); 3377 3378 3379 } 3380 3381 /// Build a new Objective-C ivar reference expression. 3382 /// 3383 /// By default, performs semantic analysis to build the new expression. 3384 /// Subclasses may override this routine to provide different behavior. 3385 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3386 SourceLocation IvarLoc, 3387 bool IsArrow, bool IsFreeIvar) { 3388 CXXScopeSpec SS; 3389 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3390 ExprResult Result = getSema().BuildMemberReferenceExpr( 3391 BaseArg, BaseArg->getType(), 3392 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3393 /*FirstQualifierInScope=*/nullptr, NameInfo, 3394 /*TemplateArgs=*/nullptr, 3395 /*S=*/nullptr); 3396 if (IsFreeIvar && Result.isUsable()) 3397 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3398 return Result; 3399 } 3400 3401 /// Build a new Objective-C property 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 RebuildObjCPropertyRefExpr(Expr *BaseArg, 3406 ObjCPropertyDecl *Property, 3407 SourceLocation PropertyLoc) { 3408 CXXScopeSpec SS; 3409 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3410 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3411 /*FIXME:*/PropertyLoc, 3412 /*IsArrow=*/false, 3413 SS, SourceLocation(), 3414 /*FirstQualifierInScope=*/nullptr, 3415 NameInfo, 3416 /*TemplateArgs=*/nullptr, 3417 /*S=*/nullptr); 3418 } 3419 3420 /// Build a new Objective-C property reference expression. 3421 /// 3422 /// By default, performs semantic analysis to build the new expression. 3423 /// Subclasses may override this routine to provide different behavior. 3424 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3425 ObjCMethodDecl *Getter, 3426 ObjCMethodDecl *Setter, 3427 SourceLocation PropertyLoc) { 3428 // Since these expressions can only be value-dependent, we do not 3429 // need to perform semantic analysis again. 3430 return Owned( 3431 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3432 VK_LValue, OK_ObjCProperty, 3433 PropertyLoc, Base)); 3434 } 3435 3436 /// Build a new Objective-C "isa" expression. 3437 /// 3438 /// By default, performs semantic analysis to build the new expression. 3439 /// Subclasses may override this routine to provide different behavior. 3440 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3441 SourceLocation OpLoc, bool IsArrow) { 3442 CXXScopeSpec SS; 3443 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3444 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3445 OpLoc, IsArrow, 3446 SS, SourceLocation(), 3447 /*FirstQualifierInScope=*/nullptr, 3448 NameInfo, 3449 /*TemplateArgs=*/nullptr, 3450 /*S=*/nullptr); 3451 } 3452 3453 /// Build a new shuffle vector expression. 3454 /// 3455 /// By default, performs semantic analysis to build the new expression. 3456 /// Subclasses may override this routine to provide different behavior. 3457 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3458 MultiExprArg SubExprs, 3459 SourceLocation RParenLoc) { 3460 // Find the declaration for __builtin_shufflevector 3461 const IdentifierInfo &Name 3462 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3463 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3464 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3465 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3466 3467 // Build a reference to the __builtin_shufflevector builtin 3468 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3469 Expr *Callee = new (SemaRef.Context) 3470 DeclRefExpr(SemaRef.Context, Builtin, false, 3471 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3472 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3473 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3474 CK_BuiltinFnToFnPtr).get(); 3475 3476 // Build the CallExpr 3477 ExprResult TheCall = CallExpr::Create( 3478 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3479 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3480 3481 // Type-check the __builtin_shufflevector expression. 3482 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3483 } 3484 3485 /// Build a new convert vector expression. 3486 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3487 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3488 SourceLocation RParenLoc) { 3489 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3490 BuiltinLoc, RParenLoc); 3491 } 3492 3493 /// Build a new template argument pack expansion. 3494 /// 3495 /// By default, performs semantic analysis to build a new pack expansion 3496 /// for a template argument. Subclasses may override this routine to provide 3497 /// different behavior. 3498 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3499 SourceLocation EllipsisLoc, 3500 Optional<unsigned> NumExpansions) { 3501 switch (Pattern.getArgument().getKind()) { 3502 case TemplateArgument::Expression: { 3503 ExprResult Result 3504 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3505 EllipsisLoc, NumExpansions); 3506 if (Result.isInvalid()) 3507 return TemplateArgumentLoc(); 3508 3509 return TemplateArgumentLoc(Result.get(), Result.get()); 3510 } 3511 3512 case TemplateArgument::Template: 3513 return TemplateArgumentLoc(TemplateArgument( 3514 Pattern.getArgument().getAsTemplate(), 3515 NumExpansions), 3516 Pattern.getTemplateQualifierLoc(), 3517 Pattern.getTemplateNameLoc(), 3518 EllipsisLoc); 3519 3520 case TemplateArgument::Null: 3521 case TemplateArgument::Integral: 3522 case TemplateArgument::Declaration: 3523 case TemplateArgument::Pack: 3524 case TemplateArgument::TemplateExpansion: 3525 case TemplateArgument::NullPtr: 3526 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3527 3528 case TemplateArgument::Type: 3529 if (TypeSourceInfo *Expansion 3530 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3531 EllipsisLoc, 3532 NumExpansions)) 3533 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3534 Expansion); 3535 break; 3536 } 3537 3538 return TemplateArgumentLoc(); 3539 } 3540 3541 /// Build a new expression pack expansion. 3542 /// 3543 /// By default, performs semantic analysis to build a new pack expansion 3544 /// for an expression. Subclasses may override this routine to provide 3545 /// different behavior. 3546 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3547 Optional<unsigned> NumExpansions) { 3548 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3549 } 3550 3551 /// Build a new C++1z fold-expression. 3552 /// 3553 /// By default, performs semantic analysis in order to build a new fold 3554 /// expression. 3555 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3556 BinaryOperatorKind Operator, 3557 SourceLocation EllipsisLoc, Expr *RHS, 3558 SourceLocation RParenLoc, 3559 Optional<unsigned> NumExpansions) { 3560 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3561 RHS, RParenLoc, NumExpansions); 3562 } 3563 3564 /// Build an empty C++1z fold-expression with the given operator. 3565 /// 3566 /// By default, produces the fallback value for the fold-expression, or 3567 /// produce an error if there is no fallback value. 3568 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3569 BinaryOperatorKind Operator) { 3570 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3571 } 3572 3573 /// Build a new atomic operation expression. 3574 /// 3575 /// By default, performs semantic analysis to build the new expression. 3576 /// Subclasses may override this routine to provide different behavior. 3577 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3578 AtomicExpr::AtomicOp Op, 3579 SourceLocation RParenLoc) { 3580 // Use this for all of the locations, since we don't know the difference 3581 // between the call and the expr at this point. 3582 SourceRange Range{BuiltinLoc, RParenLoc}; 3583 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3584 Sema::AtomicArgumentOrder::AST); 3585 } 3586 3587 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3588 ArrayRef<Expr *> SubExprs) { 3589 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs); 3590 } 3591 3592 private: 3593 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3594 QualType ObjectType, 3595 NamedDecl *FirstQualifierInScope, 3596 CXXScopeSpec &SS); 3597 3598 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3599 QualType ObjectType, 3600 NamedDecl *FirstQualifierInScope, 3601 CXXScopeSpec &SS); 3602 3603 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3604 NamedDecl *FirstQualifierInScope, 3605 CXXScopeSpec &SS); 3606 3607 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3608 DependentNameTypeLoc TL, 3609 bool DeducibleTSTContext); 3610 }; 3611 3612 template <typename Derived> 3613 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3614 if (!S) 3615 return S; 3616 3617 switch (S->getStmtClass()) { 3618 case Stmt::NoStmtClass: break; 3619 3620 // Transform individual statement nodes 3621 // Pass SDK into statements that can produce a value 3622 #define STMT(Node, Parent) \ 3623 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3624 #define VALUESTMT(Node, Parent) \ 3625 case Stmt::Node##Class: \ 3626 return getDerived().Transform##Node(cast<Node>(S), SDK); 3627 #define ABSTRACT_STMT(Node) 3628 #define EXPR(Node, Parent) 3629 #include "clang/AST/StmtNodes.inc" 3630 3631 // Transform expressions by calling TransformExpr. 3632 #define STMT(Node, Parent) 3633 #define ABSTRACT_STMT(Stmt) 3634 #define EXPR(Node, Parent) case Stmt::Node##Class: 3635 #include "clang/AST/StmtNodes.inc" 3636 { 3637 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3638 3639 if (SDK == SDK_StmtExprResult) 3640 E = getSema().ActOnStmtExprResult(E); 3641 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3642 } 3643 } 3644 3645 return S; 3646 } 3647 3648 template<typename Derived> 3649 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3650 if (!S) 3651 return S; 3652 3653 switch (S->getClauseKind()) { 3654 default: break; 3655 // Transform individual clause nodes 3656 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3657 case Enum: \ 3658 return getDerived().Transform ## Class(cast<Class>(S)); 3659 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3660 } 3661 3662 return S; 3663 } 3664 3665 3666 template<typename Derived> 3667 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3668 if (!E) 3669 return E; 3670 3671 switch (E->getStmtClass()) { 3672 case Stmt::NoStmtClass: break; 3673 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3674 #define ABSTRACT_STMT(Stmt) 3675 #define EXPR(Node, Parent) \ 3676 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3677 #include "clang/AST/StmtNodes.inc" 3678 } 3679 3680 return E; 3681 } 3682 3683 template<typename Derived> 3684 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3685 bool NotCopyInit) { 3686 // Initializers are instantiated like expressions, except that various outer 3687 // layers are stripped. 3688 if (!Init) 3689 return Init; 3690 3691 if (auto *FE = dyn_cast<FullExpr>(Init)) 3692 Init = FE->getSubExpr(); 3693 3694 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3695 Init = AIL->getCommonExpr(); 3696 3697 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3698 Init = MTE->getSubExpr(); 3699 3700 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3701 Init = Binder->getSubExpr(); 3702 3703 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3704 Init = ICE->getSubExprAsWritten(); 3705 3706 if (CXXStdInitializerListExpr *ILE = 3707 dyn_cast<CXXStdInitializerListExpr>(Init)) 3708 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3709 3710 // If this is copy-initialization, we only need to reconstruct 3711 // InitListExprs. Other forms of copy-initialization will be a no-op if 3712 // the initializer is already the right type. 3713 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3714 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3715 return getDerived().TransformExpr(Init); 3716 3717 // Revert value-initialization back to empty parens. 3718 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3719 SourceRange Parens = VIE->getSourceRange(); 3720 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3721 Parens.getEnd()); 3722 } 3723 3724 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3725 if (isa<ImplicitValueInitExpr>(Init)) 3726 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3727 SourceLocation()); 3728 3729 // Revert initialization by constructor back to a parenthesized or braced list 3730 // of expressions. Any other form of initializer can just be reused directly. 3731 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3732 return getDerived().TransformExpr(Init); 3733 3734 // If the initialization implicitly converted an initializer list to a 3735 // std::initializer_list object, unwrap the std::initializer_list too. 3736 if (Construct && Construct->isStdInitListInitialization()) 3737 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3738 3739 // Enter a list-init context if this was list initialization. 3740 EnterExpressionEvaluationContext Context( 3741 getSema(), EnterExpressionEvaluationContext::InitList, 3742 Construct->isListInitialization()); 3743 3744 SmallVector<Expr*, 8> NewArgs; 3745 bool ArgChanged = false; 3746 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3747 /*IsCall*/true, NewArgs, &ArgChanged)) 3748 return ExprError(); 3749 3750 // If this was list initialization, revert to syntactic list form. 3751 if (Construct->isListInitialization()) 3752 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3753 Construct->getEndLoc()); 3754 3755 // Build a ParenListExpr to represent anything else. 3756 SourceRange Parens = Construct->getParenOrBraceRange(); 3757 if (Parens.isInvalid()) { 3758 // This was a variable declaration's initialization for which no initializer 3759 // was specified. 3760 assert(NewArgs.empty() && 3761 "no parens or braces but have direct init with arguments?"); 3762 return ExprEmpty(); 3763 } 3764 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3765 Parens.getEnd()); 3766 } 3767 3768 template<typename Derived> 3769 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3770 unsigned NumInputs, 3771 bool IsCall, 3772 SmallVectorImpl<Expr *> &Outputs, 3773 bool *ArgChanged) { 3774 for (unsigned I = 0; I != NumInputs; ++I) { 3775 // If requested, drop call arguments that need to be dropped. 3776 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3777 if (ArgChanged) 3778 *ArgChanged = true; 3779 3780 break; 3781 } 3782 3783 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3784 Expr *Pattern = Expansion->getPattern(); 3785 3786 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3787 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3788 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3789 3790 // Determine whether the set of unexpanded parameter packs can and should 3791 // be expanded. 3792 bool Expand = true; 3793 bool RetainExpansion = false; 3794 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3795 Optional<unsigned> NumExpansions = OrigNumExpansions; 3796 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3797 Pattern->getSourceRange(), 3798 Unexpanded, 3799 Expand, RetainExpansion, 3800 NumExpansions)) 3801 return true; 3802 3803 if (!Expand) { 3804 // The transform has determined that we should perform a simple 3805 // transformation on the pack expansion, producing another pack 3806 // expansion. 3807 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3808 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3809 if (OutPattern.isInvalid()) 3810 return true; 3811 3812 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3813 Expansion->getEllipsisLoc(), 3814 NumExpansions); 3815 if (Out.isInvalid()) 3816 return true; 3817 3818 if (ArgChanged) 3819 *ArgChanged = true; 3820 Outputs.push_back(Out.get()); 3821 continue; 3822 } 3823 3824 // Record right away that the argument was changed. This needs 3825 // to happen even if the array expands to nothing. 3826 if (ArgChanged) *ArgChanged = true; 3827 3828 // The transform has determined that we should perform an elementwise 3829 // expansion of the pattern. Do so. 3830 for (unsigned I = 0; I != *NumExpansions; ++I) { 3831 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3832 ExprResult Out = getDerived().TransformExpr(Pattern); 3833 if (Out.isInvalid()) 3834 return true; 3835 3836 if (Out.get()->containsUnexpandedParameterPack()) { 3837 Out = getDerived().RebuildPackExpansion( 3838 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3839 if (Out.isInvalid()) 3840 return true; 3841 } 3842 3843 Outputs.push_back(Out.get()); 3844 } 3845 3846 // If we're supposed to retain a pack expansion, do so by temporarily 3847 // forgetting the partially-substituted parameter pack. 3848 if (RetainExpansion) { 3849 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3850 3851 ExprResult Out = getDerived().TransformExpr(Pattern); 3852 if (Out.isInvalid()) 3853 return true; 3854 3855 Out = getDerived().RebuildPackExpansion( 3856 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3857 if (Out.isInvalid()) 3858 return true; 3859 3860 Outputs.push_back(Out.get()); 3861 } 3862 3863 continue; 3864 } 3865 3866 ExprResult Result = 3867 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3868 : getDerived().TransformExpr(Inputs[I]); 3869 if (Result.isInvalid()) 3870 return true; 3871 3872 if (Result.get() != Inputs[I] && ArgChanged) 3873 *ArgChanged = true; 3874 3875 Outputs.push_back(Result.get()); 3876 } 3877 3878 return false; 3879 } 3880 3881 template <typename Derived> 3882 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3883 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3884 if (Var) { 3885 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3886 getDerived().TransformDefinition(Var->getLocation(), Var)); 3887 3888 if (!ConditionVar) 3889 return Sema::ConditionError(); 3890 3891 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3892 } 3893 3894 if (Expr) { 3895 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3896 3897 if (CondExpr.isInvalid()) 3898 return Sema::ConditionError(); 3899 3900 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3901 } 3902 3903 return Sema::ConditionResult(); 3904 } 3905 3906 template<typename Derived> 3907 NestedNameSpecifierLoc 3908 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3909 NestedNameSpecifierLoc NNS, 3910 QualType ObjectType, 3911 NamedDecl *FirstQualifierInScope) { 3912 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3913 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3914 Qualifier = Qualifier.getPrefix()) 3915 Qualifiers.push_back(Qualifier); 3916 3917 CXXScopeSpec SS; 3918 while (!Qualifiers.empty()) { 3919 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3920 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3921 3922 switch (QNNS->getKind()) { 3923 case NestedNameSpecifier::Identifier: { 3924 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3925 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3926 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3927 SS, FirstQualifierInScope, false)) 3928 return NestedNameSpecifierLoc(); 3929 } 3930 break; 3931 3932 case NestedNameSpecifier::Namespace: { 3933 NamespaceDecl *NS 3934 = cast_or_null<NamespaceDecl>( 3935 getDerived().TransformDecl( 3936 Q.getLocalBeginLoc(), 3937 QNNS->getAsNamespace())); 3938 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3939 break; 3940 } 3941 3942 case NestedNameSpecifier::NamespaceAlias: { 3943 NamespaceAliasDecl *Alias 3944 = cast_or_null<NamespaceAliasDecl>( 3945 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3946 QNNS->getAsNamespaceAlias())); 3947 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3948 Q.getLocalEndLoc()); 3949 break; 3950 } 3951 3952 case NestedNameSpecifier::Global: 3953 // There is no meaningful transformation that one could perform on the 3954 // global scope. 3955 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3956 break; 3957 3958 case NestedNameSpecifier::Super: { 3959 CXXRecordDecl *RD = 3960 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3961 SourceLocation(), QNNS->getAsRecordDecl())); 3962 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3963 break; 3964 } 3965 3966 case NestedNameSpecifier::TypeSpecWithTemplate: 3967 case NestedNameSpecifier::TypeSpec: { 3968 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3969 FirstQualifierInScope, SS); 3970 3971 if (!TL) 3972 return NestedNameSpecifierLoc(); 3973 3974 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3975 (SemaRef.getLangOpts().CPlusPlus11 && 3976 TL.getType()->isEnumeralType())) { 3977 assert(!TL.getType().hasLocalQualifiers() && 3978 "Can't get cv-qualifiers here"); 3979 if (TL.getType()->isEnumeralType()) 3980 SemaRef.Diag(TL.getBeginLoc(), 3981 diag::warn_cxx98_compat_enum_nested_name_spec); 3982 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3983 Q.getLocalEndLoc()); 3984 break; 3985 } 3986 // If the nested-name-specifier is an invalid type def, don't emit an 3987 // error because a previous error should have already been emitted. 3988 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3989 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3990 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3991 << TL.getType() << SS.getRange(); 3992 } 3993 return NestedNameSpecifierLoc(); 3994 } 3995 } 3996 3997 // The qualifier-in-scope and object type only apply to the leftmost entity. 3998 FirstQualifierInScope = nullptr; 3999 ObjectType = QualType(); 4000 } 4001 4002 // Don't rebuild the nested-name-specifier if we don't have to. 4003 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4004 !getDerived().AlwaysRebuild()) 4005 return NNS; 4006 4007 // If we can re-use the source-location data from the original 4008 // nested-name-specifier, do so. 4009 if (SS.location_size() == NNS.getDataLength() && 4010 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4011 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4012 4013 // Allocate new nested-name-specifier location information. 4014 return SS.getWithLocInContext(SemaRef.Context); 4015 } 4016 4017 template<typename Derived> 4018 DeclarationNameInfo 4019 TreeTransform<Derived> 4020 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4021 DeclarationName Name = NameInfo.getName(); 4022 if (!Name) 4023 return DeclarationNameInfo(); 4024 4025 switch (Name.getNameKind()) { 4026 case DeclarationName::Identifier: 4027 case DeclarationName::ObjCZeroArgSelector: 4028 case DeclarationName::ObjCOneArgSelector: 4029 case DeclarationName::ObjCMultiArgSelector: 4030 case DeclarationName::CXXOperatorName: 4031 case DeclarationName::CXXLiteralOperatorName: 4032 case DeclarationName::CXXUsingDirective: 4033 return NameInfo; 4034 4035 case DeclarationName::CXXDeductionGuideName: { 4036 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4037 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4038 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4039 if (!NewTemplate) 4040 return DeclarationNameInfo(); 4041 4042 DeclarationNameInfo NewNameInfo(NameInfo); 4043 NewNameInfo.setName( 4044 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4045 return NewNameInfo; 4046 } 4047 4048 case DeclarationName::CXXConstructorName: 4049 case DeclarationName::CXXDestructorName: 4050 case DeclarationName::CXXConversionFunctionName: { 4051 TypeSourceInfo *NewTInfo; 4052 CanQualType NewCanTy; 4053 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4054 NewTInfo = getDerived().TransformType(OldTInfo); 4055 if (!NewTInfo) 4056 return DeclarationNameInfo(); 4057 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4058 } 4059 else { 4060 NewTInfo = nullptr; 4061 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4062 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4063 if (NewT.isNull()) 4064 return DeclarationNameInfo(); 4065 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4066 } 4067 4068 DeclarationName NewName 4069 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4070 NewCanTy); 4071 DeclarationNameInfo NewNameInfo(NameInfo); 4072 NewNameInfo.setName(NewName); 4073 NewNameInfo.setNamedTypeInfo(NewTInfo); 4074 return NewNameInfo; 4075 } 4076 } 4077 4078 llvm_unreachable("Unknown name kind."); 4079 } 4080 4081 template<typename Derived> 4082 TemplateName 4083 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4084 TemplateName Name, 4085 SourceLocation NameLoc, 4086 QualType ObjectType, 4087 NamedDecl *FirstQualifierInScope, 4088 bool AllowInjectedClassName) { 4089 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4090 TemplateDecl *Template = QTN->getTemplateDecl(); 4091 assert(Template && "qualified template name must refer to a template"); 4092 4093 TemplateDecl *TransTemplate 4094 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4095 Template)); 4096 if (!TransTemplate) 4097 return TemplateName(); 4098 4099 if (!getDerived().AlwaysRebuild() && 4100 SS.getScopeRep() == QTN->getQualifier() && 4101 TransTemplate == Template) 4102 return Name; 4103 4104 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4105 TransTemplate); 4106 } 4107 4108 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4109 if (SS.getScopeRep()) { 4110 // These apply to the scope specifier, not the template. 4111 ObjectType = QualType(); 4112 FirstQualifierInScope = nullptr; 4113 } 4114 4115 if (!getDerived().AlwaysRebuild() && 4116 SS.getScopeRep() == DTN->getQualifier() && 4117 ObjectType.isNull()) 4118 return Name; 4119 4120 // FIXME: Preserve the location of the "template" keyword. 4121 SourceLocation TemplateKWLoc = NameLoc; 4122 4123 if (DTN->isIdentifier()) { 4124 return getDerived().RebuildTemplateName(SS, 4125 TemplateKWLoc, 4126 *DTN->getIdentifier(), 4127 NameLoc, 4128 ObjectType, 4129 FirstQualifierInScope, 4130 AllowInjectedClassName); 4131 } 4132 4133 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4134 DTN->getOperator(), NameLoc, 4135 ObjectType, AllowInjectedClassName); 4136 } 4137 4138 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4139 TemplateDecl *TransTemplate 4140 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4141 Template)); 4142 if (!TransTemplate) 4143 return TemplateName(); 4144 4145 if (!getDerived().AlwaysRebuild() && 4146 TransTemplate == Template) 4147 return Name; 4148 4149 return TemplateName(TransTemplate); 4150 } 4151 4152 if (SubstTemplateTemplateParmPackStorage *SubstPack 4153 = Name.getAsSubstTemplateTemplateParmPack()) { 4154 TemplateTemplateParmDecl *TransParam 4155 = cast_or_null<TemplateTemplateParmDecl>( 4156 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4157 if (!TransParam) 4158 return TemplateName(); 4159 4160 if (!getDerived().AlwaysRebuild() && 4161 TransParam == SubstPack->getParameterPack()) 4162 return Name; 4163 4164 return getDerived().RebuildTemplateName(TransParam, 4165 SubstPack->getArgumentPack()); 4166 } 4167 4168 // These should be getting filtered out before they reach the AST. 4169 llvm_unreachable("overloaded function decl survived to here"); 4170 } 4171 4172 template<typename Derived> 4173 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4174 const TemplateArgument &Arg, 4175 TemplateArgumentLoc &Output) { 4176 Output = getSema().getTrivialTemplateArgumentLoc( 4177 Arg, QualType(), getDerived().getBaseLocation()); 4178 } 4179 4180 template<typename Derived> 4181 bool TreeTransform<Derived>::TransformTemplateArgument( 4182 const TemplateArgumentLoc &Input, 4183 TemplateArgumentLoc &Output, bool Uneval) { 4184 const TemplateArgument &Arg = Input.getArgument(); 4185 switch (Arg.getKind()) { 4186 case TemplateArgument::Null: 4187 case TemplateArgument::Pack: 4188 llvm_unreachable("Unexpected TemplateArgument"); 4189 4190 case TemplateArgument::Integral: 4191 case TemplateArgument::NullPtr: 4192 case TemplateArgument::Declaration: { 4193 // Transform a resolved template argument straight to a resolved template 4194 // argument. We get here when substituting into an already-substituted 4195 // template type argument during concept satisfaction checking. 4196 QualType T = Arg.getNonTypeTemplateArgumentType(); 4197 QualType NewT = getDerived().TransformType(T); 4198 if (NewT.isNull()) 4199 return true; 4200 4201 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4202 ? Arg.getAsDecl() 4203 : nullptr; 4204 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4205 getDerived().getBaseLocation(), D)) 4206 : nullptr; 4207 if (D && !NewD) 4208 return true; 4209 4210 if (NewT == T && D == NewD) 4211 Output = Input; 4212 else if (Arg.getKind() == TemplateArgument::Integral) 4213 Output = TemplateArgumentLoc( 4214 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4215 TemplateArgumentLocInfo()); 4216 else if (Arg.getKind() == TemplateArgument::NullPtr) 4217 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4218 TemplateArgumentLocInfo()); 4219 else 4220 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4221 TemplateArgumentLocInfo()); 4222 4223 return false; 4224 } 4225 4226 case TemplateArgument::Type: { 4227 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4228 if (!DI) 4229 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4230 4231 DI = getDerived().TransformType(DI); 4232 if (!DI) return true; 4233 4234 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4235 return false; 4236 } 4237 4238 case TemplateArgument::Template: { 4239 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4240 if (QualifierLoc) { 4241 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4242 if (!QualifierLoc) 4243 return true; 4244 } 4245 4246 CXXScopeSpec SS; 4247 SS.Adopt(QualifierLoc); 4248 TemplateName Template 4249 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4250 Input.getTemplateNameLoc()); 4251 if (Template.isNull()) 4252 return true; 4253 4254 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4255 Input.getTemplateNameLoc()); 4256 return false; 4257 } 4258 4259 case TemplateArgument::TemplateExpansion: 4260 llvm_unreachable("Caller should expand pack expansions"); 4261 4262 case TemplateArgument::Expression: { 4263 // Template argument expressions are constant expressions. 4264 EnterExpressionEvaluationContext Unevaluated( 4265 getSema(), 4266 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4267 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4268 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4269 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4270 4271 Expr *InputExpr = Input.getSourceExpression(); 4272 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4273 4274 ExprResult E = getDerived().TransformExpr(InputExpr); 4275 E = SemaRef.ActOnConstantExpression(E); 4276 if (E.isInvalid()) return true; 4277 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4278 return false; 4279 } 4280 } 4281 4282 // Work around bogus GCC warning 4283 return true; 4284 } 4285 4286 /// Iterator adaptor that invents template argument location information 4287 /// for each of the template arguments in its underlying iterator. 4288 template<typename Derived, typename InputIterator> 4289 class TemplateArgumentLocInventIterator { 4290 TreeTransform<Derived> &Self; 4291 InputIterator Iter; 4292 4293 public: 4294 typedef TemplateArgumentLoc value_type; 4295 typedef TemplateArgumentLoc reference; 4296 typedef typename std::iterator_traits<InputIterator>::difference_type 4297 difference_type; 4298 typedef std::input_iterator_tag iterator_category; 4299 4300 class pointer { 4301 TemplateArgumentLoc Arg; 4302 4303 public: 4304 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4305 4306 const TemplateArgumentLoc *operator->() const { return &Arg; } 4307 }; 4308 4309 TemplateArgumentLocInventIterator() { } 4310 4311 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4312 InputIterator Iter) 4313 : Self(Self), Iter(Iter) { } 4314 4315 TemplateArgumentLocInventIterator &operator++() { 4316 ++Iter; 4317 return *this; 4318 } 4319 4320 TemplateArgumentLocInventIterator operator++(int) { 4321 TemplateArgumentLocInventIterator Old(*this); 4322 ++(*this); 4323 return Old; 4324 } 4325 4326 reference operator*() const { 4327 TemplateArgumentLoc Result; 4328 Self.InventTemplateArgumentLoc(*Iter, Result); 4329 return Result; 4330 } 4331 4332 pointer operator->() const { return pointer(**this); } 4333 4334 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4335 const TemplateArgumentLocInventIterator &Y) { 4336 return X.Iter == Y.Iter; 4337 } 4338 4339 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4340 const TemplateArgumentLocInventIterator &Y) { 4341 return X.Iter != Y.Iter; 4342 } 4343 }; 4344 4345 template<typename Derived> 4346 template<typename InputIterator> 4347 bool TreeTransform<Derived>::TransformTemplateArguments( 4348 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4349 bool Uneval) { 4350 for (; First != Last; ++First) { 4351 TemplateArgumentLoc Out; 4352 TemplateArgumentLoc In = *First; 4353 4354 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4355 // Unpack argument packs, which we translate them into separate 4356 // arguments. 4357 // FIXME: We could do much better if we could guarantee that the 4358 // TemplateArgumentLocInfo for the pack expansion would be usable for 4359 // all of the template arguments in the argument pack. 4360 typedef TemplateArgumentLocInventIterator<Derived, 4361 TemplateArgument::pack_iterator> 4362 PackLocIterator; 4363 if (TransformTemplateArguments(PackLocIterator(*this, 4364 In.getArgument().pack_begin()), 4365 PackLocIterator(*this, 4366 In.getArgument().pack_end()), 4367 Outputs, Uneval)) 4368 return true; 4369 4370 continue; 4371 } 4372 4373 if (In.getArgument().isPackExpansion()) { 4374 // We have a pack expansion, for which we will be substituting into 4375 // the pattern. 4376 SourceLocation Ellipsis; 4377 Optional<unsigned> OrigNumExpansions; 4378 TemplateArgumentLoc Pattern 4379 = getSema().getTemplateArgumentPackExpansionPattern( 4380 In, Ellipsis, OrigNumExpansions); 4381 4382 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4383 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4384 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4385 4386 // Determine whether the set of unexpanded parameter packs can and should 4387 // be expanded. 4388 bool Expand = true; 4389 bool RetainExpansion = false; 4390 Optional<unsigned> NumExpansions = OrigNumExpansions; 4391 if (getDerived().TryExpandParameterPacks(Ellipsis, 4392 Pattern.getSourceRange(), 4393 Unexpanded, 4394 Expand, 4395 RetainExpansion, 4396 NumExpansions)) 4397 return true; 4398 4399 if (!Expand) { 4400 // The transform has determined that we should perform a simple 4401 // transformation on the pack expansion, producing another pack 4402 // expansion. 4403 TemplateArgumentLoc OutPattern; 4404 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4405 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4406 return true; 4407 4408 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4409 NumExpansions); 4410 if (Out.getArgument().isNull()) 4411 return true; 4412 4413 Outputs.addArgument(Out); 4414 continue; 4415 } 4416 4417 // The transform has determined that we should perform an elementwise 4418 // expansion of the pattern. Do so. 4419 for (unsigned I = 0; I != *NumExpansions; ++I) { 4420 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4421 4422 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4423 return true; 4424 4425 if (Out.getArgument().containsUnexpandedParameterPack()) { 4426 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4427 OrigNumExpansions); 4428 if (Out.getArgument().isNull()) 4429 return true; 4430 } 4431 4432 Outputs.addArgument(Out); 4433 } 4434 4435 // If we're supposed to retain a pack expansion, do so by temporarily 4436 // forgetting the partially-substituted parameter pack. 4437 if (RetainExpansion) { 4438 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4439 4440 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4441 return true; 4442 4443 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4444 OrigNumExpansions); 4445 if (Out.getArgument().isNull()) 4446 return true; 4447 4448 Outputs.addArgument(Out); 4449 } 4450 4451 continue; 4452 } 4453 4454 // The simple case: 4455 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4456 return true; 4457 4458 Outputs.addArgument(Out); 4459 } 4460 4461 return false; 4462 4463 } 4464 4465 //===----------------------------------------------------------------------===// 4466 // Type transformation 4467 //===----------------------------------------------------------------------===// 4468 4469 template<typename Derived> 4470 QualType TreeTransform<Derived>::TransformType(QualType T) { 4471 if (getDerived().AlreadyTransformed(T)) 4472 return T; 4473 4474 // Temporary workaround. All of these transformations should 4475 // eventually turn into transformations on TypeLocs. 4476 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4477 getDerived().getBaseLocation()); 4478 4479 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4480 4481 if (!NewDI) 4482 return QualType(); 4483 4484 return NewDI->getType(); 4485 } 4486 4487 template<typename Derived> 4488 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4489 // Refine the base location to the type's location. 4490 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4491 getDerived().getBaseEntity()); 4492 if (getDerived().AlreadyTransformed(DI->getType())) 4493 return DI; 4494 4495 TypeLocBuilder TLB; 4496 4497 TypeLoc TL = DI->getTypeLoc(); 4498 TLB.reserve(TL.getFullDataSize()); 4499 4500 QualType Result = getDerived().TransformType(TLB, TL); 4501 if (Result.isNull()) 4502 return nullptr; 4503 4504 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4505 } 4506 4507 template<typename Derived> 4508 QualType 4509 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4510 switch (T.getTypeLocClass()) { 4511 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4512 #define TYPELOC(CLASS, PARENT) \ 4513 case TypeLoc::CLASS: \ 4514 return getDerived().Transform##CLASS##Type(TLB, \ 4515 T.castAs<CLASS##TypeLoc>()); 4516 #include "clang/AST/TypeLocNodes.def" 4517 } 4518 4519 llvm_unreachable("unhandled type loc!"); 4520 } 4521 4522 template<typename Derived> 4523 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4524 if (!isa<DependentNameType>(T)) 4525 return TransformType(T); 4526 4527 if (getDerived().AlreadyTransformed(T)) 4528 return T; 4529 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4530 getDerived().getBaseLocation()); 4531 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4532 return NewDI ? NewDI->getType() : QualType(); 4533 } 4534 4535 template<typename Derived> 4536 TypeSourceInfo * 4537 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4538 if (!isa<DependentNameType>(DI->getType())) 4539 return TransformType(DI); 4540 4541 // Refine the base location to the type's location. 4542 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4543 getDerived().getBaseEntity()); 4544 if (getDerived().AlreadyTransformed(DI->getType())) 4545 return DI; 4546 4547 TypeLocBuilder TLB; 4548 4549 TypeLoc TL = DI->getTypeLoc(); 4550 TLB.reserve(TL.getFullDataSize()); 4551 4552 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4553 if (QTL) 4554 TL = QTL.getUnqualifiedLoc(); 4555 4556 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4557 4558 QualType Result = getDerived().TransformDependentNameType( 4559 TLB, DNTL, /*DeducedTSTContext*/true); 4560 if (Result.isNull()) 4561 return nullptr; 4562 4563 if (QTL) { 4564 Result = getDerived().RebuildQualifiedType(Result, QTL); 4565 if (Result.isNull()) 4566 return nullptr; 4567 TLB.TypeWasModifiedSafely(Result); 4568 } 4569 4570 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4571 } 4572 4573 template<typename Derived> 4574 QualType 4575 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4576 QualifiedTypeLoc T) { 4577 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4578 if (Result.isNull()) 4579 return QualType(); 4580 4581 Result = getDerived().RebuildQualifiedType(Result, T); 4582 4583 if (Result.isNull()) 4584 return QualType(); 4585 4586 // RebuildQualifiedType might have updated the type, but not in a way 4587 // that invalidates the TypeLoc. (There's no location information for 4588 // qualifiers.) 4589 TLB.TypeWasModifiedSafely(Result); 4590 4591 return Result; 4592 } 4593 4594 template <typename Derived> 4595 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4596 QualifiedTypeLoc TL) { 4597 4598 SourceLocation Loc = TL.getBeginLoc(); 4599 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4600 4601 if (((T.getAddressSpace() != LangAS::Default && 4602 Quals.getAddressSpace() != LangAS::Default)) && 4603 T.getAddressSpace() != Quals.getAddressSpace()) { 4604 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4605 << TL.getType() << T; 4606 return QualType(); 4607 } 4608 4609 // C++ [dcl.fct]p7: 4610 // [When] adding cv-qualifications on top of the function type [...] the 4611 // cv-qualifiers are ignored. 4612 if (T->isFunctionType()) { 4613 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4614 Quals.getAddressSpace()); 4615 return T; 4616 } 4617 4618 // C++ [dcl.ref]p1: 4619 // when the cv-qualifiers are introduced through the use of a typedef-name 4620 // or decltype-specifier [...] the cv-qualifiers are ignored. 4621 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4622 // applied to a reference type. 4623 if (T->isReferenceType()) { 4624 // The only qualifier that applies to a reference type is restrict. 4625 if (!Quals.hasRestrict()) 4626 return T; 4627 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4628 } 4629 4630 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4631 // resulting type. 4632 if (Quals.hasObjCLifetime()) { 4633 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4634 Quals.removeObjCLifetime(); 4635 else if (T.getObjCLifetime()) { 4636 // Objective-C ARC: 4637 // A lifetime qualifier applied to a substituted template parameter 4638 // overrides the lifetime qualifier from the template argument. 4639 const AutoType *AutoTy; 4640 if (const SubstTemplateTypeParmType *SubstTypeParam 4641 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4642 QualType Replacement = SubstTypeParam->getReplacementType(); 4643 Qualifiers Qs = Replacement.getQualifiers(); 4644 Qs.removeObjCLifetime(); 4645 Replacement = SemaRef.Context.getQualifiedType( 4646 Replacement.getUnqualifiedType(), Qs); 4647 T = SemaRef.Context.getSubstTemplateTypeParmType( 4648 SubstTypeParam->getReplacedParameter(), Replacement); 4649 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4650 // 'auto' types behave the same way as template parameters. 4651 QualType Deduced = AutoTy->getDeducedType(); 4652 Qualifiers Qs = Deduced.getQualifiers(); 4653 Qs.removeObjCLifetime(); 4654 Deduced = 4655 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4656 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4657 AutoTy->isDependentType(), 4658 /*isPack=*/false, 4659 AutoTy->getTypeConstraintConcept(), 4660 AutoTy->getTypeConstraintArguments()); 4661 } else { 4662 // Otherwise, complain about the addition of a qualifier to an 4663 // already-qualified type. 4664 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4665 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4666 Quals.removeObjCLifetime(); 4667 } 4668 } 4669 } 4670 4671 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4672 } 4673 4674 template<typename Derived> 4675 TypeLoc 4676 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4677 QualType ObjectType, 4678 NamedDecl *UnqualLookup, 4679 CXXScopeSpec &SS) { 4680 if (getDerived().AlreadyTransformed(TL.getType())) 4681 return TL; 4682 4683 TypeSourceInfo *TSI = 4684 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4685 if (TSI) 4686 return TSI->getTypeLoc(); 4687 return TypeLoc(); 4688 } 4689 4690 template<typename Derived> 4691 TypeSourceInfo * 4692 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4693 QualType ObjectType, 4694 NamedDecl *UnqualLookup, 4695 CXXScopeSpec &SS) { 4696 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4697 return TSInfo; 4698 4699 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4700 UnqualLookup, SS); 4701 } 4702 4703 template <typename Derived> 4704 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4705 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4706 CXXScopeSpec &SS) { 4707 QualType T = TL.getType(); 4708 assert(!getDerived().AlreadyTransformed(T)); 4709 4710 TypeLocBuilder TLB; 4711 QualType Result; 4712 4713 if (isa<TemplateSpecializationType>(T)) { 4714 TemplateSpecializationTypeLoc SpecTL = 4715 TL.castAs<TemplateSpecializationTypeLoc>(); 4716 4717 TemplateName Template = getDerived().TransformTemplateName( 4718 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4719 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4720 if (Template.isNull()) 4721 return nullptr; 4722 4723 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4724 Template); 4725 } else if (isa<DependentTemplateSpecializationType>(T)) { 4726 DependentTemplateSpecializationTypeLoc SpecTL = 4727 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4728 4729 TemplateName Template 4730 = getDerived().RebuildTemplateName(SS, 4731 SpecTL.getTemplateKeywordLoc(), 4732 *SpecTL.getTypePtr()->getIdentifier(), 4733 SpecTL.getTemplateNameLoc(), 4734 ObjectType, UnqualLookup, 4735 /*AllowInjectedClassName*/true); 4736 if (Template.isNull()) 4737 return nullptr; 4738 4739 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4740 SpecTL, 4741 Template, 4742 SS); 4743 } else { 4744 // Nothing special needs to be done for these. 4745 Result = getDerived().TransformType(TLB, TL); 4746 } 4747 4748 if (Result.isNull()) 4749 return nullptr; 4750 4751 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4752 } 4753 4754 template <class TyLoc> static inline 4755 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4756 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4757 NewT.setNameLoc(T.getNameLoc()); 4758 return T.getType(); 4759 } 4760 4761 template<typename Derived> 4762 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4763 BuiltinTypeLoc T) { 4764 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4765 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4766 if (T.needsExtraLocalData()) 4767 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4768 return T.getType(); 4769 } 4770 4771 template<typename Derived> 4772 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4773 ComplexTypeLoc T) { 4774 // FIXME: recurse? 4775 return TransformTypeSpecType(TLB, T); 4776 } 4777 4778 template <typename Derived> 4779 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4780 AdjustedTypeLoc TL) { 4781 // Adjustments applied during transformation are handled elsewhere. 4782 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4783 } 4784 4785 template<typename Derived> 4786 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4787 DecayedTypeLoc TL) { 4788 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4789 if (OriginalType.isNull()) 4790 return QualType(); 4791 4792 QualType Result = TL.getType(); 4793 if (getDerived().AlwaysRebuild() || 4794 OriginalType != TL.getOriginalLoc().getType()) 4795 Result = SemaRef.Context.getDecayedType(OriginalType); 4796 TLB.push<DecayedTypeLoc>(Result); 4797 // Nothing to set for DecayedTypeLoc. 4798 return Result; 4799 } 4800 4801 template<typename Derived> 4802 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4803 PointerTypeLoc TL) { 4804 QualType PointeeType 4805 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4806 if (PointeeType.isNull()) 4807 return QualType(); 4808 4809 QualType Result = TL.getType(); 4810 if (PointeeType->getAs<ObjCObjectType>()) { 4811 // A dependent pointer type 'T *' has is being transformed such 4812 // that an Objective-C class type is being replaced for 'T'. The 4813 // resulting pointer type is an ObjCObjectPointerType, not a 4814 // PointerType. 4815 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4816 4817 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4818 NewT.setStarLoc(TL.getStarLoc()); 4819 return Result; 4820 } 4821 4822 if (getDerived().AlwaysRebuild() || 4823 PointeeType != TL.getPointeeLoc().getType()) { 4824 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4825 if (Result.isNull()) 4826 return QualType(); 4827 } 4828 4829 // Objective-C ARC can add lifetime qualifiers to the type that we're 4830 // pointing to. 4831 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4832 4833 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4834 NewT.setSigilLoc(TL.getSigilLoc()); 4835 return Result; 4836 } 4837 4838 template<typename Derived> 4839 QualType 4840 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4841 BlockPointerTypeLoc TL) { 4842 QualType PointeeType 4843 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4844 if (PointeeType.isNull()) 4845 return QualType(); 4846 4847 QualType Result = TL.getType(); 4848 if (getDerived().AlwaysRebuild() || 4849 PointeeType != TL.getPointeeLoc().getType()) { 4850 Result = getDerived().RebuildBlockPointerType(PointeeType, 4851 TL.getSigilLoc()); 4852 if (Result.isNull()) 4853 return QualType(); 4854 } 4855 4856 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4857 NewT.setSigilLoc(TL.getSigilLoc()); 4858 return Result; 4859 } 4860 4861 /// Transforms a reference type. Note that somewhat paradoxically we 4862 /// don't care whether the type itself is an l-value type or an r-value 4863 /// type; we only care if the type was *written* as an l-value type 4864 /// or an r-value type. 4865 template<typename Derived> 4866 QualType 4867 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4868 ReferenceTypeLoc TL) { 4869 const ReferenceType *T = TL.getTypePtr(); 4870 4871 // Note that this works with the pointee-as-written. 4872 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4873 if (PointeeType.isNull()) 4874 return QualType(); 4875 4876 QualType Result = TL.getType(); 4877 if (getDerived().AlwaysRebuild() || 4878 PointeeType != T->getPointeeTypeAsWritten()) { 4879 Result = getDerived().RebuildReferenceType(PointeeType, 4880 T->isSpelledAsLValue(), 4881 TL.getSigilLoc()); 4882 if (Result.isNull()) 4883 return QualType(); 4884 } 4885 4886 // Objective-C ARC can add lifetime qualifiers to the type that we're 4887 // referring to. 4888 TLB.TypeWasModifiedSafely( 4889 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4890 4891 // r-value references can be rebuilt as l-value references. 4892 ReferenceTypeLoc NewTL; 4893 if (isa<LValueReferenceType>(Result)) 4894 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4895 else 4896 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4897 NewTL.setSigilLoc(TL.getSigilLoc()); 4898 4899 return Result; 4900 } 4901 4902 template<typename Derived> 4903 QualType 4904 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4905 LValueReferenceTypeLoc TL) { 4906 return TransformReferenceType(TLB, TL); 4907 } 4908 4909 template<typename Derived> 4910 QualType 4911 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4912 RValueReferenceTypeLoc TL) { 4913 return TransformReferenceType(TLB, TL); 4914 } 4915 4916 template<typename Derived> 4917 QualType 4918 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4919 MemberPointerTypeLoc TL) { 4920 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4921 if (PointeeType.isNull()) 4922 return QualType(); 4923 4924 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4925 TypeSourceInfo *NewClsTInfo = nullptr; 4926 if (OldClsTInfo) { 4927 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4928 if (!NewClsTInfo) 4929 return QualType(); 4930 } 4931 4932 const MemberPointerType *T = TL.getTypePtr(); 4933 QualType OldClsType = QualType(T->getClass(), 0); 4934 QualType NewClsType; 4935 if (NewClsTInfo) 4936 NewClsType = NewClsTInfo->getType(); 4937 else { 4938 NewClsType = getDerived().TransformType(OldClsType); 4939 if (NewClsType.isNull()) 4940 return QualType(); 4941 } 4942 4943 QualType Result = TL.getType(); 4944 if (getDerived().AlwaysRebuild() || 4945 PointeeType != T->getPointeeType() || 4946 NewClsType != OldClsType) { 4947 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4948 TL.getStarLoc()); 4949 if (Result.isNull()) 4950 return QualType(); 4951 } 4952 4953 // If we had to adjust the pointee type when building a member pointer, make 4954 // sure to push TypeLoc info for it. 4955 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4956 if (MPT && PointeeType != MPT->getPointeeType()) { 4957 assert(isa<AdjustedType>(MPT->getPointeeType())); 4958 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4959 } 4960 4961 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4962 NewTL.setSigilLoc(TL.getSigilLoc()); 4963 NewTL.setClassTInfo(NewClsTInfo); 4964 4965 return Result; 4966 } 4967 4968 template<typename Derived> 4969 QualType 4970 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4971 ConstantArrayTypeLoc TL) { 4972 const ConstantArrayType *T = TL.getTypePtr(); 4973 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4974 if (ElementType.isNull()) 4975 return QualType(); 4976 4977 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4978 Expr *OldSize = TL.getSizeExpr(); 4979 if (!OldSize) 4980 OldSize = const_cast<Expr*>(T->getSizeExpr()); 4981 Expr *NewSize = nullptr; 4982 if (OldSize) { 4983 EnterExpressionEvaluationContext Unevaluated( 4984 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4985 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 4986 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 4987 } 4988 4989 QualType Result = TL.getType(); 4990 if (getDerived().AlwaysRebuild() || 4991 ElementType != T->getElementType() || 4992 (T->getSizeExpr() && NewSize != OldSize)) { 4993 Result = getDerived().RebuildConstantArrayType(ElementType, 4994 T->getSizeModifier(), 4995 T->getSize(), NewSize, 4996 T->getIndexTypeCVRQualifiers(), 4997 TL.getBracketsRange()); 4998 if (Result.isNull()) 4999 return QualType(); 5000 } 5001 5002 // We might have either a ConstantArrayType or a VariableArrayType now: 5003 // a ConstantArrayType is allowed to have an element type which is a 5004 // VariableArrayType if the type is dependent. Fortunately, all array 5005 // types have the same location layout. 5006 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5007 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5008 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5009 NewTL.setSizeExpr(NewSize); 5010 5011 return Result; 5012 } 5013 5014 template<typename Derived> 5015 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5016 TypeLocBuilder &TLB, 5017 IncompleteArrayTypeLoc TL) { 5018 const IncompleteArrayType *T = TL.getTypePtr(); 5019 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5020 if (ElementType.isNull()) 5021 return QualType(); 5022 5023 QualType Result = TL.getType(); 5024 if (getDerived().AlwaysRebuild() || 5025 ElementType != T->getElementType()) { 5026 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5027 T->getSizeModifier(), 5028 T->getIndexTypeCVRQualifiers(), 5029 TL.getBracketsRange()); 5030 if (Result.isNull()) 5031 return QualType(); 5032 } 5033 5034 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5035 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5036 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5037 NewTL.setSizeExpr(nullptr); 5038 5039 return Result; 5040 } 5041 5042 template<typename Derived> 5043 QualType 5044 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5045 VariableArrayTypeLoc TL) { 5046 const VariableArrayType *T = TL.getTypePtr(); 5047 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5048 if (ElementType.isNull()) 5049 return QualType(); 5050 5051 ExprResult SizeResult; 5052 { 5053 EnterExpressionEvaluationContext Context( 5054 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5055 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5056 } 5057 if (SizeResult.isInvalid()) 5058 return QualType(); 5059 SizeResult = 5060 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5061 if (SizeResult.isInvalid()) 5062 return QualType(); 5063 5064 Expr *Size = SizeResult.get(); 5065 5066 QualType Result = TL.getType(); 5067 if (getDerived().AlwaysRebuild() || 5068 ElementType != T->getElementType() || 5069 Size != T->getSizeExpr()) { 5070 Result = getDerived().RebuildVariableArrayType(ElementType, 5071 T->getSizeModifier(), 5072 Size, 5073 T->getIndexTypeCVRQualifiers(), 5074 TL.getBracketsRange()); 5075 if (Result.isNull()) 5076 return QualType(); 5077 } 5078 5079 // We might have constant size array now, but fortunately it has the same 5080 // location layout. 5081 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5082 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5083 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5084 NewTL.setSizeExpr(Size); 5085 5086 return Result; 5087 } 5088 5089 template<typename Derived> 5090 QualType 5091 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5092 DependentSizedArrayTypeLoc TL) { 5093 const DependentSizedArrayType *T = TL.getTypePtr(); 5094 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5095 if (ElementType.isNull()) 5096 return QualType(); 5097 5098 // Array bounds are constant expressions. 5099 EnterExpressionEvaluationContext Unevaluated( 5100 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5101 5102 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5103 Expr *origSize = TL.getSizeExpr(); 5104 if (!origSize) origSize = T->getSizeExpr(); 5105 5106 ExprResult sizeResult 5107 = getDerived().TransformExpr(origSize); 5108 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5109 if (sizeResult.isInvalid()) 5110 return QualType(); 5111 5112 Expr *size = sizeResult.get(); 5113 5114 QualType Result = TL.getType(); 5115 if (getDerived().AlwaysRebuild() || 5116 ElementType != T->getElementType() || 5117 size != origSize) { 5118 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5119 T->getSizeModifier(), 5120 size, 5121 T->getIndexTypeCVRQualifiers(), 5122 TL.getBracketsRange()); 5123 if (Result.isNull()) 5124 return QualType(); 5125 } 5126 5127 // We might have any sort of array type now, but fortunately they 5128 // all have the same location layout. 5129 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5130 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5131 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5132 NewTL.setSizeExpr(size); 5133 5134 return Result; 5135 } 5136 5137 template <typename Derived> 5138 QualType TreeTransform<Derived>::TransformDependentVectorType( 5139 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5140 const DependentVectorType *T = TL.getTypePtr(); 5141 QualType ElementType = getDerived().TransformType(T->getElementType()); 5142 if (ElementType.isNull()) 5143 return QualType(); 5144 5145 EnterExpressionEvaluationContext Unevaluated( 5146 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5147 5148 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5149 Size = SemaRef.ActOnConstantExpression(Size); 5150 if (Size.isInvalid()) 5151 return QualType(); 5152 5153 QualType Result = TL.getType(); 5154 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5155 Size.get() != T->getSizeExpr()) { 5156 Result = getDerived().RebuildDependentVectorType( 5157 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5158 if (Result.isNull()) 5159 return QualType(); 5160 } 5161 5162 // Result might be dependent or not. 5163 if (isa<DependentVectorType>(Result)) { 5164 DependentVectorTypeLoc NewTL = 5165 TLB.push<DependentVectorTypeLoc>(Result); 5166 NewTL.setNameLoc(TL.getNameLoc()); 5167 } else { 5168 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5169 NewTL.setNameLoc(TL.getNameLoc()); 5170 } 5171 5172 return Result; 5173 } 5174 5175 template<typename Derived> 5176 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5177 TypeLocBuilder &TLB, 5178 DependentSizedExtVectorTypeLoc TL) { 5179 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5180 5181 // FIXME: ext vector locs should be nested 5182 QualType ElementType = getDerived().TransformType(T->getElementType()); 5183 if (ElementType.isNull()) 5184 return QualType(); 5185 5186 // Vector sizes are constant expressions. 5187 EnterExpressionEvaluationContext Unevaluated( 5188 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5189 5190 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5191 Size = SemaRef.ActOnConstantExpression(Size); 5192 if (Size.isInvalid()) 5193 return QualType(); 5194 5195 QualType Result = TL.getType(); 5196 if (getDerived().AlwaysRebuild() || 5197 ElementType != T->getElementType() || 5198 Size.get() != T->getSizeExpr()) { 5199 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5200 Size.get(), 5201 T->getAttributeLoc()); 5202 if (Result.isNull()) 5203 return QualType(); 5204 } 5205 5206 // Result might be dependent or not. 5207 if (isa<DependentSizedExtVectorType>(Result)) { 5208 DependentSizedExtVectorTypeLoc NewTL 5209 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5210 NewTL.setNameLoc(TL.getNameLoc()); 5211 } else { 5212 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5213 NewTL.setNameLoc(TL.getNameLoc()); 5214 } 5215 5216 return Result; 5217 } 5218 5219 template <typename Derived> 5220 QualType 5221 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5222 ConstantMatrixTypeLoc TL) { 5223 const ConstantMatrixType *T = TL.getTypePtr(); 5224 QualType ElementType = getDerived().TransformType(T->getElementType()); 5225 if (ElementType.isNull()) 5226 return QualType(); 5227 5228 QualType Result = TL.getType(); 5229 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5230 Result = getDerived().RebuildConstantMatrixType( 5231 ElementType, T->getNumRows(), T->getNumColumns()); 5232 if (Result.isNull()) 5233 return QualType(); 5234 } 5235 5236 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5237 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5238 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5239 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5240 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5241 5242 return Result; 5243 } 5244 5245 template <typename Derived> 5246 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5247 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5248 const DependentSizedMatrixType *T = TL.getTypePtr(); 5249 5250 QualType ElementType = getDerived().TransformType(T->getElementType()); 5251 if (ElementType.isNull()) { 5252 return QualType(); 5253 } 5254 5255 // Matrix dimensions are constant expressions. 5256 EnterExpressionEvaluationContext Unevaluated( 5257 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5258 5259 Expr *origRows = TL.getAttrRowOperand(); 5260 if (!origRows) 5261 origRows = T->getRowExpr(); 5262 Expr *origColumns = TL.getAttrColumnOperand(); 5263 if (!origColumns) 5264 origColumns = T->getColumnExpr(); 5265 5266 ExprResult rowResult = getDerived().TransformExpr(origRows); 5267 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5268 if (rowResult.isInvalid()) 5269 return QualType(); 5270 5271 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5272 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5273 if (columnResult.isInvalid()) 5274 return QualType(); 5275 5276 Expr *rows = rowResult.get(); 5277 Expr *columns = columnResult.get(); 5278 5279 QualType Result = TL.getType(); 5280 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5281 rows != origRows || columns != origColumns) { 5282 Result = getDerived().RebuildDependentSizedMatrixType( 5283 ElementType, rows, columns, T->getAttributeLoc()); 5284 5285 if (Result.isNull()) 5286 return QualType(); 5287 } 5288 5289 // We might have any sort of matrix type now, but fortunately they 5290 // all have the same location layout. 5291 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5292 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5293 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5294 NewTL.setAttrRowOperand(rows); 5295 NewTL.setAttrColumnOperand(columns); 5296 return Result; 5297 } 5298 5299 template <typename Derived> 5300 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5301 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5302 const DependentAddressSpaceType *T = TL.getTypePtr(); 5303 5304 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5305 5306 if (pointeeType.isNull()) 5307 return QualType(); 5308 5309 // Address spaces are constant expressions. 5310 EnterExpressionEvaluationContext Unevaluated( 5311 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5312 5313 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5314 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5315 if (AddrSpace.isInvalid()) 5316 return QualType(); 5317 5318 QualType Result = TL.getType(); 5319 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5320 AddrSpace.get() != T->getAddrSpaceExpr()) { 5321 Result = getDerived().RebuildDependentAddressSpaceType( 5322 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5323 if (Result.isNull()) 5324 return QualType(); 5325 } 5326 5327 // Result might be dependent or not. 5328 if (isa<DependentAddressSpaceType>(Result)) { 5329 DependentAddressSpaceTypeLoc NewTL = 5330 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5331 5332 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5333 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5334 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5335 5336 } else { 5337 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5338 Result, getDerived().getBaseLocation()); 5339 TransformType(TLB, DI->getTypeLoc()); 5340 } 5341 5342 return Result; 5343 } 5344 5345 template <typename Derived> 5346 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5347 VectorTypeLoc TL) { 5348 const VectorType *T = TL.getTypePtr(); 5349 QualType ElementType = getDerived().TransformType(T->getElementType()); 5350 if (ElementType.isNull()) 5351 return QualType(); 5352 5353 QualType Result = TL.getType(); 5354 if (getDerived().AlwaysRebuild() || 5355 ElementType != T->getElementType()) { 5356 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5357 T->getVectorKind()); 5358 if (Result.isNull()) 5359 return QualType(); 5360 } 5361 5362 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5363 NewTL.setNameLoc(TL.getNameLoc()); 5364 5365 return Result; 5366 } 5367 5368 template<typename Derived> 5369 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5370 ExtVectorTypeLoc TL) { 5371 const VectorType *T = TL.getTypePtr(); 5372 QualType ElementType = getDerived().TransformType(T->getElementType()); 5373 if (ElementType.isNull()) 5374 return QualType(); 5375 5376 QualType Result = TL.getType(); 5377 if (getDerived().AlwaysRebuild() || 5378 ElementType != T->getElementType()) { 5379 Result = getDerived().RebuildExtVectorType(ElementType, 5380 T->getNumElements(), 5381 /*FIXME*/ SourceLocation()); 5382 if (Result.isNull()) 5383 return QualType(); 5384 } 5385 5386 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5387 NewTL.setNameLoc(TL.getNameLoc()); 5388 5389 return Result; 5390 } 5391 5392 template <typename Derived> 5393 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5394 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5395 bool ExpectParameterPack) { 5396 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5397 TypeSourceInfo *NewDI = nullptr; 5398 5399 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5400 // If we're substituting into a pack expansion type and we know the 5401 // length we want to expand to, just substitute for the pattern. 5402 TypeLoc OldTL = OldDI->getTypeLoc(); 5403 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5404 5405 TypeLocBuilder TLB; 5406 TypeLoc NewTL = OldDI->getTypeLoc(); 5407 TLB.reserve(NewTL.getFullDataSize()); 5408 5409 QualType Result = getDerived().TransformType(TLB, 5410 OldExpansionTL.getPatternLoc()); 5411 if (Result.isNull()) 5412 return nullptr; 5413 5414 Result = RebuildPackExpansionType(Result, 5415 OldExpansionTL.getPatternLoc().getSourceRange(), 5416 OldExpansionTL.getEllipsisLoc(), 5417 NumExpansions); 5418 if (Result.isNull()) 5419 return nullptr; 5420 5421 PackExpansionTypeLoc NewExpansionTL 5422 = TLB.push<PackExpansionTypeLoc>(Result); 5423 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5424 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5425 } else 5426 NewDI = getDerived().TransformType(OldDI); 5427 if (!NewDI) 5428 return nullptr; 5429 5430 if (NewDI == OldDI && indexAdjustment == 0) 5431 return OldParm; 5432 5433 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5434 OldParm->getDeclContext(), 5435 OldParm->getInnerLocStart(), 5436 OldParm->getLocation(), 5437 OldParm->getIdentifier(), 5438 NewDI->getType(), 5439 NewDI, 5440 OldParm->getStorageClass(), 5441 /* DefArg */ nullptr); 5442 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5443 OldParm->getFunctionScopeIndex() + indexAdjustment); 5444 return newParm; 5445 } 5446 5447 template <typename Derived> 5448 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5449 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5450 const QualType *ParamTypes, 5451 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5452 SmallVectorImpl<QualType> &OutParamTypes, 5453 SmallVectorImpl<ParmVarDecl *> *PVars, 5454 Sema::ExtParameterInfoBuilder &PInfos) { 5455 int indexAdjustment = 0; 5456 5457 unsigned NumParams = Params.size(); 5458 for (unsigned i = 0; i != NumParams; ++i) { 5459 if (ParmVarDecl *OldParm = Params[i]) { 5460 assert(OldParm->getFunctionScopeIndex() == i); 5461 5462 Optional<unsigned> NumExpansions; 5463 ParmVarDecl *NewParm = nullptr; 5464 if (OldParm->isParameterPack()) { 5465 // We have a function parameter pack that may need to be expanded. 5466 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5467 5468 // Find the parameter packs that could be expanded. 5469 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5470 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5471 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5472 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5473 5474 // Determine whether we should expand the parameter packs. 5475 bool ShouldExpand = false; 5476 bool RetainExpansion = false; 5477 Optional<unsigned> OrigNumExpansions; 5478 if (Unexpanded.size() > 0) { 5479 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5480 NumExpansions = OrigNumExpansions; 5481 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5482 Pattern.getSourceRange(), 5483 Unexpanded, 5484 ShouldExpand, 5485 RetainExpansion, 5486 NumExpansions)) { 5487 return true; 5488 } 5489 } else { 5490 #ifndef NDEBUG 5491 const AutoType *AT = 5492 Pattern.getType().getTypePtr()->getContainedAutoType(); 5493 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5494 "Could not find parameter packs or undeduced auto type!"); 5495 #endif 5496 } 5497 5498 if (ShouldExpand) { 5499 // Expand the function parameter pack into multiple, separate 5500 // parameters. 5501 getDerived().ExpandingFunctionParameterPack(OldParm); 5502 for (unsigned I = 0; I != *NumExpansions; ++I) { 5503 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5504 ParmVarDecl *NewParm 5505 = getDerived().TransformFunctionTypeParam(OldParm, 5506 indexAdjustment++, 5507 OrigNumExpansions, 5508 /*ExpectParameterPack=*/false); 5509 if (!NewParm) 5510 return true; 5511 5512 if (ParamInfos) 5513 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5514 OutParamTypes.push_back(NewParm->getType()); 5515 if (PVars) 5516 PVars->push_back(NewParm); 5517 } 5518 5519 // If we're supposed to retain a pack expansion, do so by temporarily 5520 // forgetting the partially-substituted parameter pack. 5521 if (RetainExpansion) { 5522 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5523 ParmVarDecl *NewParm 5524 = getDerived().TransformFunctionTypeParam(OldParm, 5525 indexAdjustment++, 5526 OrigNumExpansions, 5527 /*ExpectParameterPack=*/false); 5528 if (!NewParm) 5529 return true; 5530 5531 if (ParamInfos) 5532 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5533 OutParamTypes.push_back(NewParm->getType()); 5534 if (PVars) 5535 PVars->push_back(NewParm); 5536 } 5537 5538 // The next parameter should have the same adjustment as the 5539 // last thing we pushed, but we post-incremented indexAdjustment 5540 // on every push. Also, if we push nothing, the adjustment should 5541 // go down by one. 5542 indexAdjustment--; 5543 5544 // We're done with the pack expansion. 5545 continue; 5546 } 5547 5548 // We'll substitute the parameter now without expanding the pack 5549 // expansion. 5550 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5551 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5552 indexAdjustment, 5553 NumExpansions, 5554 /*ExpectParameterPack=*/true); 5555 assert(NewParm->isParameterPack() && 5556 "Parameter pack no longer a parameter pack after " 5557 "transformation."); 5558 } else { 5559 NewParm = getDerived().TransformFunctionTypeParam( 5560 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5561 } 5562 5563 if (!NewParm) 5564 return true; 5565 5566 if (ParamInfos) 5567 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5568 OutParamTypes.push_back(NewParm->getType()); 5569 if (PVars) 5570 PVars->push_back(NewParm); 5571 continue; 5572 } 5573 5574 // Deal with the possibility that we don't have a parameter 5575 // declaration for this parameter. 5576 QualType OldType = ParamTypes[i]; 5577 bool IsPackExpansion = false; 5578 Optional<unsigned> NumExpansions; 5579 QualType NewType; 5580 if (const PackExpansionType *Expansion 5581 = dyn_cast<PackExpansionType>(OldType)) { 5582 // We have a function parameter pack that may need to be expanded. 5583 QualType Pattern = Expansion->getPattern(); 5584 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5585 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5586 5587 // Determine whether we should expand the parameter packs. 5588 bool ShouldExpand = false; 5589 bool RetainExpansion = false; 5590 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5591 Unexpanded, 5592 ShouldExpand, 5593 RetainExpansion, 5594 NumExpansions)) { 5595 return true; 5596 } 5597 5598 if (ShouldExpand) { 5599 // Expand the function parameter pack into multiple, separate 5600 // parameters. 5601 for (unsigned I = 0; I != *NumExpansions; ++I) { 5602 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5603 QualType NewType = getDerived().TransformType(Pattern); 5604 if (NewType.isNull()) 5605 return true; 5606 5607 if (NewType->containsUnexpandedParameterPack()) { 5608 NewType = 5609 getSema().getASTContext().getPackExpansionType(NewType, None); 5610 5611 if (NewType.isNull()) 5612 return true; 5613 } 5614 5615 if (ParamInfos) 5616 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5617 OutParamTypes.push_back(NewType); 5618 if (PVars) 5619 PVars->push_back(nullptr); 5620 } 5621 5622 // We're done with the pack expansion. 5623 continue; 5624 } 5625 5626 // If we're supposed to retain a pack expansion, do so by temporarily 5627 // forgetting the partially-substituted parameter pack. 5628 if (RetainExpansion) { 5629 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5630 QualType NewType = getDerived().TransformType(Pattern); 5631 if (NewType.isNull()) 5632 return true; 5633 5634 if (ParamInfos) 5635 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5636 OutParamTypes.push_back(NewType); 5637 if (PVars) 5638 PVars->push_back(nullptr); 5639 } 5640 5641 // We'll substitute the parameter now without expanding the pack 5642 // expansion. 5643 OldType = Expansion->getPattern(); 5644 IsPackExpansion = true; 5645 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5646 NewType = getDerived().TransformType(OldType); 5647 } else { 5648 NewType = getDerived().TransformType(OldType); 5649 } 5650 5651 if (NewType.isNull()) 5652 return true; 5653 5654 if (IsPackExpansion) 5655 NewType = getSema().Context.getPackExpansionType(NewType, 5656 NumExpansions); 5657 5658 if (ParamInfos) 5659 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5660 OutParamTypes.push_back(NewType); 5661 if (PVars) 5662 PVars->push_back(nullptr); 5663 } 5664 5665 #ifndef NDEBUG 5666 if (PVars) { 5667 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5668 if (ParmVarDecl *parm = (*PVars)[i]) 5669 assert(parm->getFunctionScopeIndex() == i); 5670 } 5671 #endif 5672 5673 return false; 5674 } 5675 5676 template<typename Derived> 5677 QualType 5678 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5679 FunctionProtoTypeLoc TL) { 5680 SmallVector<QualType, 4> ExceptionStorage; 5681 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5682 return getDerived().TransformFunctionProtoType( 5683 TLB, TL, nullptr, Qualifiers(), 5684 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5685 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5686 ExceptionStorage, Changed); 5687 }); 5688 } 5689 5690 template<typename Derived> template<typename Fn> 5691 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5692 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5693 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5694 5695 // Transform the parameters and return type. 5696 // 5697 // We are required to instantiate the params and return type in source order. 5698 // When the function has a trailing return type, we instantiate the 5699 // parameters before the return type, since the return type can then refer 5700 // to the parameters themselves (via decltype, sizeof, etc.). 5701 // 5702 SmallVector<QualType, 4> ParamTypes; 5703 SmallVector<ParmVarDecl*, 4> ParamDecls; 5704 Sema::ExtParameterInfoBuilder ExtParamInfos; 5705 const FunctionProtoType *T = TL.getTypePtr(); 5706 5707 QualType ResultType; 5708 5709 if (T->hasTrailingReturn()) { 5710 if (getDerived().TransformFunctionTypeParams( 5711 TL.getBeginLoc(), TL.getParams(), 5712 TL.getTypePtr()->param_type_begin(), 5713 T->getExtParameterInfosOrNull(), 5714 ParamTypes, &ParamDecls, ExtParamInfos)) 5715 return QualType(); 5716 5717 { 5718 // C++11 [expr.prim.general]p3: 5719 // If a declaration declares a member function or member function 5720 // template of a class X, the expression this is a prvalue of type 5721 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5722 // and the end of the function-definition, member-declarator, or 5723 // declarator. 5724 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5725 5726 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5727 if (ResultType.isNull()) 5728 return QualType(); 5729 } 5730 } 5731 else { 5732 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5733 if (ResultType.isNull()) 5734 return QualType(); 5735 5736 if (getDerived().TransformFunctionTypeParams( 5737 TL.getBeginLoc(), TL.getParams(), 5738 TL.getTypePtr()->param_type_begin(), 5739 T->getExtParameterInfosOrNull(), 5740 ParamTypes, &ParamDecls, ExtParamInfos)) 5741 return QualType(); 5742 } 5743 5744 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5745 5746 bool EPIChanged = false; 5747 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5748 return QualType(); 5749 5750 // Handle extended parameter information. 5751 if (auto NewExtParamInfos = 5752 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5753 if (!EPI.ExtParameterInfos || 5754 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5755 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5756 EPIChanged = true; 5757 } 5758 EPI.ExtParameterInfos = NewExtParamInfos; 5759 } else if (EPI.ExtParameterInfos) { 5760 EPIChanged = true; 5761 EPI.ExtParameterInfos = nullptr; 5762 } 5763 5764 QualType Result = TL.getType(); 5765 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5766 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5767 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5768 if (Result.isNull()) 5769 return QualType(); 5770 } 5771 5772 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5773 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5774 NewTL.setLParenLoc(TL.getLParenLoc()); 5775 NewTL.setRParenLoc(TL.getRParenLoc()); 5776 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5777 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5778 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5779 NewTL.setParam(i, ParamDecls[i]); 5780 5781 return Result; 5782 } 5783 5784 template<typename Derived> 5785 bool TreeTransform<Derived>::TransformExceptionSpec( 5786 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5787 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5788 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5789 5790 // Instantiate a dynamic noexcept expression, if any. 5791 if (isComputedNoexcept(ESI.Type)) { 5792 EnterExpressionEvaluationContext Unevaluated( 5793 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5794 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5795 if (NoexceptExpr.isInvalid()) 5796 return true; 5797 5798 ExceptionSpecificationType EST = ESI.Type; 5799 NoexceptExpr = 5800 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5801 if (NoexceptExpr.isInvalid()) 5802 return true; 5803 5804 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5805 Changed = true; 5806 ESI.NoexceptExpr = NoexceptExpr.get(); 5807 ESI.Type = EST; 5808 } 5809 5810 if (ESI.Type != EST_Dynamic) 5811 return false; 5812 5813 // Instantiate a dynamic exception specification's type. 5814 for (QualType T : ESI.Exceptions) { 5815 if (const PackExpansionType *PackExpansion = 5816 T->getAs<PackExpansionType>()) { 5817 Changed = true; 5818 5819 // We have a pack expansion. Instantiate it. 5820 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5821 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5822 Unexpanded); 5823 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5824 5825 // Determine whether the set of unexpanded parameter packs can and 5826 // should 5827 // be expanded. 5828 bool Expand = false; 5829 bool RetainExpansion = false; 5830 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5831 // FIXME: Track the location of the ellipsis (and track source location 5832 // information for the types in the exception specification in general). 5833 if (getDerived().TryExpandParameterPacks( 5834 Loc, SourceRange(), Unexpanded, Expand, 5835 RetainExpansion, NumExpansions)) 5836 return true; 5837 5838 if (!Expand) { 5839 // We can't expand this pack expansion into separate arguments yet; 5840 // just substitute into the pattern and create a new pack expansion 5841 // type. 5842 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5843 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5844 if (U.isNull()) 5845 return true; 5846 5847 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5848 Exceptions.push_back(U); 5849 continue; 5850 } 5851 5852 // Substitute into the pack expansion pattern for each slice of the 5853 // pack. 5854 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5855 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5856 5857 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5858 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5859 return true; 5860 5861 Exceptions.push_back(U); 5862 } 5863 } else { 5864 QualType U = getDerived().TransformType(T); 5865 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5866 return true; 5867 if (T != U) 5868 Changed = true; 5869 5870 Exceptions.push_back(U); 5871 } 5872 } 5873 5874 ESI.Exceptions = Exceptions; 5875 if (ESI.Exceptions.empty()) 5876 ESI.Type = EST_DynamicNone; 5877 return false; 5878 } 5879 5880 template<typename Derived> 5881 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5882 TypeLocBuilder &TLB, 5883 FunctionNoProtoTypeLoc TL) { 5884 const FunctionNoProtoType *T = TL.getTypePtr(); 5885 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5886 if (ResultType.isNull()) 5887 return QualType(); 5888 5889 QualType Result = TL.getType(); 5890 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5891 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5892 5893 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5894 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5895 NewTL.setLParenLoc(TL.getLParenLoc()); 5896 NewTL.setRParenLoc(TL.getRParenLoc()); 5897 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5898 5899 return Result; 5900 } 5901 5902 template<typename Derived> QualType 5903 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5904 UnresolvedUsingTypeLoc TL) { 5905 const UnresolvedUsingType *T = TL.getTypePtr(); 5906 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5907 if (!D) 5908 return QualType(); 5909 5910 QualType Result = TL.getType(); 5911 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5912 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5913 if (Result.isNull()) 5914 return QualType(); 5915 } 5916 5917 // We might get an arbitrary type spec type back. We should at 5918 // least always get a type spec type, though. 5919 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5920 NewTL.setNameLoc(TL.getNameLoc()); 5921 5922 return Result; 5923 } 5924 5925 template<typename Derived> 5926 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5927 TypedefTypeLoc TL) { 5928 const TypedefType *T = TL.getTypePtr(); 5929 TypedefNameDecl *Typedef 5930 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5931 T->getDecl())); 5932 if (!Typedef) 5933 return QualType(); 5934 5935 QualType Result = TL.getType(); 5936 if (getDerived().AlwaysRebuild() || 5937 Typedef != T->getDecl()) { 5938 Result = getDerived().RebuildTypedefType(Typedef); 5939 if (Result.isNull()) 5940 return QualType(); 5941 } 5942 5943 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5944 NewTL.setNameLoc(TL.getNameLoc()); 5945 5946 return Result; 5947 } 5948 5949 template<typename Derived> 5950 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5951 TypeOfExprTypeLoc TL) { 5952 // typeof expressions are not potentially evaluated contexts 5953 EnterExpressionEvaluationContext Unevaluated( 5954 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5955 Sema::ReuseLambdaContextDecl); 5956 5957 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5958 if (E.isInvalid()) 5959 return QualType(); 5960 5961 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5962 if (E.isInvalid()) 5963 return QualType(); 5964 5965 QualType Result = TL.getType(); 5966 if (getDerived().AlwaysRebuild() || 5967 E.get() != TL.getUnderlyingExpr()) { 5968 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5969 if (Result.isNull()) 5970 return QualType(); 5971 } 5972 else E.get(); 5973 5974 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5975 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5976 NewTL.setLParenLoc(TL.getLParenLoc()); 5977 NewTL.setRParenLoc(TL.getRParenLoc()); 5978 5979 return Result; 5980 } 5981 5982 template<typename Derived> 5983 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5984 TypeOfTypeLoc TL) { 5985 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5986 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5987 if (!New_Under_TI) 5988 return QualType(); 5989 5990 QualType Result = TL.getType(); 5991 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5992 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5993 if (Result.isNull()) 5994 return QualType(); 5995 } 5996 5997 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5998 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5999 NewTL.setLParenLoc(TL.getLParenLoc()); 6000 NewTL.setRParenLoc(TL.getRParenLoc()); 6001 NewTL.setUnderlyingTInfo(New_Under_TI); 6002 6003 return Result; 6004 } 6005 6006 template<typename Derived> 6007 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6008 DecltypeTypeLoc TL) { 6009 const DecltypeType *T = TL.getTypePtr(); 6010 6011 // decltype expressions are not potentially evaluated contexts 6012 EnterExpressionEvaluationContext Unevaluated( 6013 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6014 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6015 6016 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6017 if (E.isInvalid()) 6018 return QualType(); 6019 6020 E = getSema().ActOnDecltypeExpression(E.get()); 6021 if (E.isInvalid()) 6022 return QualType(); 6023 6024 QualType Result = TL.getType(); 6025 if (getDerived().AlwaysRebuild() || 6026 E.get() != T->getUnderlyingExpr()) { 6027 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6028 if (Result.isNull()) 6029 return QualType(); 6030 } 6031 else E.get(); 6032 6033 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6034 NewTL.setNameLoc(TL.getNameLoc()); 6035 6036 return Result; 6037 } 6038 6039 template<typename Derived> 6040 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6041 TypeLocBuilder &TLB, 6042 UnaryTransformTypeLoc TL) { 6043 QualType Result = TL.getType(); 6044 if (Result->isDependentType()) { 6045 const UnaryTransformType *T = TL.getTypePtr(); 6046 QualType NewBase = 6047 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6048 Result = getDerived().RebuildUnaryTransformType(NewBase, 6049 T->getUTTKind(), 6050 TL.getKWLoc()); 6051 if (Result.isNull()) 6052 return QualType(); 6053 } 6054 6055 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6056 NewTL.setKWLoc(TL.getKWLoc()); 6057 NewTL.setParensRange(TL.getParensRange()); 6058 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6059 return Result; 6060 } 6061 6062 template<typename Derived> 6063 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6064 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6065 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6066 6067 CXXScopeSpec SS; 6068 TemplateName TemplateName = getDerived().TransformTemplateName( 6069 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6070 if (TemplateName.isNull()) 6071 return QualType(); 6072 6073 QualType OldDeduced = T->getDeducedType(); 6074 QualType NewDeduced; 6075 if (!OldDeduced.isNull()) { 6076 NewDeduced = getDerived().TransformType(OldDeduced); 6077 if (NewDeduced.isNull()) 6078 return QualType(); 6079 } 6080 6081 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6082 TemplateName, NewDeduced); 6083 if (Result.isNull()) 6084 return QualType(); 6085 6086 DeducedTemplateSpecializationTypeLoc NewTL = 6087 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6088 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6089 6090 return Result; 6091 } 6092 6093 template<typename Derived> 6094 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6095 RecordTypeLoc TL) { 6096 const RecordType *T = TL.getTypePtr(); 6097 RecordDecl *Record 6098 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6099 T->getDecl())); 6100 if (!Record) 6101 return QualType(); 6102 6103 QualType Result = TL.getType(); 6104 if (getDerived().AlwaysRebuild() || 6105 Record != T->getDecl()) { 6106 Result = getDerived().RebuildRecordType(Record); 6107 if (Result.isNull()) 6108 return QualType(); 6109 } 6110 6111 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6112 NewTL.setNameLoc(TL.getNameLoc()); 6113 6114 return Result; 6115 } 6116 6117 template<typename Derived> 6118 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6119 EnumTypeLoc TL) { 6120 const EnumType *T = TL.getTypePtr(); 6121 EnumDecl *Enum 6122 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6123 T->getDecl())); 6124 if (!Enum) 6125 return QualType(); 6126 6127 QualType Result = TL.getType(); 6128 if (getDerived().AlwaysRebuild() || 6129 Enum != T->getDecl()) { 6130 Result = getDerived().RebuildEnumType(Enum); 6131 if (Result.isNull()) 6132 return QualType(); 6133 } 6134 6135 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6136 NewTL.setNameLoc(TL.getNameLoc()); 6137 6138 return Result; 6139 } 6140 6141 template<typename Derived> 6142 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6143 TypeLocBuilder &TLB, 6144 InjectedClassNameTypeLoc TL) { 6145 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6146 TL.getTypePtr()->getDecl()); 6147 if (!D) return QualType(); 6148 6149 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6150 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6151 return T; 6152 } 6153 6154 template<typename Derived> 6155 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6156 TypeLocBuilder &TLB, 6157 TemplateTypeParmTypeLoc TL) { 6158 return TransformTypeSpecType(TLB, TL); 6159 } 6160 6161 template<typename Derived> 6162 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6163 TypeLocBuilder &TLB, 6164 SubstTemplateTypeParmTypeLoc TL) { 6165 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6166 6167 // Substitute into the replacement type, which itself might involve something 6168 // that needs to be transformed. This only tends to occur with default 6169 // template arguments of template template parameters. 6170 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6171 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6172 if (Replacement.isNull()) 6173 return QualType(); 6174 6175 // Always canonicalize the replacement type. 6176 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6177 QualType Result 6178 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6179 Replacement); 6180 6181 // Propagate type-source information. 6182 SubstTemplateTypeParmTypeLoc NewTL 6183 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6184 NewTL.setNameLoc(TL.getNameLoc()); 6185 return Result; 6186 6187 } 6188 6189 template<typename Derived> 6190 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6191 TypeLocBuilder &TLB, 6192 SubstTemplateTypeParmPackTypeLoc TL) { 6193 return TransformTypeSpecType(TLB, TL); 6194 } 6195 6196 template<typename Derived> 6197 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6198 TypeLocBuilder &TLB, 6199 TemplateSpecializationTypeLoc TL) { 6200 const TemplateSpecializationType *T = TL.getTypePtr(); 6201 6202 // The nested-name-specifier never matters in a TemplateSpecializationType, 6203 // because we can't have a dependent nested-name-specifier anyway. 6204 CXXScopeSpec SS; 6205 TemplateName Template 6206 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6207 TL.getTemplateNameLoc()); 6208 if (Template.isNull()) 6209 return QualType(); 6210 6211 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6212 } 6213 6214 template<typename Derived> 6215 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6216 AtomicTypeLoc TL) { 6217 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6218 if (ValueType.isNull()) 6219 return QualType(); 6220 6221 QualType Result = TL.getType(); 6222 if (getDerived().AlwaysRebuild() || 6223 ValueType != TL.getValueLoc().getType()) { 6224 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6225 if (Result.isNull()) 6226 return QualType(); 6227 } 6228 6229 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6230 NewTL.setKWLoc(TL.getKWLoc()); 6231 NewTL.setLParenLoc(TL.getLParenLoc()); 6232 NewTL.setRParenLoc(TL.getRParenLoc()); 6233 6234 return Result; 6235 } 6236 6237 template <typename Derived> 6238 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6239 PipeTypeLoc TL) { 6240 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6241 if (ValueType.isNull()) 6242 return QualType(); 6243 6244 QualType Result = TL.getType(); 6245 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6246 const PipeType *PT = Result->castAs<PipeType>(); 6247 bool isReadPipe = PT->isReadOnly(); 6248 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6249 if (Result.isNull()) 6250 return QualType(); 6251 } 6252 6253 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6254 NewTL.setKWLoc(TL.getKWLoc()); 6255 6256 return Result; 6257 } 6258 6259 template <typename Derived> 6260 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6261 ExtIntTypeLoc TL) { 6262 const ExtIntType *EIT = TL.getTypePtr(); 6263 QualType Result = TL.getType(); 6264 6265 if (getDerived().AlwaysRebuild()) { 6266 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6267 EIT->getNumBits(), TL.getNameLoc()); 6268 if (Result.isNull()) 6269 return QualType(); 6270 } 6271 6272 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6273 NewTL.setNameLoc(TL.getNameLoc()); 6274 return Result; 6275 } 6276 6277 template <typename Derived> 6278 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6279 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6280 const DependentExtIntType *EIT = TL.getTypePtr(); 6281 6282 EnterExpressionEvaluationContext Unevaluated( 6283 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6284 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6285 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6286 6287 if (BitsExpr.isInvalid()) 6288 return QualType(); 6289 6290 QualType Result = TL.getType(); 6291 6292 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6293 Result = getDerived().RebuildDependentExtIntType( 6294 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6295 6296 if (Result.isNull()) 6297 return QualType(); 6298 } 6299 6300 if (isa<DependentExtIntType>(Result)) { 6301 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6302 NewTL.setNameLoc(TL.getNameLoc()); 6303 } else { 6304 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6305 NewTL.setNameLoc(TL.getNameLoc()); 6306 } 6307 return Result; 6308 } 6309 6310 /// Simple iterator that traverses the template arguments in a 6311 /// container that provides a \c getArgLoc() member function. 6312 /// 6313 /// This iterator is intended to be used with the iterator form of 6314 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6315 template<typename ArgLocContainer> 6316 class TemplateArgumentLocContainerIterator { 6317 ArgLocContainer *Container; 6318 unsigned Index; 6319 6320 public: 6321 typedef TemplateArgumentLoc value_type; 6322 typedef TemplateArgumentLoc reference; 6323 typedef int difference_type; 6324 typedef std::input_iterator_tag iterator_category; 6325 6326 class pointer { 6327 TemplateArgumentLoc Arg; 6328 6329 public: 6330 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6331 6332 const TemplateArgumentLoc *operator->() const { 6333 return &Arg; 6334 } 6335 }; 6336 6337 6338 TemplateArgumentLocContainerIterator() {} 6339 6340 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6341 unsigned Index) 6342 : Container(&Container), Index(Index) { } 6343 6344 TemplateArgumentLocContainerIterator &operator++() { 6345 ++Index; 6346 return *this; 6347 } 6348 6349 TemplateArgumentLocContainerIterator operator++(int) { 6350 TemplateArgumentLocContainerIterator Old(*this); 6351 ++(*this); 6352 return Old; 6353 } 6354 6355 TemplateArgumentLoc operator*() const { 6356 return Container->getArgLoc(Index); 6357 } 6358 6359 pointer operator->() const { 6360 return pointer(Container->getArgLoc(Index)); 6361 } 6362 6363 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6364 const TemplateArgumentLocContainerIterator &Y) { 6365 return X.Container == Y.Container && X.Index == Y.Index; 6366 } 6367 6368 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6369 const TemplateArgumentLocContainerIterator &Y) { 6370 return !(X == Y); 6371 } 6372 }; 6373 6374 template<typename Derived> 6375 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6376 AutoTypeLoc TL) { 6377 const AutoType *T = TL.getTypePtr(); 6378 QualType OldDeduced = T->getDeducedType(); 6379 QualType NewDeduced; 6380 if (!OldDeduced.isNull()) { 6381 NewDeduced = getDerived().TransformType(OldDeduced); 6382 if (NewDeduced.isNull()) 6383 return QualType(); 6384 } 6385 6386 ConceptDecl *NewCD = nullptr; 6387 TemplateArgumentListInfo NewTemplateArgs; 6388 NestedNameSpecifierLoc NewNestedNameSpec; 6389 if (TL.getTypePtr()->isConstrained()) { 6390 NewCD = cast_or_null<ConceptDecl>( 6391 getDerived().TransformDecl( 6392 TL.getConceptNameLoc(), 6393 TL.getTypePtr()->getTypeConstraintConcept())); 6394 6395 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6396 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6397 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6398 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6399 ArgIterator(TL, 6400 TL.getNumArgs()), 6401 NewTemplateArgs)) 6402 return QualType(); 6403 6404 if (TL.getNestedNameSpecifierLoc()) { 6405 NewNestedNameSpec 6406 = getDerived().TransformNestedNameSpecifierLoc( 6407 TL.getNestedNameSpecifierLoc()); 6408 if (!NewNestedNameSpec) 6409 return QualType(); 6410 } 6411 } 6412 6413 QualType Result = TL.getType(); 6414 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6415 T->isDependentType()) { 6416 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6417 NewArgList.reserve(NewArgList.size()); 6418 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6419 NewArgList.push_back(ArgLoc.getArgument()); 6420 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6421 NewArgList); 6422 if (Result.isNull()) 6423 return QualType(); 6424 } 6425 6426 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6427 NewTL.setNameLoc(TL.getNameLoc()); 6428 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6429 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6430 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6431 NewTL.setFoundDecl(TL.getFoundDecl()); 6432 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6433 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6434 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6435 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6436 6437 return Result; 6438 } 6439 6440 template <typename Derived> 6441 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6442 TypeLocBuilder &TLB, 6443 TemplateSpecializationTypeLoc TL, 6444 TemplateName Template) { 6445 TemplateArgumentListInfo NewTemplateArgs; 6446 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6447 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6448 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6449 ArgIterator; 6450 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6451 ArgIterator(TL, TL.getNumArgs()), 6452 NewTemplateArgs)) 6453 return QualType(); 6454 6455 // FIXME: maybe don't rebuild if all the template arguments are the same. 6456 6457 QualType Result = 6458 getDerived().RebuildTemplateSpecializationType(Template, 6459 TL.getTemplateNameLoc(), 6460 NewTemplateArgs); 6461 6462 if (!Result.isNull()) { 6463 // Specializations of template template parameters are represented as 6464 // TemplateSpecializationTypes, and substitution of type alias templates 6465 // within a dependent context can transform them into 6466 // DependentTemplateSpecializationTypes. 6467 if (isa<DependentTemplateSpecializationType>(Result)) { 6468 DependentTemplateSpecializationTypeLoc NewTL 6469 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6470 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6471 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6472 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6473 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6474 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6475 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6476 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6477 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6478 return Result; 6479 } 6480 6481 TemplateSpecializationTypeLoc NewTL 6482 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6483 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6484 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6485 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6486 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6487 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6488 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6489 } 6490 6491 return Result; 6492 } 6493 6494 template <typename Derived> 6495 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6496 TypeLocBuilder &TLB, 6497 DependentTemplateSpecializationTypeLoc TL, 6498 TemplateName Template, 6499 CXXScopeSpec &SS) { 6500 TemplateArgumentListInfo NewTemplateArgs; 6501 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6502 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6503 typedef TemplateArgumentLocContainerIterator< 6504 DependentTemplateSpecializationTypeLoc> ArgIterator; 6505 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6506 ArgIterator(TL, TL.getNumArgs()), 6507 NewTemplateArgs)) 6508 return QualType(); 6509 6510 // FIXME: maybe don't rebuild if all the template arguments are the same. 6511 6512 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6513 QualType Result 6514 = getSema().Context.getDependentTemplateSpecializationType( 6515 TL.getTypePtr()->getKeyword(), 6516 DTN->getQualifier(), 6517 DTN->getIdentifier(), 6518 NewTemplateArgs); 6519 6520 DependentTemplateSpecializationTypeLoc NewTL 6521 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6522 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6523 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6524 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6525 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6526 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6527 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6528 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6529 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6530 return Result; 6531 } 6532 6533 QualType Result 6534 = getDerived().RebuildTemplateSpecializationType(Template, 6535 TL.getTemplateNameLoc(), 6536 NewTemplateArgs); 6537 6538 if (!Result.isNull()) { 6539 /// FIXME: Wrap this in an elaborated-type-specifier? 6540 TemplateSpecializationTypeLoc NewTL 6541 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6542 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6543 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6544 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6545 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6546 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6547 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6548 } 6549 6550 return Result; 6551 } 6552 6553 template<typename Derived> 6554 QualType 6555 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6556 ElaboratedTypeLoc TL) { 6557 const ElaboratedType *T = TL.getTypePtr(); 6558 6559 NestedNameSpecifierLoc QualifierLoc; 6560 // NOTE: the qualifier in an ElaboratedType is optional. 6561 if (TL.getQualifierLoc()) { 6562 QualifierLoc 6563 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6564 if (!QualifierLoc) 6565 return QualType(); 6566 } 6567 6568 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6569 if (NamedT.isNull()) 6570 return QualType(); 6571 6572 // C++0x [dcl.type.elab]p2: 6573 // If the identifier resolves to a typedef-name or the simple-template-id 6574 // resolves to an alias template specialization, the 6575 // elaborated-type-specifier is ill-formed. 6576 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6577 if (const TemplateSpecializationType *TST = 6578 NamedT->getAs<TemplateSpecializationType>()) { 6579 TemplateName Template = TST->getTemplateName(); 6580 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6581 Template.getAsTemplateDecl())) { 6582 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6583 diag::err_tag_reference_non_tag) 6584 << TAT << Sema::NTK_TypeAliasTemplate 6585 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6586 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6587 } 6588 } 6589 } 6590 6591 QualType Result = TL.getType(); 6592 if (getDerived().AlwaysRebuild() || 6593 QualifierLoc != TL.getQualifierLoc() || 6594 NamedT != T->getNamedType()) { 6595 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6596 T->getKeyword(), 6597 QualifierLoc, NamedT); 6598 if (Result.isNull()) 6599 return QualType(); 6600 } 6601 6602 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6603 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6604 NewTL.setQualifierLoc(QualifierLoc); 6605 return Result; 6606 } 6607 6608 template<typename Derived> 6609 QualType TreeTransform<Derived>::TransformAttributedType( 6610 TypeLocBuilder &TLB, 6611 AttributedTypeLoc TL) { 6612 const AttributedType *oldType = TL.getTypePtr(); 6613 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6614 if (modifiedType.isNull()) 6615 return QualType(); 6616 6617 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6618 const Attr *oldAttr = TL.getAttr(); 6619 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6620 if (oldAttr && !newAttr) 6621 return QualType(); 6622 6623 QualType result = TL.getType(); 6624 6625 // FIXME: dependent operand expressions? 6626 if (getDerived().AlwaysRebuild() || 6627 modifiedType != oldType->getModifiedType()) { 6628 // TODO: this is really lame; we should really be rebuilding the 6629 // equivalent type from first principles. 6630 QualType equivalentType 6631 = getDerived().TransformType(oldType->getEquivalentType()); 6632 if (equivalentType.isNull()) 6633 return QualType(); 6634 6635 // Check whether we can add nullability; it is only represented as 6636 // type sugar, and therefore cannot be diagnosed in any other way. 6637 if (auto nullability = oldType->getImmediateNullability()) { 6638 if (!modifiedType->canHaveNullability()) { 6639 SemaRef.Diag(TL.getAttr()->getLocation(), 6640 diag::err_nullability_nonpointer) 6641 << DiagNullabilityKind(*nullability, false) << modifiedType; 6642 return QualType(); 6643 } 6644 } 6645 6646 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6647 modifiedType, 6648 equivalentType); 6649 } 6650 6651 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6652 newTL.setAttr(newAttr); 6653 return result; 6654 } 6655 6656 template<typename Derived> 6657 QualType 6658 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6659 ParenTypeLoc TL) { 6660 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6661 if (Inner.isNull()) 6662 return QualType(); 6663 6664 QualType Result = TL.getType(); 6665 if (getDerived().AlwaysRebuild() || 6666 Inner != TL.getInnerLoc().getType()) { 6667 Result = getDerived().RebuildParenType(Inner); 6668 if (Result.isNull()) 6669 return QualType(); 6670 } 6671 6672 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6673 NewTL.setLParenLoc(TL.getLParenLoc()); 6674 NewTL.setRParenLoc(TL.getRParenLoc()); 6675 return Result; 6676 } 6677 6678 template <typename Derived> 6679 QualType 6680 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6681 MacroQualifiedTypeLoc TL) { 6682 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6683 if (Inner.isNull()) 6684 return QualType(); 6685 6686 QualType Result = TL.getType(); 6687 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6688 Result = 6689 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6690 if (Result.isNull()) 6691 return QualType(); 6692 } 6693 6694 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6695 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6696 return Result; 6697 } 6698 6699 template<typename Derived> 6700 QualType TreeTransform<Derived>::TransformDependentNameType( 6701 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6702 return TransformDependentNameType(TLB, TL, false); 6703 } 6704 6705 template<typename Derived> 6706 QualType TreeTransform<Derived>::TransformDependentNameType( 6707 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6708 const DependentNameType *T = TL.getTypePtr(); 6709 6710 NestedNameSpecifierLoc QualifierLoc 6711 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6712 if (!QualifierLoc) 6713 return QualType(); 6714 6715 QualType Result 6716 = getDerived().RebuildDependentNameType(T->getKeyword(), 6717 TL.getElaboratedKeywordLoc(), 6718 QualifierLoc, 6719 T->getIdentifier(), 6720 TL.getNameLoc(), 6721 DeducedTSTContext); 6722 if (Result.isNull()) 6723 return QualType(); 6724 6725 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6726 QualType NamedT = ElabT->getNamedType(); 6727 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6728 6729 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6730 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6731 NewTL.setQualifierLoc(QualifierLoc); 6732 } else { 6733 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6734 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6735 NewTL.setQualifierLoc(QualifierLoc); 6736 NewTL.setNameLoc(TL.getNameLoc()); 6737 } 6738 return Result; 6739 } 6740 6741 template<typename Derived> 6742 QualType TreeTransform<Derived>:: 6743 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6744 DependentTemplateSpecializationTypeLoc TL) { 6745 NestedNameSpecifierLoc QualifierLoc; 6746 if (TL.getQualifierLoc()) { 6747 QualifierLoc 6748 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6749 if (!QualifierLoc) 6750 return QualType(); 6751 } 6752 6753 return getDerived() 6754 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6755 } 6756 6757 template<typename Derived> 6758 QualType TreeTransform<Derived>:: 6759 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6760 DependentTemplateSpecializationTypeLoc TL, 6761 NestedNameSpecifierLoc QualifierLoc) { 6762 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6763 6764 TemplateArgumentListInfo NewTemplateArgs; 6765 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6766 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6767 6768 typedef TemplateArgumentLocContainerIterator< 6769 DependentTemplateSpecializationTypeLoc> ArgIterator; 6770 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6771 ArgIterator(TL, TL.getNumArgs()), 6772 NewTemplateArgs)) 6773 return QualType(); 6774 6775 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6776 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6777 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6778 /*AllowInjectedClassName*/ false); 6779 if (Result.isNull()) 6780 return QualType(); 6781 6782 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6783 QualType NamedT = ElabT->getNamedType(); 6784 6785 // Copy information relevant to the template specialization. 6786 TemplateSpecializationTypeLoc NamedTL 6787 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6788 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6789 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6790 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6791 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6792 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6793 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6794 6795 // Copy information relevant to the elaborated type. 6796 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6797 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6798 NewTL.setQualifierLoc(QualifierLoc); 6799 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6800 DependentTemplateSpecializationTypeLoc SpecTL 6801 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6802 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6803 SpecTL.setQualifierLoc(QualifierLoc); 6804 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6805 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6806 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6807 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6808 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6809 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6810 } else { 6811 TemplateSpecializationTypeLoc SpecTL 6812 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6813 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6814 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6815 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6816 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6817 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6818 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6819 } 6820 return Result; 6821 } 6822 6823 template<typename Derived> 6824 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6825 PackExpansionTypeLoc TL) { 6826 QualType Pattern 6827 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6828 if (Pattern.isNull()) 6829 return QualType(); 6830 6831 QualType Result = TL.getType(); 6832 if (getDerived().AlwaysRebuild() || 6833 Pattern != TL.getPatternLoc().getType()) { 6834 Result = getDerived().RebuildPackExpansionType(Pattern, 6835 TL.getPatternLoc().getSourceRange(), 6836 TL.getEllipsisLoc(), 6837 TL.getTypePtr()->getNumExpansions()); 6838 if (Result.isNull()) 6839 return QualType(); 6840 } 6841 6842 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6843 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6844 return Result; 6845 } 6846 6847 template<typename Derived> 6848 QualType 6849 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6850 ObjCInterfaceTypeLoc TL) { 6851 // ObjCInterfaceType is never dependent. 6852 TLB.pushFullCopy(TL); 6853 return TL.getType(); 6854 } 6855 6856 template<typename Derived> 6857 QualType 6858 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6859 ObjCTypeParamTypeLoc TL) { 6860 const ObjCTypeParamType *T = TL.getTypePtr(); 6861 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6862 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6863 if (!OTP) 6864 return QualType(); 6865 6866 QualType Result = TL.getType(); 6867 if (getDerived().AlwaysRebuild() || 6868 OTP != T->getDecl()) { 6869 Result = getDerived().RebuildObjCTypeParamType(OTP, 6870 TL.getProtocolLAngleLoc(), 6871 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6872 TL.getNumProtocols()), 6873 TL.getProtocolLocs(), 6874 TL.getProtocolRAngleLoc()); 6875 if (Result.isNull()) 6876 return QualType(); 6877 } 6878 6879 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6880 if (TL.getNumProtocols()) { 6881 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6882 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6883 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6884 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6885 } 6886 return Result; 6887 } 6888 6889 template<typename Derived> 6890 QualType 6891 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6892 ObjCObjectTypeLoc TL) { 6893 // Transform base type. 6894 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6895 if (BaseType.isNull()) 6896 return QualType(); 6897 6898 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6899 6900 // Transform type arguments. 6901 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6902 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6903 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6904 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6905 QualType TypeArg = TypeArgInfo->getType(); 6906 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6907 AnyChanged = true; 6908 6909 // We have a pack expansion. Instantiate it. 6910 const auto *PackExpansion = PackExpansionLoc.getType() 6911 ->castAs<PackExpansionType>(); 6912 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6913 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6914 Unexpanded); 6915 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6916 6917 // Determine whether the set of unexpanded parameter packs can 6918 // and should be expanded. 6919 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6920 bool Expand = false; 6921 bool RetainExpansion = false; 6922 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6923 if (getDerived().TryExpandParameterPacks( 6924 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6925 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6926 return QualType(); 6927 6928 if (!Expand) { 6929 // We can't expand this pack expansion into separate arguments yet; 6930 // just substitute into the pattern and create a new pack expansion 6931 // type. 6932 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6933 6934 TypeLocBuilder TypeArgBuilder; 6935 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6936 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6937 PatternLoc); 6938 if (NewPatternType.isNull()) 6939 return QualType(); 6940 6941 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6942 NewPatternType, NumExpansions); 6943 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6944 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6945 NewTypeArgInfos.push_back( 6946 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6947 continue; 6948 } 6949 6950 // Substitute into the pack expansion pattern for each slice of the 6951 // pack. 6952 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6953 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6954 6955 TypeLocBuilder TypeArgBuilder; 6956 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6957 6958 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6959 PatternLoc); 6960 if (NewTypeArg.isNull()) 6961 return QualType(); 6962 6963 NewTypeArgInfos.push_back( 6964 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6965 } 6966 6967 continue; 6968 } 6969 6970 TypeLocBuilder TypeArgBuilder; 6971 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6972 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6973 if (NewTypeArg.isNull()) 6974 return QualType(); 6975 6976 // If nothing changed, just keep the old TypeSourceInfo. 6977 if (NewTypeArg == TypeArg) { 6978 NewTypeArgInfos.push_back(TypeArgInfo); 6979 continue; 6980 } 6981 6982 NewTypeArgInfos.push_back( 6983 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6984 AnyChanged = true; 6985 } 6986 6987 QualType Result = TL.getType(); 6988 if (getDerived().AlwaysRebuild() || AnyChanged) { 6989 // Rebuild the type. 6990 Result = getDerived().RebuildObjCObjectType( 6991 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6992 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6993 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6994 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6995 6996 if (Result.isNull()) 6997 return QualType(); 6998 } 6999 7000 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7001 NewT.setHasBaseTypeAsWritten(true); 7002 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7003 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7004 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7005 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7006 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7007 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7008 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7009 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7010 return Result; 7011 } 7012 7013 template<typename Derived> 7014 QualType 7015 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7016 ObjCObjectPointerTypeLoc TL) { 7017 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7018 if (PointeeType.isNull()) 7019 return QualType(); 7020 7021 QualType Result = TL.getType(); 7022 if (getDerived().AlwaysRebuild() || 7023 PointeeType != TL.getPointeeLoc().getType()) { 7024 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7025 TL.getStarLoc()); 7026 if (Result.isNull()) 7027 return QualType(); 7028 } 7029 7030 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7031 NewT.setStarLoc(TL.getStarLoc()); 7032 return Result; 7033 } 7034 7035 //===----------------------------------------------------------------------===// 7036 // Statement transformation 7037 //===----------------------------------------------------------------------===// 7038 template<typename Derived> 7039 StmtResult 7040 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7041 return S; 7042 } 7043 7044 template<typename Derived> 7045 StmtResult 7046 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7047 return getDerived().TransformCompoundStmt(S, false); 7048 } 7049 7050 template<typename Derived> 7051 StmtResult 7052 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7053 bool IsStmtExpr) { 7054 Sema::CompoundScopeRAII CompoundScope(getSema()); 7055 7056 const Stmt *ExprResult = S->getStmtExprResult(); 7057 bool SubStmtInvalid = false; 7058 bool SubStmtChanged = false; 7059 SmallVector<Stmt*, 8> Statements; 7060 for (auto *B : S->body()) { 7061 StmtResult Result = getDerived().TransformStmt( 7062 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7063 7064 if (Result.isInvalid()) { 7065 // Immediately fail if this was a DeclStmt, since it's very 7066 // likely that this will cause problems for future statements. 7067 if (isa<DeclStmt>(B)) 7068 return StmtError(); 7069 7070 // Otherwise, just keep processing substatements and fail later. 7071 SubStmtInvalid = true; 7072 continue; 7073 } 7074 7075 SubStmtChanged = SubStmtChanged || Result.get() != B; 7076 Statements.push_back(Result.getAs<Stmt>()); 7077 } 7078 7079 if (SubStmtInvalid) 7080 return StmtError(); 7081 7082 if (!getDerived().AlwaysRebuild() && 7083 !SubStmtChanged) 7084 return S; 7085 7086 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7087 Statements, 7088 S->getRBracLoc(), 7089 IsStmtExpr); 7090 } 7091 7092 template<typename Derived> 7093 StmtResult 7094 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7095 ExprResult LHS, RHS; 7096 { 7097 EnterExpressionEvaluationContext Unevaluated( 7098 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7099 7100 // Transform the left-hand case value. 7101 LHS = getDerived().TransformExpr(S->getLHS()); 7102 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7103 if (LHS.isInvalid()) 7104 return StmtError(); 7105 7106 // Transform the right-hand case value (for the GNU case-range extension). 7107 RHS = getDerived().TransformExpr(S->getRHS()); 7108 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7109 if (RHS.isInvalid()) 7110 return StmtError(); 7111 } 7112 7113 // Build the case statement. 7114 // Case statements are always rebuilt so that they will attached to their 7115 // transformed switch statement. 7116 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7117 LHS.get(), 7118 S->getEllipsisLoc(), 7119 RHS.get(), 7120 S->getColonLoc()); 7121 if (Case.isInvalid()) 7122 return StmtError(); 7123 7124 // Transform the statement following the case 7125 StmtResult SubStmt = 7126 getDerived().TransformStmt(S->getSubStmt()); 7127 if (SubStmt.isInvalid()) 7128 return StmtError(); 7129 7130 // Attach the body to the case statement 7131 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7132 } 7133 7134 template <typename Derived> 7135 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7136 // Transform the statement following the default case 7137 StmtResult SubStmt = 7138 getDerived().TransformStmt(S->getSubStmt()); 7139 if (SubStmt.isInvalid()) 7140 return StmtError(); 7141 7142 // Default statements are always rebuilt 7143 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7144 SubStmt.get()); 7145 } 7146 7147 template<typename Derived> 7148 StmtResult 7149 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7150 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7151 if (SubStmt.isInvalid()) 7152 return StmtError(); 7153 7154 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7155 S->getDecl()); 7156 if (!LD) 7157 return StmtError(); 7158 7159 // If we're transforming "in-place" (we're not creating new local 7160 // declarations), assume we're replacing the old label statement 7161 // and clear out the reference to it. 7162 if (LD == S->getDecl()) 7163 S->getDecl()->setStmt(nullptr); 7164 7165 // FIXME: Pass the real colon location in. 7166 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7167 cast<LabelDecl>(LD), SourceLocation(), 7168 SubStmt.get()); 7169 } 7170 7171 template <typename Derived> 7172 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7173 if (!R) 7174 return R; 7175 7176 switch (R->getKind()) { 7177 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7178 #define ATTR(X) 7179 #define PRAGMA_SPELLING_ATTR(X) \ 7180 case attr::X: \ 7181 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7182 #include "clang/Basic/AttrList.inc" 7183 default: 7184 return R; 7185 } 7186 } 7187 7188 template <typename Derived> 7189 StmtResult 7190 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7191 StmtDiscardKind SDK) { 7192 bool AttrsChanged = false; 7193 SmallVector<const Attr *, 1> Attrs; 7194 7195 // Visit attributes and keep track if any are transformed. 7196 for (const auto *I : S->getAttrs()) { 7197 const Attr *R = getDerived().TransformAttr(I); 7198 AttrsChanged |= (I != R); 7199 Attrs.push_back(R); 7200 } 7201 7202 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7203 if (SubStmt.isInvalid()) 7204 return StmtError(); 7205 7206 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7207 return S; 7208 7209 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7210 SubStmt.get()); 7211 } 7212 7213 template<typename Derived> 7214 StmtResult 7215 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7216 // Transform the initialization statement 7217 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7218 if (Init.isInvalid()) 7219 return StmtError(); 7220 7221 // Transform the condition 7222 Sema::ConditionResult Cond = getDerived().TransformCondition( 7223 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7224 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7225 : Sema::ConditionKind::Boolean); 7226 if (Cond.isInvalid()) 7227 return StmtError(); 7228 7229 // If this is a constexpr if, determine which arm we should instantiate. 7230 llvm::Optional<bool> ConstexprConditionValue; 7231 if (S->isConstexpr()) 7232 ConstexprConditionValue = Cond.getKnownValue(); 7233 7234 // Transform the "then" branch. 7235 StmtResult Then; 7236 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7237 Then = getDerived().TransformStmt(S->getThen()); 7238 if (Then.isInvalid()) 7239 return StmtError(); 7240 } else { 7241 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7242 } 7243 7244 // Transform the "else" branch. 7245 StmtResult Else; 7246 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7247 Else = getDerived().TransformStmt(S->getElse()); 7248 if (Else.isInvalid()) 7249 return StmtError(); 7250 } 7251 7252 if (!getDerived().AlwaysRebuild() && 7253 Init.get() == S->getInit() && 7254 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7255 Then.get() == S->getThen() && 7256 Else.get() == S->getElse()) 7257 return S; 7258 7259 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 7260 Init.get(), Then.get(), S->getElseLoc(), 7261 Else.get()); 7262 } 7263 7264 template<typename Derived> 7265 StmtResult 7266 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7267 // Transform the initialization statement 7268 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7269 if (Init.isInvalid()) 7270 return StmtError(); 7271 7272 // Transform the condition. 7273 Sema::ConditionResult Cond = getDerived().TransformCondition( 7274 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7275 Sema::ConditionKind::Switch); 7276 if (Cond.isInvalid()) 7277 return StmtError(); 7278 7279 // Rebuild the switch statement. 7280 StmtResult Switch 7281 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 7282 if (Switch.isInvalid()) 7283 return StmtError(); 7284 7285 // Transform the body of the switch statement. 7286 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7287 if (Body.isInvalid()) 7288 return StmtError(); 7289 7290 // Complete the switch statement. 7291 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7292 Body.get()); 7293 } 7294 7295 template<typename Derived> 7296 StmtResult 7297 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7298 // Transform the condition 7299 Sema::ConditionResult Cond = getDerived().TransformCondition( 7300 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7301 Sema::ConditionKind::Boolean); 7302 if (Cond.isInvalid()) 7303 return StmtError(); 7304 7305 // Transform the body 7306 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7307 if (Body.isInvalid()) 7308 return StmtError(); 7309 7310 if (!getDerived().AlwaysRebuild() && 7311 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7312 Body.get() == S->getBody()) 7313 return Owned(S); 7314 7315 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 7316 } 7317 7318 template<typename Derived> 7319 StmtResult 7320 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7321 // Transform the body 7322 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7323 if (Body.isInvalid()) 7324 return StmtError(); 7325 7326 // Transform the condition 7327 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7328 if (Cond.isInvalid()) 7329 return StmtError(); 7330 7331 if (!getDerived().AlwaysRebuild() && 7332 Cond.get() == S->getCond() && 7333 Body.get() == S->getBody()) 7334 return S; 7335 7336 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7337 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7338 S->getRParenLoc()); 7339 } 7340 7341 template<typename Derived> 7342 StmtResult 7343 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7344 if (getSema().getLangOpts().OpenMP) 7345 getSema().startOpenMPLoop(); 7346 7347 // Transform the initialization statement 7348 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7349 if (Init.isInvalid()) 7350 return StmtError(); 7351 7352 // In OpenMP loop region loop control variable must be captured and be 7353 // private. Perform analysis of first part (if any). 7354 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7355 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7356 7357 // Transform the condition 7358 Sema::ConditionResult Cond = getDerived().TransformCondition( 7359 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7360 Sema::ConditionKind::Boolean); 7361 if (Cond.isInvalid()) 7362 return StmtError(); 7363 7364 // Transform the increment 7365 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7366 if (Inc.isInvalid()) 7367 return StmtError(); 7368 7369 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7370 if (S->getInc() && !FullInc.get()) 7371 return StmtError(); 7372 7373 // Transform the body 7374 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7375 if (Body.isInvalid()) 7376 return StmtError(); 7377 7378 if (!getDerived().AlwaysRebuild() && 7379 Init.get() == S->getInit() && 7380 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7381 Inc.get() == S->getInc() && 7382 Body.get() == S->getBody()) 7383 return S; 7384 7385 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7386 Init.get(), Cond, FullInc, 7387 S->getRParenLoc(), Body.get()); 7388 } 7389 7390 template<typename Derived> 7391 StmtResult 7392 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7393 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7394 S->getLabel()); 7395 if (!LD) 7396 return StmtError(); 7397 7398 // Goto statements must always be rebuilt, to resolve the label. 7399 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7400 cast<LabelDecl>(LD)); 7401 } 7402 7403 template<typename Derived> 7404 StmtResult 7405 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7406 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7407 if (Target.isInvalid()) 7408 return StmtError(); 7409 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7410 7411 if (!getDerived().AlwaysRebuild() && 7412 Target.get() == S->getTarget()) 7413 return S; 7414 7415 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7416 Target.get()); 7417 } 7418 7419 template<typename Derived> 7420 StmtResult 7421 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7422 return S; 7423 } 7424 7425 template<typename Derived> 7426 StmtResult 7427 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7428 return S; 7429 } 7430 7431 template<typename Derived> 7432 StmtResult 7433 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7434 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7435 /*NotCopyInit*/false); 7436 if (Result.isInvalid()) 7437 return StmtError(); 7438 7439 // FIXME: We always rebuild the return statement because there is no way 7440 // to tell whether the return type of the function has changed. 7441 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7442 } 7443 7444 template<typename Derived> 7445 StmtResult 7446 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7447 bool DeclChanged = false; 7448 SmallVector<Decl *, 4> Decls; 7449 for (auto *D : S->decls()) { 7450 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7451 if (!Transformed) 7452 return StmtError(); 7453 7454 if (Transformed != D) 7455 DeclChanged = true; 7456 7457 Decls.push_back(Transformed); 7458 } 7459 7460 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7461 return S; 7462 7463 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7464 } 7465 7466 template<typename Derived> 7467 StmtResult 7468 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7469 7470 SmallVector<Expr*, 8> Constraints; 7471 SmallVector<Expr*, 8> Exprs; 7472 SmallVector<IdentifierInfo *, 4> Names; 7473 7474 ExprResult AsmString; 7475 SmallVector<Expr*, 8> Clobbers; 7476 7477 bool ExprsChanged = false; 7478 7479 // Go through the outputs. 7480 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7481 Names.push_back(S->getOutputIdentifier(I)); 7482 7483 // No need to transform the constraint literal. 7484 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7485 7486 // Transform the output expr. 7487 Expr *OutputExpr = S->getOutputExpr(I); 7488 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7489 if (Result.isInvalid()) 7490 return StmtError(); 7491 7492 ExprsChanged |= Result.get() != OutputExpr; 7493 7494 Exprs.push_back(Result.get()); 7495 } 7496 7497 // Go through the inputs. 7498 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7499 Names.push_back(S->getInputIdentifier(I)); 7500 7501 // No need to transform the constraint literal. 7502 Constraints.push_back(S->getInputConstraintLiteral(I)); 7503 7504 // Transform the input expr. 7505 Expr *InputExpr = S->getInputExpr(I); 7506 ExprResult Result = getDerived().TransformExpr(InputExpr); 7507 if (Result.isInvalid()) 7508 return StmtError(); 7509 7510 ExprsChanged |= Result.get() != InputExpr; 7511 7512 Exprs.push_back(Result.get()); 7513 } 7514 7515 // Go through the Labels. 7516 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7517 Names.push_back(S->getLabelIdentifier(I)); 7518 7519 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7520 if (Result.isInvalid()) 7521 return StmtError(); 7522 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7523 Exprs.push_back(Result.get()); 7524 } 7525 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7526 return S; 7527 7528 // Go through the clobbers. 7529 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7530 Clobbers.push_back(S->getClobberStringLiteral(I)); 7531 7532 // No need to transform the asm string literal. 7533 AsmString = S->getAsmString(); 7534 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7535 S->isVolatile(), S->getNumOutputs(), 7536 S->getNumInputs(), Names.data(), 7537 Constraints, Exprs, AsmString.get(), 7538 Clobbers, S->getNumLabels(), 7539 S->getRParenLoc()); 7540 } 7541 7542 template<typename Derived> 7543 StmtResult 7544 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7545 ArrayRef<Token> AsmToks = 7546 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7547 7548 bool HadError = false, HadChange = false; 7549 7550 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7551 SmallVector<Expr*, 8> TransformedExprs; 7552 TransformedExprs.reserve(SrcExprs.size()); 7553 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7554 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7555 if (!Result.isUsable()) { 7556 HadError = true; 7557 } else { 7558 HadChange |= (Result.get() != SrcExprs[i]); 7559 TransformedExprs.push_back(Result.get()); 7560 } 7561 } 7562 7563 if (HadError) return StmtError(); 7564 if (!HadChange && !getDerived().AlwaysRebuild()) 7565 return Owned(S); 7566 7567 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7568 AsmToks, S->getAsmString(), 7569 S->getNumOutputs(), S->getNumInputs(), 7570 S->getAllConstraints(), S->getClobbers(), 7571 TransformedExprs, S->getEndLoc()); 7572 } 7573 7574 // C++ Coroutines TS 7575 7576 template<typename Derived> 7577 StmtResult 7578 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7579 auto *ScopeInfo = SemaRef.getCurFunction(); 7580 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7581 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7582 ScopeInfo->NeedsCoroutineSuspends && 7583 ScopeInfo->CoroutineSuspends.first == nullptr && 7584 ScopeInfo->CoroutineSuspends.second == nullptr && 7585 "expected clean scope info"); 7586 7587 // Set that we have (possibly-invalid) suspend points before we do anything 7588 // that may fail. 7589 ScopeInfo->setNeedsCoroutineSuspends(false); 7590 7591 // We re-build the coroutine promise object (and the coroutine parameters its 7592 // type and constructor depend on) based on the types used in our current 7593 // function. We must do so, and set it on the current FunctionScopeInfo, 7594 // before attempting to transform the other parts of the coroutine body 7595 // statement, such as the implicit suspend statements (because those 7596 // statements reference the FunctionScopeInfo::CoroutinePromise). 7597 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7598 return StmtError(); 7599 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7600 if (!Promise) 7601 return StmtError(); 7602 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7603 ScopeInfo->CoroutinePromise = Promise; 7604 7605 // Transform the implicit coroutine statements constructed using dependent 7606 // types during the previous parse: initial and final suspensions, the return 7607 // object, and others. We also transform the coroutine function's body. 7608 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7609 if (InitSuspend.isInvalid()) 7610 return StmtError(); 7611 StmtResult FinalSuspend = 7612 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7613 if (FinalSuspend.isInvalid()) 7614 return StmtError(); 7615 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7616 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7617 7618 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7619 if (BodyRes.isInvalid()) 7620 return StmtError(); 7621 7622 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7623 if (Builder.isInvalid()) 7624 return StmtError(); 7625 7626 Expr *ReturnObject = S->getReturnValueInit(); 7627 assert(ReturnObject && "the return object is expected to be valid"); 7628 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7629 /*NoCopyInit*/ false); 7630 if (Res.isInvalid()) 7631 return StmtError(); 7632 Builder.ReturnValue = Res.get(); 7633 7634 // If during the previous parse the coroutine still had a dependent promise 7635 // statement, we may need to build some implicit coroutine statements 7636 // (such as exception and fallthrough handlers) for the first time. 7637 if (S->hasDependentPromiseType()) { 7638 // We can only build these statements, however, if the current promise type 7639 // is not dependent. 7640 if (!Promise->getType()->isDependentType()) { 7641 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7642 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7643 "these nodes should not have been built yet"); 7644 if (!Builder.buildDependentStatements()) 7645 return StmtError(); 7646 } 7647 } else { 7648 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7649 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7650 if (Res.isInvalid()) 7651 return StmtError(); 7652 Builder.OnFallthrough = Res.get(); 7653 } 7654 7655 if (auto *OnException = S->getExceptionHandler()) { 7656 StmtResult Res = getDerived().TransformStmt(OnException); 7657 if (Res.isInvalid()) 7658 return StmtError(); 7659 Builder.OnException = Res.get(); 7660 } 7661 7662 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7663 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7664 if (Res.isInvalid()) 7665 return StmtError(); 7666 Builder.ReturnStmtOnAllocFailure = Res.get(); 7667 } 7668 7669 // Transform any additional statements we may have already built 7670 assert(S->getAllocate() && S->getDeallocate() && 7671 "allocation and deallocation calls must already be built"); 7672 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7673 if (AllocRes.isInvalid()) 7674 return StmtError(); 7675 Builder.Allocate = AllocRes.get(); 7676 7677 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7678 if (DeallocRes.isInvalid()) 7679 return StmtError(); 7680 Builder.Deallocate = DeallocRes.get(); 7681 7682 assert(S->getResultDecl() && "ResultDecl must already be built"); 7683 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7684 if (ResultDecl.isInvalid()) 7685 return StmtError(); 7686 Builder.ResultDecl = ResultDecl.get(); 7687 7688 if (auto *ReturnStmt = S->getReturnStmt()) { 7689 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7690 if (Res.isInvalid()) 7691 return StmtError(); 7692 Builder.ReturnStmt = Res.get(); 7693 } 7694 } 7695 7696 return getDerived().RebuildCoroutineBodyStmt(Builder); 7697 } 7698 7699 template<typename Derived> 7700 StmtResult 7701 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7702 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7703 /*NotCopyInit*/false); 7704 if (Result.isInvalid()) 7705 return StmtError(); 7706 7707 // Always rebuild; we don't know if this needs to be injected into a new 7708 // context or if the promise type has changed. 7709 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7710 S->isImplicit()); 7711 } 7712 7713 template<typename Derived> 7714 ExprResult 7715 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7716 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7717 /*NotCopyInit*/false); 7718 if (Result.isInvalid()) 7719 return ExprError(); 7720 7721 // Always rebuild; we don't know if this needs to be injected into a new 7722 // context or if the promise type has changed. 7723 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7724 E->isImplicit()); 7725 } 7726 7727 template <typename Derived> 7728 ExprResult 7729 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7730 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7731 /*NotCopyInit*/ false); 7732 if (OperandResult.isInvalid()) 7733 return ExprError(); 7734 7735 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7736 E->getOperatorCoawaitLookup()); 7737 7738 if (LookupResult.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().RebuildDependentCoawaitExpr( 7744 E->getKeywordLoc(), OperandResult.get(), 7745 cast<UnresolvedLookupExpr>(LookupResult.get())); 7746 } 7747 7748 template<typename Derived> 7749 ExprResult 7750 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7751 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7752 /*NotCopyInit*/false); 7753 if (Result.isInvalid()) 7754 return ExprError(); 7755 7756 // Always rebuild; we don't know if this needs to be injected into a new 7757 // context or if the promise type has changed. 7758 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7759 } 7760 7761 // Objective-C Statements. 7762 7763 template<typename Derived> 7764 StmtResult 7765 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7766 // Transform the body of the @try. 7767 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7768 if (TryBody.isInvalid()) 7769 return StmtError(); 7770 7771 // Transform the @catch statements (if present). 7772 bool AnyCatchChanged = false; 7773 SmallVector<Stmt*, 8> CatchStmts; 7774 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7775 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7776 if (Catch.isInvalid()) 7777 return StmtError(); 7778 if (Catch.get() != S->getCatchStmt(I)) 7779 AnyCatchChanged = true; 7780 CatchStmts.push_back(Catch.get()); 7781 } 7782 7783 // Transform the @finally statement (if present). 7784 StmtResult Finally; 7785 if (S->getFinallyStmt()) { 7786 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7787 if (Finally.isInvalid()) 7788 return StmtError(); 7789 } 7790 7791 // If nothing changed, just retain this statement. 7792 if (!getDerived().AlwaysRebuild() && 7793 TryBody.get() == S->getTryBody() && 7794 !AnyCatchChanged && 7795 Finally.get() == S->getFinallyStmt()) 7796 return S; 7797 7798 // Build a new statement. 7799 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7800 CatchStmts, Finally.get()); 7801 } 7802 7803 template<typename Derived> 7804 StmtResult 7805 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7806 // Transform the @catch parameter, if there is one. 7807 VarDecl *Var = nullptr; 7808 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7809 TypeSourceInfo *TSInfo = nullptr; 7810 if (FromVar->getTypeSourceInfo()) { 7811 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7812 if (!TSInfo) 7813 return StmtError(); 7814 } 7815 7816 QualType T; 7817 if (TSInfo) 7818 T = TSInfo->getType(); 7819 else { 7820 T = getDerived().TransformType(FromVar->getType()); 7821 if (T.isNull()) 7822 return StmtError(); 7823 } 7824 7825 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7826 if (!Var) 7827 return StmtError(); 7828 } 7829 7830 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7831 if (Body.isInvalid()) 7832 return StmtError(); 7833 7834 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7835 S->getRParenLoc(), 7836 Var, Body.get()); 7837 } 7838 7839 template<typename Derived> 7840 StmtResult 7841 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7842 // Transform the body. 7843 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7844 if (Body.isInvalid()) 7845 return StmtError(); 7846 7847 // If nothing changed, just retain this statement. 7848 if (!getDerived().AlwaysRebuild() && 7849 Body.get() == S->getFinallyBody()) 7850 return S; 7851 7852 // Build a new statement. 7853 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7854 Body.get()); 7855 } 7856 7857 template<typename Derived> 7858 StmtResult 7859 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7860 ExprResult Operand; 7861 if (S->getThrowExpr()) { 7862 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7863 if (Operand.isInvalid()) 7864 return StmtError(); 7865 } 7866 7867 if (!getDerived().AlwaysRebuild() && 7868 Operand.get() == S->getThrowExpr()) 7869 return S; 7870 7871 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7872 } 7873 7874 template<typename Derived> 7875 StmtResult 7876 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7877 ObjCAtSynchronizedStmt *S) { 7878 // Transform the object we are locking. 7879 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7880 if (Object.isInvalid()) 7881 return StmtError(); 7882 Object = 7883 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7884 Object.get()); 7885 if (Object.isInvalid()) 7886 return StmtError(); 7887 7888 // Transform the body. 7889 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7890 if (Body.isInvalid()) 7891 return StmtError(); 7892 7893 // If nothing change, just retain the current statement. 7894 if (!getDerived().AlwaysRebuild() && 7895 Object.get() == S->getSynchExpr() && 7896 Body.get() == S->getSynchBody()) 7897 return S; 7898 7899 // Build a new statement. 7900 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7901 Object.get(), Body.get()); 7902 } 7903 7904 template<typename Derived> 7905 StmtResult 7906 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7907 ObjCAutoreleasePoolStmt *S) { 7908 // Transform the body. 7909 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7910 if (Body.isInvalid()) 7911 return StmtError(); 7912 7913 // If nothing changed, just retain this statement. 7914 if (!getDerived().AlwaysRebuild() && 7915 Body.get() == S->getSubStmt()) 7916 return S; 7917 7918 // Build a new statement. 7919 return getDerived().RebuildObjCAutoreleasePoolStmt( 7920 S->getAtLoc(), Body.get()); 7921 } 7922 7923 template<typename Derived> 7924 StmtResult 7925 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7926 ObjCForCollectionStmt *S) { 7927 // Transform the element statement. 7928 StmtResult Element = 7929 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7930 if (Element.isInvalid()) 7931 return StmtError(); 7932 7933 // Transform the collection expression. 7934 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7935 if (Collection.isInvalid()) 7936 return StmtError(); 7937 7938 // Transform the body. 7939 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7940 if (Body.isInvalid()) 7941 return StmtError(); 7942 7943 // If nothing changed, just retain this statement. 7944 if (!getDerived().AlwaysRebuild() && 7945 Element.get() == S->getElement() && 7946 Collection.get() == S->getCollection() && 7947 Body.get() == S->getBody()) 7948 return S; 7949 7950 // Build a new statement. 7951 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7952 Element.get(), 7953 Collection.get(), 7954 S->getRParenLoc(), 7955 Body.get()); 7956 } 7957 7958 template <typename Derived> 7959 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7960 // Transform the exception declaration, if any. 7961 VarDecl *Var = nullptr; 7962 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7963 TypeSourceInfo *T = 7964 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7965 if (!T) 7966 return StmtError(); 7967 7968 Var = getDerived().RebuildExceptionDecl( 7969 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7970 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7971 if (!Var || Var->isInvalidDecl()) 7972 return StmtError(); 7973 } 7974 7975 // Transform the actual exception handler. 7976 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7977 if (Handler.isInvalid()) 7978 return StmtError(); 7979 7980 if (!getDerived().AlwaysRebuild() && !Var && 7981 Handler.get() == S->getHandlerBlock()) 7982 return S; 7983 7984 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7985 } 7986 7987 template <typename Derived> 7988 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7989 // Transform the try block itself. 7990 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7991 if (TryBlock.isInvalid()) 7992 return StmtError(); 7993 7994 // Transform the handlers. 7995 bool HandlerChanged = false; 7996 SmallVector<Stmt *, 8> Handlers; 7997 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7998 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7999 if (Handler.isInvalid()) 8000 return StmtError(); 8001 8002 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8003 Handlers.push_back(Handler.getAs<Stmt>()); 8004 } 8005 8006 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8007 !HandlerChanged) 8008 return S; 8009 8010 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8011 Handlers); 8012 } 8013 8014 template<typename Derived> 8015 StmtResult 8016 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8017 StmtResult Init = 8018 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8019 if (Init.isInvalid()) 8020 return StmtError(); 8021 8022 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8023 if (Range.isInvalid()) 8024 return StmtError(); 8025 8026 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8027 if (Begin.isInvalid()) 8028 return StmtError(); 8029 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8030 if (End.isInvalid()) 8031 return StmtError(); 8032 8033 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8034 if (Cond.isInvalid()) 8035 return StmtError(); 8036 if (Cond.get()) 8037 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8038 if (Cond.isInvalid()) 8039 return StmtError(); 8040 if (Cond.get()) 8041 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8042 8043 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8044 if (Inc.isInvalid()) 8045 return StmtError(); 8046 if (Inc.get()) 8047 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8048 8049 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8050 if (LoopVar.isInvalid()) 8051 return StmtError(); 8052 8053 StmtResult NewStmt = S; 8054 if (getDerived().AlwaysRebuild() || 8055 Init.get() != S->getInit() || 8056 Range.get() != S->getRangeStmt() || 8057 Begin.get() != S->getBeginStmt() || 8058 End.get() != S->getEndStmt() || 8059 Cond.get() != S->getCond() || 8060 Inc.get() != S->getInc() || 8061 LoopVar.get() != S->getLoopVarStmt()) { 8062 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8063 S->getCoawaitLoc(), Init.get(), 8064 S->getColonLoc(), Range.get(), 8065 Begin.get(), End.get(), 8066 Cond.get(), 8067 Inc.get(), LoopVar.get(), 8068 S->getRParenLoc()); 8069 if (NewStmt.isInvalid()) 8070 return StmtError(); 8071 } 8072 8073 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8074 if (Body.isInvalid()) 8075 return StmtError(); 8076 8077 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8078 // it now so we have a new statement to attach the body to. 8079 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8080 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8081 S->getCoawaitLoc(), Init.get(), 8082 S->getColonLoc(), Range.get(), 8083 Begin.get(), End.get(), 8084 Cond.get(), 8085 Inc.get(), LoopVar.get(), 8086 S->getRParenLoc()); 8087 if (NewStmt.isInvalid()) 8088 return StmtError(); 8089 } 8090 8091 if (NewStmt.get() == S) 8092 return S; 8093 8094 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8095 } 8096 8097 template<typename Derived> 8098 StmtResult 8099 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8100 MSDependentExistsStmt *S) { 8101 // Transform the nested-name-specifier, if any. 8102 NestedNameSpecifierLoc QualifierLoc; 8103 if (S->getQualifierLoc()) { 8104 QualifierLoc 8105 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8106 if (!QualifierLoc) 8107 return StmtError(); 8108 } 8109 8110 // Transform the declaration name. 8111 DeclarationNameInfo NameInfo = S->getNameInfo(); 8112 if (NameInfo.getName()) { 8113 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8114 if (!NameInfo.getName()) 8115 return StmtError(); 8116 } 8117 8118 // Check whether anything changed. 8119 if (!getDerived().AlwaysRebuild() && 8120 QualifierLoc == S->getQualifierLoc() && 8121 NameInfo.getName() == S->getNameInfo().getName()) 8122 return S; 8123 8124 // Determine whether this name exists, if we can. 8125 CXXScopeSpec SS; 8126 SS.Adopt(QualifierLoc); 8127 bool Dependent = false; 8128 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8129 case Sema::IER_Exists: 8130 if (S->isIfExists()) 8131 break; 8132 8133 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8134 8135 case Sema::IER_DoesNotExist: 8136 if (S->isIfNotExists()) 8137 break; 8138 8139 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8140 8141 case Sema::IER_Dependent: 8142 Dependent = true; 8143 break; 8144 8145 case Sema::IER_Error: 8146 return StmtError(); 8147 } 8148 8149 // We need to continue with the instantiation, so do so now. 8150 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8151 if (SubStmt.isInvalid()) 8152 return StmtError(); 8153 8154 // If we have resolved the name, just transform to the substatement. 8155 if (!Dependent) 8156 return SubStmt; 8157 8158 // The name is still dependent, so build a dependent expression again. 8159 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8160 S->isIfExists(), 8161 QualifierLoc, 8162 NameInfo, 8163 SubStmt.get()); 8164 } 8165 8166 template<typename Derived> 8167 ExprResult 8168 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8169 NestedNameSpecifierLoc QualifierLoc; 8170 if (E->getQualifierLoc()) { 8171 QualifierLoc 8172 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8173 if (!QualifierLoc) 8174 return ExprError(); 8175 } 8176 8177 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8178 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8179 if (!PD) 8180 return ExprError(); 8181 8182 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8183 if (Base.isInvalid()) 8184 return ExprError(); 8185 8186 return new (SemaRef.getASTContext()) 8187 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8188 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8189 QualifierLoc, E->getMemberLoc()); 8190 } 8191 8192 template <typename Derived> 8193 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8194 MSPropertySubscriptExpr *E) { 8195 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8196 if (BaseRes.isInvalid()) 8197 return ExprError(); 8198 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8199 if (IdxRes.isInvalid()) 8200 return ExprError(); 8201 8202 if (!getDerived().AlwaysRebuild() && 8203 BaseRes.get() == E->getBase() && 8204 IdxRes.get() == E->getIdx()) 8205 return E; 8206 8207 return getDerived().RebuildArraySubscriptExpr( 8208 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8209 } 8210 8211 template <typename Derived> 8212 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8213 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8214 if (TryBlock.isInvalid()) 8215 return StmtError(); 8216 8217 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8218 if (Handler.isInvalid()) 8219 return StmtError(); 8220 8221 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8222 Handler.get() == S->getHandler()) 8223 return S; 8224 8225 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8226 TryBlock.get(), Handler.get()); 8227 } 8228 8229 template <typename Derived> 8230 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8231 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8232 if (Block.isInvalid()) 8233 return StmtError(); 8234 8235 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8236 } 8237 8238 template <typename Derived> 8239 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8240 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8241 if (FilterExpr.isInvalid()) 8242 return StmtError(); 8243 8244 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8245 if (Block.isInvalid()) 8246 return StmtError(); 8247 8248 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8249 Block.get()); 8250 } 8251 8252 template <typename Derived> 8253 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8254 if (isa<SEHFinallyStmt>(Handler)) 8255 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8256 else 8257 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8258 } 8259 8260 template<typename Derived> 8261 StmtResult 8262 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8263 return S; 8264 } 8265 8266 //===----------------------------------------------------------------------===// 8267 // OpenMP directive transformation 8268 //===----------------------------------------------------------------------===// 8269 template <typename Derived> 8270 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8271 OMPExecutableDirective *D) { 8272 8273 // Transform the clauses 8274 llvm::SmallVector<OMPClause *, 16> TClauses; 8275 ArrayRef<OMPClause *> Clauses = D->clauses(); 8276 TClauses.reserve(Clauses.size()); 8277 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8278 I != E; ++I) { 8279 if (*I) { 8280 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8281 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8282 getDerived().getSema().EndOpenMPClause(); 8283 if (Clause) 8284 TClauses.push_back(Clause); 8285 } else { 8286 TClauses.push_back(nullptr); 8287 } 8288 } 8289 StmtResult AssociatedStmt; 8290 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8291 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8292 /*CurScope=*/nullptr); 8293 StmtResult Body; 8294 { 8295 Sema::CompoundScopeRAII CompoundScope(getSema()); 8296 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8297 Body = getDerived().TransformStmt(CS); 8298 } 8299 AssociatedStmt = 8300 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8301 if (AssociatedStmt.isInvalid()) { 8302 return StmtError(); 8303 } 8304 } 8305 if (TClauses.size() != Clauses.size()) { 8306 return StmtError(); 8307 } 8308 8309 // Transform directive name for 'omp critical' directive. 8310 DeclarationNameInfo DirName; 8311 if (D->getDirectiveKind() == OMPD_critical) { 8312 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8313 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8314 } 8315 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8316 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8317 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8318 } else if (D->getDirectiveKind() == OMPD_cancel) { 8319 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8320 } 8321 8322 return getDerived().RebuildOMPExecutableDirective( 8323 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8324 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8325 } 8326 8327 template <typename Derived> 8328 StmtResult 8329 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8330 DeclarationNameInfo DirName; 8331 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8332 D->getBeginLoc()); 8333 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8334 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8335 return Res; 8336 } 8337 8338 template <typename Derived> 8339 StmtResult 8340 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8341 DeclarationNameInfo DirName; 8342 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8343 D->getBeginLoc()); 8344 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8345 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8346 return Res; 8347 } 8348 8349 template <typename Derived> 8350 StmtResult 8351 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8352 DeclarationNameInfo DirName; 8353 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8354 D->getBeginLoc()); 8355 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8356 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8357 return Res; 8358 } 8359 8360 template <typename Derived> 8361 StmtResult 8362 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8363 DeclarationNameInfo DirName; 8364 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8365 D->getBeginLoc()); 8366 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8367 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8368 return Res; 8369 } 8370 8371 template <typename Derived> 8372 StmtResult 8373 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8374 DeclarationNameInfo DirName; 8375 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8376 D->getBeginLoc()); 8377 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8378 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8379 return Res; 8380 } 8381 8382 template <typename Derived> 8383 StmtResult 8384 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8385 DeclarationNameInfo DirName; 8386 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8387 D->getBeginLoc()); 8388 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8389 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8390 return Res; 8391 } 8392 8393 template <typename Derived> 8394 StmtResult 8395 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8396 DeclarationNameInfo DirName; 8397 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8398 D->getBeginLoc()); 8399 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8400 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8401 return Res; 8402 } 8403 8404 template <typename Derived> 8405 StmtResult 8406 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8407 DeclarationNameInfo DirName; 8408 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8409 D->getBeginLoc()); 8410 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8411 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8412 return Res; 8413 } 8414 8415 template <typename Derived> 8416 StmtResult 8417 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8418 getDerived().getSema().StartOpenMPDSABlock( 8419 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8420 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8421 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8422 return Res; 8423 } 8424 8425 template <typename Derived> 8426 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8427 OMPParallelForDirective *D) { 8428 DeclarationNameInfo DirName; 8429 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8430 nullptr, D->getBeginLoc()); 8431 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8432 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8433 return Res; 8434 } 8435 8436 template <typename Derived> 8437 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8438 OMPParallelForSimdDirective *D) { 8439 DeclarationNameInfo DirName; 8440 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8441 nullptr, D->getBeginLoc()); 8442 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8443 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8444 return Res; 8445 } 8446 8447 template <typename Derived> 8448 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8449 OMPParallelMasterDirective *D) { 8450 DeclarationNameInfo DirName; 8451 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8452 nullptr, D->getBeginLoc()); 8453 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8454 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8455 return Res; 8456 } 8457 8458 template <typename Derived> 8459 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8460 OMPParallelSectionsDirective *D) { 8461 DeclarationNameInfo DirName; 8462 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8463 nullptr, D->getBeginLoc()); 8464 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8465 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8466 return Res; 8467 } 8468 8469 template <typename Derived> 8470 StmtResult 8471 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8472 DeclarationNameInfo DirName; 8473 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8474 D->getBeginLoc()); 8475 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8476 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8477 return Res; 8478 } 8479 8480 template <typename Derived> 8481 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8482 OMPTaskyieldDirective *D) { 8483 DeclarationNameInfo DirName; 8484 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8485 D->getBeginLoc()); 8486 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8487 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8488 return Res; 8489 } 8490 8491 template <typename Derived> 8492 StmtResult 8493 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8494 DeclarationNameInfo DirName; 8495 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8496 D->getBeginLoc()); 8497 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8498 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8499 return Res; 8500 } 8501 8502 template <typename Derived> 8503 StmtResult 8504 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8505 DeclarationNameInfo DirName; 8506 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8507 D->getBeginLoc()); 8508 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8509 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8510 return Res; 8511 } 8512 8513 template <typename Derived> 8514 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8515 OMPTaskgroupDirective *D) { 8516 DeclarationNameInfo DirName; 8517 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8518 D->getBeginLoc()); 8519 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8520 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8521 return Res; 8522 } 8523 8524 template <typename Derived> 8525 StmtResult 8526 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8527 DeclarationNameInfo DirName; 8528 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8529 D->getBeginLoc()); 8530 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8531 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8532 return Res; 8533 } 8534 8535 template <typename Derived> 8536 StmtResult 8537 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8538 DeclarationNameInfo DirName; 8539 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8540 D->getBeginLoc()); 8541 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8542 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8543 return Res; 8544 } 8545 8546 template <typename Derived> 8547 StmtResult 8548 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8549 DeclarationNameInfo DirName; 8550 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8551 D->getBeginLoc()); 8552 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8553 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8554 return Res; 8555 } 8556 8557 template <typename Derived> 8558 StmtResult 8559 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8560 DeclarationNameInfo DirName; 8561 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8562 D->getBeginLoc()); 8563 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8564 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8565 return Res; 8566 } 8567 8568 template <typename Derived> 8569 StmtResult 8570 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8571 DeclarationNameInfo DirName; 8572 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8573 D->getBeginLoc()); 8574 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8575 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8576 return Res; 8577 } 8578 8579 template <typename Derived> 8580 StmtResult 8581 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8582 DeclarationNameInfo DirName; 8583 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8584 D->getBeginLoc()); 8585 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8586 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8587 return Res; 8588 } 8589 8590 template <typename Derived> 8591 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8592 OMPTargetDataDirective *D) { 8593 DeclarationNameInfo DirName; 8594 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8595 D->getBeginLoc()); 8596 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8597 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8598 return Res; 8599 } 8600 8601 template <typename Derived> 8602 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8603 OMPTargetEnterDataDirective *D) { 8604 DeclarationNameInfo DirName; 8605 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8606 nullptr, D->getBeginLoc()); 8607 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8608 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8609 return Res; 8610 } 8611 8612 template <typename Derived> 8613 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8614 OMPTargetExitDataDirective *D) { 8615 DeclarationNameInfo DirName; 8616 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8617 nullptr, D->getBeginLoc()); 8618 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8619 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8620 return Res; 8621 } 8622 8623 template <typename Derived> 8624 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8625 OMPTargetParallelDirective *D) { 8626 DeclarationNameInfo DirName; 8627 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8628 nullptr, D->getBeginLoc()); 8629 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8630 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8631 return Res; 8632 } 8633 8634 template <typename Derived> 8635 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8636 OMPTargetParallelForDirective *D) { 8637 DeclarationNameInfo DirName; 8638 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8639 nullptr, D->getBeginLoc()); 8640 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8641 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8642 return Res; 8643 } 8644 8645 template <typename Derived> 8646 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8647 OMPTargetUpdateDirective *D) { 8648 DeclarationNameInfo DirName; 8649 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8650 nullptr, D->getBeginLoc()); 8651 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8652 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8653 return Res; 8654 } 8655 8656 template <typename Derived> 8657 StmtResult 8658 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8659 DeclarationNameInfo DirName; 8660 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8661 D->getBeginLoc()); 8662 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8663 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8664 return Res; 8665 } 8666 8667 template <typename Derived> 8668 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8669 OMPCancellationPointDirective *D) { 8670 DeclarationNameInfo DirName; 8671 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8672 nullptr, D->getBeginLoc()); 8673 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8674 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8675 return Res; 8676 } 8677 8678 template <typename Derived> 8679 StmtResult 8680 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8681 DeclarationNameInfo DirName; 8682 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8683 D->getBeginLoc()); 8684 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8685 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8686 return Res; 8687 } 8688 8689 template <typename Derived> 8690 StmtResult 8691 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8692 DeclarationNameInfo DirName; 8693 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8694 D->getBeginLoc()); 8695 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8696 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8697 return Res; 8698 } 8699 8700 template <typename Derived> 8701 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8702 OMPTaskLoopSimdDirective *D) { 8703 DeclarationNameInfo DirName; 8704 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8705 nullptr, D->getBeginLoc()); 8706 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8707 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8708 return Res; 8709 } 8710 8711 template <typename Derived> 8712 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8713 OMPMasterTaskLoopDirective *D) { 8714 DeclarationNameInfo DirName; 8715 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8716 nullptr, D->getBeginLoc()); 8717 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8718 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8719 return Res; 8720 } 8721 8722 template <typename Derived> 8723 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8724 OMPMasterTaskLoopSimdDirective *D) { 8725 DeclarationNameInfo DirName; 8726 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8727 nullptr, D->getBeginLoc()); 8728 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8729 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8730 return Res; 8731 } 8732 8733 template <typename Derived> 8734 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8735 OMPParallelMasterTaskLoopDirective *D) { 8736 DeclarationNameInfo DirName; 8737 getDerived().getSema().StartOpenMPDSABlock( 8738 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8739 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8740 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8741 return Res; 8742 } 8743 8744 template <typename Derived> 8745 StmtResult 8746 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8747 OMPParallelMasterTaskLoopSimdDirective *D) { 8748 DeclarationNameInfo DirName; 8749 getDerived().getSema().StartOpenMPDSABlock( 8750 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8751 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8752 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8753 return Res; 8754 } 8755 8756 template <typename Derived> 8757 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8758 OMPDistributeDirective *D) { 8759 DeclarationNameInfo DirName; 8760 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8761 D->getBeginLoc()); 8762 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8763 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8764 return Res; 8765 } 8766 8767 template <typename Derived> 8768 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8769 OMPDistributeParallelForDirective *D) { 8770 DeclarationNameInfo DirName; 8771 getDerived().getSema().StartOpenMPDSABlock( 8772 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8773 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8774 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8775 return Res; 8776 } 8777 8778 template <typename Derived> 8779 StmtResult 8780 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8781 OMPDistributeParallelForSimdDirective *D) { 8782 DeclarationNameInfo DirName; 8783 getDerived().getSema().StartOpenMPDSABlock( 8784 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8785 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8786 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8787 return Res; 8788 } 8789 8790 template <typename Derived> 8791 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8792 OMPDistributeSimdDirective *D) { 8793 DeclarationNameInfo DirName; 8794 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8795 nullptr, D->getBeginLoc()); 8796 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8797 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8798 return Res; 8799 } 8800 8801 template <typename Derived> 8802 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8803 OMPTargetParallelForSimdDirective *D) { 8804 DeclarationNameInfo DirName; 8805 getDerived().getSema().StartOpenMPDSABlock( 8806 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8807 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8808 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8809 return Res; 8810 } 8811 8812 template <typename Derived> 8813 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8814 OMPTargetSimdDirective *D) { 8815 DeclarationNameInfo DirName; 8816 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8817 D->getBeginLoc()); 8818 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8819 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8820 return Res; 8821 } 8822 8823 template <typename Derived> 8824 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8825 OMPTeamsDistributeDirective *D) { 8826 DeclarationNameInfo DirName; 8827 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8828 nullptr, D->getBeginLoc()); 8829 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8830 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8831 return Res; 8832 } 8833 8834 template <typename Derived> 8835 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8836 OMPTeamsDistributeSimdDirective *D) { 8837 DeclarationNameInfo DirName; 8838 getDerived().getSema().StartOpenMPDSABlock( 8839 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8840 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8841 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8842 return Res; 8843 } 8844 8845 template <typename Derived> 8846 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8847 OMPTeamsDistributeParallelForSimdDirective *D) { 8848 DeclarationNameInfo DirName; 8849 getDerived().getSema().StartOpenMPDSABlock( 8850 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8851 D->getBeginLoc()); 8852 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8853 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8854 return Res; 8855 } 8856 8857 template <typename Derived> 8858 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8859 OMPTeamsDistributeParallelForDirective *D) { 8860 DeclarationNameInfo DirName; 8861 getDerived().getSema().StartOpenMPDSABlock( 8862 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8863 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8864 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8865 return Res; 8866 } 8867 8868 template <typename Derived> 8869 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8870 OMPTargetTeamsDirective *D) { 8871 DeclarationNameInfo DirName; 8872 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8873 nullptr, D->getBeginLoc()); 8874 auto Res = getDerived().TransformOMPExecutableDirective(D); 8875 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8876 return Res; 8877 } 8878 8879 template <typename Derived> 8880 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8881 OMPTargetTeamsDistributeDirective *D) { 8882 DeclarationNameInfo DirName; 8883 getDerived().getSema().StartOpenMPDSABlock( 8884 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8885 auto Res = getDerived().TransformOMPExecutableDirective(D); 8886 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8887 return Res; 8888 } 8889 8890 template <typename Derived> 8891 StmtResult 8892 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8893 OMPTargetTeamsDistributeParallelForDirective *D) { 8894 DeclarationNameInfo DirName; 8895 getDerived().getSema().StartOpenMPDSABlock( 8896 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8897 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>:: 8905 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8906 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8907 DeclarationNameInfo DirName; 8908 getDerived().getSema().StartOpenMPDSABlock( 8909 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8910 D->getBeginLoc()); 8911 auto Res = getDerived().TransformOMPExecutableDirective(D); 8912 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8913 return Res; 8914 } 8915 8916 template <typename Derived> 8917 StmtResult 8918 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8919 OMPTargetTeamsDistributeSimdDirective *D) { 8920 DeclarationNameInfo DirName; 8921 getDerived().getSema().StartOpenMPDSABlock( 8922 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8923 auto Res = getDerived().TransformOMPExecutableDirective(D); 8924 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8925 return Res; 8926 } 8927 8928 8929 //===----------------------------------------------------------------------===// 8930 // OpenMP clause transformation 8931 //===----------------------------------------------------------------------===// 8932 template <typename Derived> 8933 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8934 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8935 if (Cond.isInvalid()) 8936 return nullptr; 8937 return getDerived().RebuildOMPIfClause( 8938 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8939 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8940 } 8941 8942 template <typename Derived> 8943 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8944 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8945 if (Cond.isInvalid()) 8946 return nullptr; 8947 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8948 C->getLParenLoc(), C->getEndLoc()); 8949 } 8950 8951 template <typename Derived> 8952 OMPClause * 8953 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8954 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8955 if (NumThreads.isInvalid()) 8956 return nullptr; 8957 return getDerived().RebuildOMPNumThreadsClause( 8958 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8959 } 8960 8961 template <typename Derived> 8962 OMPClause * 8963 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8964 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8965 if (E.isInvalid()) 8966 return nullptr; 8967 return getDerived().RebuildOMPSafelenClause( 8968 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8969 } 8970 8971 template <typename Derived> 8972 OMPClause * 8973 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8974 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8975 if (E.isInvalid()) 8976 return nullptr; 8977 return getDerived().RebuildOMPAllocatorClause( 8978 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8979 } 8980 8981 template <typename Derived> 8982 OMPClause * 8983 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8984 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8985 if (E.isInvalid()) 8986 return nullptr; 8987 return getDerived().RebuildOMPSimdlenClause( 8988 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8989 } 8990 8991 template <typename Derived> 8992 OMPClause * 8993 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8994 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8995 if (E.isInvalid()) 8996 return nullptr; 8997 return getDerived().RebuildOMPCollapseClause( 8998 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8999 } 9000 9001 template <typename Derived> 9002 OMPClause * 9003 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9004 return getDerived().RebuildOMPDefaultClause( 9005 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9006 C->getLParenLoc(), C->getEndLoc()); 9007 } 9008 9009 template <typename Derived> 9010 OMPClause * 9011 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9012 return getDerived().RebuildOMPProcBindClause( 9013 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9014 C->getLParenLoc(), C->getEndLoc()); 9015 } 9016 9017 template <typename Derived> 9018 OMPClause * 9019 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9020 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9021 if (E.isInvalid()) 9022 return nullptr; 9023 return getDerived().RebuildOMPScheduleClause( 9024 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9025 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9026 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9027 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9028 } 9029 9030 template <typename Derived> 9031 OMPClause * 9032 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9033 ExprResult E; 9034 if (auto *Num = C->getNumForLoops()) { 9035 E = getDerived().TransformExpr(Num); 9036 if (E.isInvalid()) 9037 return nullptr; 9038 } 9039 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9040 C->getLParenLoc(), E.get()); 9041 } 9042 9043 template <typename Derived> 9044 OMPClause * 9045 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9046 ExprResult E; 9047 if (Expr *Evt = C->getEventHandler()) { 9048 E = getDerived().TransformExpr(Evt); 9049 if (E.isInvalid()) 9050 return nullptr; 9051 } 9052 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9053 C->getLParenLoc(), C->getEndLoc()); 9054 } 9055 9056 template <typename Derived> 9057 OMPClause * 9058 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9059 // No need to rebuild this clause, no template-dependent parameters. 9060 return C; 9061 } 9062 9063 template <typename Derived> 9064 OMPClause * 9065 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9066 // No need to rebuild this clause, no template-dependent parameters. 9067 return C; 9068 } 9069 9070 template <typename Derived> 9071 OMPClause * 9072 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9073 // No need to rebuild this clause, no template-dependent parameters. 9074 return C; 9075 } 9076 9077 template <typename Derived> 9078 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9079 // No need to rebuild this clause, no template-dependent parameters. 9080 return C; 9081 } 9082 9083 template <typename Derived> 9084 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9085 // No need to rebuild this clause, no template-dependent parameters. 9086 return C; 9087 } 9088 9089 template <typename Derived> 9090 OMPClause * 9091 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9092 // No need to rebuild this clause, no template-dependent parameters. 9093 return C; 9094 } 9095 9096 template <typename Derived> 9097 OMPClause * 9098 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9099 // No need to rebuild this clause, no template-dependent parameters. 9100 return C; 9101 } 9102 9103 template <typename Derived> 9104 OMPClause * 9105 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9106 // No need to rebuild this clause, no template-dependent parameters. 9107 return C; 9108 } 9109 9110 template <typename Derived> 9111 OMPClause * 9112 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9113 // No need to rebuild this clause, no template-dependent parameters. 9114 return C; 9115 } 9116 9117 template <typename Derived> 9118 OMPClause * 9119 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9120 // No need to rebuild this clause, no template-dependent parameters. 9121 return C; 9122 } 9123 9124 template <typename Derived> 9125 OMPClause * 9126 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9127 // No need to rebuild this clause, no template-dependent parameters. 9128 return C; 9129 } 9130 9131 template <typename Derived> 9132 OMPClause * 9133 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9134 // No need to rebuild this clause, no template-dependent parameters. 9135 return C; 9136 } 9137 9138 template <typename Derived> 9139 OMPClause * 9140 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9141 // No need to rebuild this clause, no template-dependent parameters. 9142 return C; 9143 } 9144 9145 template <typename Derived> 9146 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9147 // No need to rebuild this clause, no template-dependent parameters. 9148 return C; 9149 } 9150 9151 template <typename Derived> 9152 OMPClause * 9153 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9154 // No need to rebuild this clause, no template-dependent parameters. 9155 return C; 9156 } 9157 9158 template <typename Derived> 9159 OMPClause * 9160 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9161 // No need to rebuild this clause, no template-dependent parameters. 9162 return C; 9163 } 9164 9165 template <typename Derived> 9166 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9167 OMPUnifiedAddressClause *C) { 9168 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9169 } 9170 9171 template <typename Derived> 9172 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9173 OMPUnifiedSharedMemoryClause *C) { 9174 llvm_unreachable( 9175 "unified_shared_memory clause cannot appear in dependent context"); 9176 } 9177 9178 template <typename Derived> 9179 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9180 OMPReverseOffloadClause *C) { 9181 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9182 } 9183 9184 template <typename Derived> 9185 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9186 OMPDynamicAllocatorsClause *C) { 9187 llvm_unreachable( 9188 "dynamic_allocators clause cannot appear in dependent context"); 9189 } 9190 9191 template <typename Derived> 9192 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9193 OMPAtomicDefaultMemOrderClause *C) { 9194 llvm_unreachable( 9195 "atomic_default_mem_order clause cannot appear in dependent context"); 9196 } 9197 9198 template <typename Derived> 9199 OMPClause * 9200 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9201 llvm::SmallVector<Expr *, 16> Vars; 9202 Vars.reserve(C->varlist_size()); 9203 for (auto *VE : C->varlists()) { 9204 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9205 if (EVar.isInvalid()) 9206 return nullptr; 9207 Vars.push_back(EVar.get()); 9208 } 9209 return getDerived().RebuildOMPPrivateClause( 9210 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9211 } 9212 9213 template <typename Derived> 9214 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9215 OMPFirstprivateClause *C) { 9216 llvm::SmallVector<Expr *, 16> Vars; 9217 Vars.reserve(C->varlist_size()); 9218 for (auto *VE : C->varlists()) { 9219 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9220 if (EVar.isInvalid()) 9221 return nullptr; 9222 Vars.push_back(EVar.get()); 9223 } 9224 return getDerived().RebuildOMPFirstprivateClause( 9225 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9226 } 9227 9228 template <typename Derived> 9229 OMPClause * 9230 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9231 llvm::SmallVector<Expr *, 16> Vars; 9232 Vars.reserve(C->varlist_size()); 9233 for (auto *VE : C->varlists()) { 9234 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9235 if (EVar.isInvalid()) 9236 return nullptr; 9237 Vars.push_back(EVar.get()); 9238 } 9239 return getDerived().RebuildOMPLastprivateClause( 9240 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9241 C->getLParenLoc(), C->getEndLoc()); 9242 } 9243 9244 template <typename Derived> 9245 OMPClause * 9246 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9247 llvm::SmallVector<Expr *, 16> Vars; 9248 Vars.reserve(C->varlist_size()); 9249 for (auto *VE : C->varlists()) { 9250 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9251 if (EVar.isInvalid()) 9252 return nullptr; 9253 Vars.push_back(EVar.get()); 9254 } 9255 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9256 C->getLParenLoc(), C->getEndLoc()); 9257 } 9258 9259 template <typename Derived> 9260 OMPClause * 9261 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9262 llvm::SmallVector<Expr *, 16> Vars; 9263 Vars.reserve(C->varlist_size()); 9264 for (auto *VE : C->varlists()) { 9265 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9266 if (EVar.isInvalid()) 9267 return nullptr; 9268 Vars.push_back(EVar.get()); 9269 } 9270 CXXScopeSpec ReductionIdScopeSpec; 9271 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9272 9273 DeclarationNameInfo NameInfo = C->getNameInfo(); 9274 if (NameInfo.getName()) { 9275 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9276 if (!NameInfo.getName()) 9277 return nullptr; 9278 } 9279 // Build a list of all UDR decls with the same names ranged by the Scopes. 9280 // The Scope boundary is a duplication of the previous decl. 9281 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9282 for (auto *E : C->reduction_ops()) { 9283 // Transform all the decls. 9284 if (E) { 9285 auto *ULE = cast<UnresolvedLookupExpr>(E); 9286 UnresolvedSet<8> Decls; 9287 for (auto *D : ULE->decls()) { 9288 NamedDecl *InstD = 9289 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9290 Decls.addDecl(InstD, InstD->getAccess()); 9291 } 9292 UnresolvedReductions.push_back( 9293 UnresolvedLookupExpr::Create( 9294 SemaRef.Context, /*NamingClass=*/nullptr, 9295 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9296 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9297 Decls.begin(), Decls.end())); 9298 } else 9299 UnresolvedReductions.push_back(nullptr); 9300 } 9301 return getDerived().RebuildOMPReductionClause( 9302 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9303 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9304 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9305 } 9306 9307 template <typename Derived> 9308 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9309 OMPTaskReductionClause *C) { 9310 llvm::SmallVector<Expr *, 16> Vars; 9311 Vars.reserve(C->varlist_size()); 9312 for (auto *VE : C->varlists()) { 9313 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9314 if (EVar.isInvalid()) 9315 return nullptr; 9316 Vars.push_back(EVar.get()); 9317 } 9318 CXXScopeSpec ReductionIdScopeSpec; 9319 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9320 9321 DeclarationNameInfo NameInfo = C->getNameInfo(); 9322 if (NameInfo.getName()) { 9323 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9324 if (!NameInfo.getName()) 9325 return nullptr; 9326 } 9327 // Build a list of all UDR decls with the same names ranged by the Scopes. 9328 // The Scope boundary is a duplication of the previous decl. 9329 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9330 for (auto *E : C->reduction_ops()) { 9331 // Transform all the decls. 9332 if (E) { 9333 auto *ULE = cast<UnresolvedLookupExpr>(E); 9334 UnresolvedSet<8> Decls; 9335 for (auto *D : ULE->decls()) { 9336 NamedDecl *InstD = 9337 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9338 Decls.addDecl(InstD, InstD->getAccess()); 9339 } 9340 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9341 SemaRef.Context, /*NamingClass=*/nullptr, 9342 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9343 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9344 } else 9345 UnresolvedReductions.push_back(nullptr); 9346 } 9347 return getDerived().RebuildOMPTaskReductionClause( 9348 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9349 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9350 } 9351 9352 template <typename Derived> 9353 OMPClause * 9354 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9355 llvm::SmallVector<Expr *, 16> Vars; 9356 Vars.reserve(C->varlist_size()); 9357 for (auto *VE : C->varlists()) { 9358 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9359 if (EVar.isInvalid()) 9360 return nullptr; 9361 Vars.push_back(EVar.get()); 9362 } 9363 CXXScopeSpec ReductionIdScopeSpec; 9364 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9365 9366 DeclarationNameInfo NameInfo = C->getNameInfo(); 9367 if (NameInfo.getName()) { 9368 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9369 if (!NameInfo.getName()) 9370 return nullptr; 9371 } 9372 // Build a list of all UDR decls with the same names ranged by the Scopes. 9373 // The Scope boundary is a duplication of the previous decl. 9374 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9375 for (auto *E : C->reduction_ops()) { 9376 // Transform all the decls. 9377 if (E) { 9378 auto *ULE = cast<UnresolvedLookupExpr>(E); 9379 UnresolvedSet<8> Decls; 9380 for (auto *D : ULE->decls()) { 9381 NamedDecl *InstD = 9382 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9383 Decls.addDecl(InstD, InstD->getAccess()); 9384 } 9385 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9386 SemaRef.Context, /*NamingClass=*/nullptr, 9387 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9388 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9389 } else 9390 UnresolvedReductions.push_back(nullptr); 9391 } 9392 return getDerived().RebuildOMPInReductionClause( 9393 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9394 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9395 } 9396 9397 template <typename Derived> 9398 OMPClause * 9399 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9400 llvm::SmallVector<Expr *, 16> Vars; 9401 Vars.reserve(C->varlist_size()); 9402 for (auto *VE : C->varlists()) { 9403 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9404 if (EVar.isInvalid()) 9405 return nullptr; 9406 Vars.push_back(EVar.get()); 9407 } 9408 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9409 if (Step.isInvalid()) 9410 return nullptr; 9411 return getDerived().RebuildOMPLinearClause( 9412 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9413 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9414 } 9415 9416 template <typename Derived> 9417 OMPClause * 9418 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9419 llvm::SmallVector<Expr *, 16> Vars; 9420 Vars.reserve(C->varlist_size()); 9421 for (auto *VE : C->varlists()) { 9422 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9423 if (EVar.isInvalid()) 9424 return nullptr; 9425 Vars.push_back(EVar.get()); 9426 } 9427 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9428 if (Alignment.isInvalid()) 9429 return nullptr; 9430 return getDerived().RebuildOMPAlignedClause( 9431 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9432 C->getColonLoc(), C->getEndLoc()); 9433 } 9434 9435 template <typename Derived> 9436 OMPClause * 9437 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9438 llvm::SmallVector<Expr *, 16> Vars; 9439 Vars.reserve(C->varlist_size()); 9440 for (auto *VE : C->varlists()) { 9441 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9442 if (EVar.isInvalid()) 9443 return nullptr; 9444 Vars.push_back(EVar.get()); 9445 } 9446 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9447 C->getLParenLoc(), C->getEndLoc()); 9448 } 9449 9450 template <typename Derived> 9451 OMPClause * 9452 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9453 llvm::SmallVector<Expr *, 16> Vars; 9454 Vars.reserve(C->varlist_size()); 9455 for (auto *VE : C->varlists()) { 9456 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9457 if (EVar.isInvalid()) 9458 return nullptr; 9459 Vars.push_back(EVar.get()); 9460 } 9461 return getDerived().RebuildOMPCopyprivateClause( 9462 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9463 } 9464 9465 template <typename Derived> 9466 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9467 llvm::SmallVector<Expr *, 16> Vars; 9468 Vars.reserve(C->varlist_size()); 9469 for (auto *VE : C->varlists()) { 9470 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9471 if (EVar.isInvalid()) 9472 return nullptr; 9473 Vars.push_back(EVar.get()); 9474 } 9475 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9476 C->getLParenLoc(), C->getEndLoc()); 9477 } 9478 9479 template <typename Derived> 9480 OMPClause * 9481 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9482 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9483 if (E.isInvalid()) 9484 return nullptr; 9485 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9486 C->getLParenLoc(), C->getEndLoc()); 9487 } 9488 9489 template <typename Derived> 9490 OMPClause * 9491 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9492 llvm::SmallVector<Expr *, 16> Vars; 9493 Expr *DepModifier = C->getModifier(); 9494 if (DepModifier) { 9495 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9496 if (DepModRes.isInvalid()) 9497 return nullptr; 9498 DepModifier = DepModRes.get(); 9499 } 9500 Vars.reserve(C->varlist_size()); 9501 for (auto *VE : C->varlists()) { 9502 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9503 if (EVar.isInvalid()) 9504 return nullptr; 9505 Vars.push_back(EVar.get()); 9506 } 9507 return getDerived().RebuildOMPDependClause( 9508 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9509 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9510 C->getEndLoc()); 9511 } 9512 9513 template <typename Derived> 9514 OMPClause * 9515 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9516 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9517 if (E.isInvalid()) 9518 return nullptr; 9519 return getDerived().RebuildOMPDeviceClause( 9520 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9521 C->getModifierLoc(), C->getEndLoc()); 9522 } 9523 9524 template <typename Derived, class T> 9525 bool transformOMPMappableExprListClause( 9526 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9527 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9528 DeclarationNameInfo &MapperIdInfo, 9529 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9530 // Transform expressions in the list. 9531 Vars.reserve(C->varlist_size()); 9532 for (auto *VE : C->varlists()) { 9533 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9534 if (EVar.isInvalid()) 9535 return true; 9536 Vars.push_back(EVar.get()); 9537 } 9538 // Transform mapper scope specifier and identifier. 9539 NestedNameSpecifierLoc QualifierLoc; 9540 if (C->getMapperQualifierLoc()) { 9541 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9542 C->getMapperQualifierLoc()); 9543 if (!QualifierLoc) 9544 return true; 9545 } 9546 MapperIdScopeSpec.Adopt(QualifierLoc); 9547 MapperIdInfo = C->getMapperIdInfo(); 9548 if (MapperIdInfo.getName()) { 9549 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9550 if (!MapperIdInfo.getName()) 9551 return true; 9552 } 9553 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9554 // the previous user-defined mapper lookup in dependent environment. 9555 for (auto *E : C->mapperlists()) { 9556 // Transform all the decls. 9557 if (E) { 9558 auto *ULE = cast<UnresolvedLookupExpr>(E); 9559 UnresolvedSet<8> Decls; 9560 for (auto *D : ULE->decls()) { 9561 NamedDecl *InstD = 9562 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9563 Decls.addDecl(InstD, InstD->getAccess()); 9564 } 9565 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9566 TT.getSema().Context, /*NamingClass=*/nullptr, 9567 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9568 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9569 Decls.end())); 9570 } else { 9571 UnresolvedMappers.push_back(nullptr); 9572 } 9573 } 9574 return false; 9575 } 9576 9577 template <typename Derived> 9578 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9579 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9580 llvm::SmallVector<Expr *, 16> Vars; 9581 CXXScopeSpec MapperIdScopeSpec; 9582 DeclarationNameInfo MapperIdInfo; 9583 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9584 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9585 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9586 return nullptr; 9587 return getDerived().RebuildOMPMapClause( 9588 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9589 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9590 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9591 } 9592 9593 template <typename Derived> 9594 OMPClause * 9595 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9596 Expr *Allocator = C->getAllocator(); 9597 if (Allocator) { 9598 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9599 if (AllocatorRes.isInvalid()) 9600 return nullptr; 9601 Allocator = AllocatorRes.get(); 9602 } 9603 llvm::SmallVector<Expr *, 16> Vars; 9604 Vars.reserve(C->varlist_size()); 9605 for (auto *VE : C->varlists()) { 9606 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9607 if (EVar.isInvalid()) 9608 return nullptr; 9609 Vars.push_back(EVar.get()); 9610 } 9611 return getDerived().RebuildOMPAllocateClause( 9612 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9613 C->getEndLoc()); 9614 } 9615 9616 template <typename Derived> 9617 OMPClause * 9618 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9619 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9620 if (E.isInvalid()) 9621 return nullptr; 9622 return getDerived().RebuildOMPNumTeamsClause( 9623 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9624 } 9625 9626 template <typename Derived> 9627 OMPClause * 9628 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9629 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9630 if (E.isInvalid()) 9631 return nullptr; 9632 return getDerived().RebuildOMPThreadLimitClause( 9633 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9634 } 9635 9636 template <typename Derived> 9637 OMPClause * 9638 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9639 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9640 if (E.isInvalid()) 9641 return nullptr; 9642 return getDerived().RebuildOMPPriorityClause( 9643 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9644 } 9645 9646 template <typename Derived> 9647 OMPClause * 9648 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9649 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9650 if (E.isInvalid()) 9651 return nullptr; 9652 return getDerived().RebuildOMPGrainsizeClause( 9653 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9654 } 9655 9656 template <typename Derived> 9657 OMPClause * 9658 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9659 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9660 if (E.isInvalid()) 9661 return nullptr; 9662 return getDerived().RebuildOMPNumTasksClause( 9663 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9664 } 9665 9666 template <typename Derived> 9667 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9668 ExprResult E = getDerived().TransformExpr(C->getHint()); 9669 if (E.isInvalid()) 9670 return nullptr; 9671 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9672 C->getLParenLoc(), C->getEndLoc()); 9673 } 9674 9675 template <typename Derived> 9676 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9677 OMPDistScheduleClause *C) { 9678 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9679 if (E.isInvalid()) 9680 return nullptr; 9681 return getDerived().RebuildOMPDistScheduleClause( 9682 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9683 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9684 } 9685 9686 template <typename Derived> 9687 OMPClause * 9688 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9689 // Rebuild Defaultmap Clause since we need to invoke the checking of 9690 // defaultmap(none:variable-category) after template initialization. 9691 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9692 C->getDefaultmapKind(), 9693 C->getBeginLoc(), 9694 C->getLParenLoc(), 9695 C->getDefaultmapModifierLoc(), 9696 C->getDefaultmapKindLoc(), 9697 C->getEndLoc()); 9698 } 9699 9700 template <typename Derived> 9701 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9702 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9703 llvm::SmallVector<Expr *, 16> Vars; 9704 CXXScopeSpec MapperIdScopeSpec; 9705 DeclarationNameInfo MapperIdInfo; 9706 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9707 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9708 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9709 return nullptr; 9710 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9711 Locs, UnresolvedMappers); 9712 } 9713 9714 template <typename Derived> 9715 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9716 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9717 llvm::SmallVector<Expr *, 16> Vars; 9718 CXXScopeSpec MapperIdScopeSpec; 9719 DeclarationNameInfo MapperIdInfo; 9720 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9721 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9722 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9723 return nullptr; 9724 return getDerived().RebuildOMPFromClause( 9725 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9726 } 9727 9728 template <typename Derived> 9729 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9730 OMPUseDevicePtrClause *C) { 9731 llvm::SmallVector<Expr *, 16> Vars; 9732 Vars.reserve(C->varlist_size()); 9733 for (auto *VE : C->varlists()) { 9734 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9735 if (EVar.isInvalid()) 9736 return nullptr; 9737 Vars.push_back(EVar.get()); 9738 } 9739 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9740 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9741 } 9742 9743 template <typename Derived> 9744 OMPClause * 9745 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9746 llvm::SmallVector<Expr *, 16> Vars; 9747 Vars.reserve(C->varlist_size()); 9748 for (auto *VE : C->varlists()) { 9749 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9750 if (EVar.isInvalid()) 9751 return nullptr; 9752 Vars.push_back(EVar.get()); 9753 } 9754 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9755 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9756 } 9757 9758 template <typename Derived> 9759 OMPClause * 9760 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9761 llvm::SmallVector<Expr *, 16> Vars; 9762 Vars.reserve(C->varlist_size()); 9763 for (auto *VE : C->varlists()) { 9764 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9765 if (EVar.isInvalid()) 9766 return nullptr; 9767 Vars.push_back(EVar.get()); 9768 } 9769 return getDerived().RebuildOMPNontemporalClause( 9770 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9771 } 9772 9773 template <typename Derived> 9774 OMPClause * 9775 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9776 llvm::SmallVector<Expr *, 16> Vars; 9777 Vars.reserve(C->varlist_size()); 9778 for (auto *VE : C->varlists()) { 9779 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9780 if (EVar.isInvalid()) 9781 return nullptr; 9782 Vars.push_back(EVar.get()); 9783 } 9784 return getDerived().RebuildOMPInclusiveClause( 9785 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9786 } 9787 9788 template <typename Derived> 9789 OMPClause * 9790 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9791 llvm::SmallVector<Expr *, 16> Vars; 9792 Vars.reserve(C->varlist_size()); 9793 for (auto *VE : C->varlists()) { 9794 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9795 if (EVar.isInvalid()) 9796 return nullptr; 9797 Vars.push_back(EVar.get()); 9798 } 9799 return getDerived().RebuildOMPExclusiveClause( 9800 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9801 } 9802 9803 template <typename Derived> 9804 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9805 OMPUsesAllocatorsClause *C) { 9806 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9807 Data.reserve(C->getNumberOfAllocators()); 9808 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9809 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9810 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9811 if (Allocator.isInvalid()) 9812 continue; 9813 ExprResult AllocatorTraits; 9814 if (Expr *AT = D.AllocatorTraits) { 9815 AllocatorTraits = getDerived().TransformExpr(AT); 9816 if (AllocatorTraits.isInvalid()) 9817 continue; 9818 } 9819 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9820 NewD.Allocator = Allocator.get(); 9821 NewD.AllocatorTraits = AllocatorTraits.get(); 9822 NewD.LParenLoc = D.LParenLoc; 9823 NewD.RParenLoc = D.RParenLoc; 9824 } 9825 return getDerived().RebuildOMPUsesAllocatorsClause( 9826 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9827 } 9828 9829 template <typename Derived> 9830 OMPClause * 9831 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9832 SmallVector<Expr *, 4> Locators; 9833 Locators.reserve(C->varlist_size()); 9834 ExprResult ModifierRes; 9835 if (Expr *Modifier = C->getModifier()) { 9836 ModifierRes = getDerived().TransformExpr(Modifier); 9837 if (ModifierRes.isInvalid()) 9838 return nullptr; 9839 } 9840 for (Expr *E : C->varlists()) { 9841 ExprResult Locator = getDerived().TransformExpr(E); 9842 if (Locator.isInvalid()) 9843 continue; 9844 Locators.push_back(Locator.get()); 9845 } 9846 return getDerived().RebuildOMPAffinityClause( 9847 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9848 ModifierRes.get(), Locators); 9849 } 9850 9851 template <typename Derived> 9852 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9853 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9854 C->getBeginLoc(), C->getLParenLoc(), 9855 C->getEndLoc()); 9856 } 9857 9858 //===----------------------------------------------------------------------===// 9859 // Expression transformation 9860 //===----------------------------------------------------------------------===// 9861 template<typename Derived> 9862 ExprResult 9863 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9864 return TransformExpr(E->getSubExpr()); 9865 } 9866 9867 template<typename Derived> 9868 ExprResult 9869 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9870 if (!E->isTypeDependent()) 9871 return E; 9872 9873 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9874 E->getIdentKind()); 9875 } 9876 9877 template<typename Derived> 9878 ExprResult 9879 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9880 NestedNameSpecifierLoc QualifierLoc; 9881 if (E->getQualifierLoc()) { 9882 QualifierLoc 9883 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9884 if (!QualifierLoc) 9885 return ExprError(); 9886 } 9887 9888 ValueDecl *ND 9889 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9890 E->getDecl())); 9891 if (!ND) 9892 return ExprError(); 9893 9894 NamedDecl *Found = ND; 9895 if (E->getFoundDecl() != E->getDecl()) { 9896 Found = cast_or_null<NamedDecl>( 9897 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9898 if (!Found) 9899 return ExprError(); 9900 } 9901 9902 DeclarationNameInfo NameInfo = E->getNameInfo(); 9903 if (NameInfo.getName()) { 9904 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9905 if (!NameInfo.getName()) 9906 return ExprError(); 9907 } 9908 9909 if (!getDerived().AlwaysRebuild() && 9910 QualifierLoc == E->getQualifierLoc() && 9911 ND == E->getDecl() && 9912 Found == E->getFoundDecl() && 9913 NameInfo.getName() == E->getDecl()->getDeclName() && 9914 !E->hasExplicitTemplateArgs()) { 9915 9916 // Mark it referenced in the new context regardless. 9917 // FIXME: this is a bit instantiation-specific. 9918 SemaRef.MarkDeclRefReferenced(E); 9919 9920 return E; 9921 } 9922 9923 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9924 if (E->hasExplicitTemplateArgs()) { 9925 TemplateArgs = &TransArgs; 9926 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9927 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9928 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9929 E->getNumTemplateArgs(), 9930 TransArgs)) 9931 return ExprError(); 9932 } 9933 9934 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9935 Found, TemplateArgs); 9936 } 9937 9938 template<typename Derived> 9939 ExprResult 9940 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9941 return E; 9942 } 9943 9944 template <typename Derived> 9945 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9946 FixedPointLiteral *E) { 9947 return E; 9948 } 9949 9950 template<typename Derived> 9951 ExprResult 9952 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9953 return E; 9954 } 9955 9956 template<typename Derived> 9957 ExprResult 9958 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9959 return E; 9960 } 9961 9962 template<typename Derived> 9963 ExprResult 9964 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9965 return E; 9966 } 9967 9968 template<typename Derived> 9969 ExprResult 9970 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9971 return E; 9972 } 9973 9974 template<typename Derived> 9975 ExprResult 9976 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9977 if (FunctionDecl *FD = E->getDirectCallee()) 9978 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9979 return SemaRef.MaybeBindToTemporary(E); 9980 } 9981 9982 template<typename Derived> 9983 ExprResult 9984 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9985 ExprResult ControllingExpr = 9986 getDerived().TransformExpr(E->getControllingExpr()); 9987 if (ControllingExpr.isInvalid()) 9988 return ExprError(); 9989 9990 SmallVector<Expr *, 4> AssocExprs; 9991 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9992 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 9993 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9994 if (TSI) { 9995 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9996 if (!AssocType) 9997 return ExprError(); 9998 AssocTypes.push_back(AssocType); 9999 } else { 10000 AssocTypes.push_back(nullptr); 10001 } 10002 10003 ExprResult AssocExpr = 10004 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10005 if (AssocExpr.isInvalid()) 10006 return ExprError(); 10007 AssocExprs.push_back(AssocExpr.get()); 10008 } 10009 10010 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10011 E->getDefaultLoc(), 10012 E->getRParenLoc(), 10013 ControllingExpr.get(), 10014 AssocTypes, 10015 AssocExprs); 10016 } 10017 10018 template<typename Derived> 10019 ExprResult 10020 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10021 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10022 if (SubExpr.isInvalid()) 10023 return ExprError(); 10024 10025 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10026 return E; 10027 10028 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10029 E->getRParen()); 10030 } 10031 10032 /// The operand of a unary address-of operator has special rules: it's 10033 /// allowed to refer to a non-static member of a class even if there's no 'this' 10034 /// object available. 10035 template<typename Derived> 10036 ExprResult 10037 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10038 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10039 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10040 else 10041 return getDerived().TransformExpr(E); 10042 } 10043 10044 template<typename Derived> 10045 ExprResult 10046 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10047 ExprResult SubExpr; 10048 if (E->getOpcode() == UO_AddrOf) 10049 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10050 else 10051 SubExpr = TransformExpr(E->getSubExpr()); 10052 if (SubExpr.isInvalid()) 10053 return ExprError(); 10054 10055 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10056 return E; 10057 10058 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10059 E->getOpcode(), 10060 SubExpr.get()); 10061 } 10062 10063 template<typename Derived> 10064 ExprResult 10065 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10066 // Transform the type. 10067 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10068 if (!Type) 10069 return ExprError(); 10070 10071 // Transform all of the components into components similar to what the 10072 // parser uses. 10073 // FIXME: It would be slightly more efficient in the non-dependent case to 10074 // just map FieldDecls, rather than requiring the rebuilder to look for 10075 // the fields again. However, __builtin_offsetof is rare enough in 10076 // template code that we don't care. 10077 bool ExprChanged = false; 10078 typedef Sema::OffsetOfComponent Component; 10079 SmallVector<Component, 4> Components; 10080 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10081 const OffsetOfNode &ON = E->getComponent(I); 10082 Component Comp; 10083 Comp.isBrackets = true; 10084 Comp.LocStart = ON.getSourceRange().getBegin(); 10085 Comp.LocEnd = ON.getSourceRange().getEnd(); 10086 switch (ON.getKind()) { 10087 case OffsetOfNode::Array: { 10088 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10089 ExprResult Index = getDerived().TransformExpr(FromIndex); 10090 if (Index.isInvalid()) 10091 return ExprError(); 10092 10093 ExprChanged = ExprChanged || Index.get() != FromIndex; 10094 Comp.isBrackets = true; 10095 Comp.U.E = Index.get(); 10096 break; 10097 } 10098 10099 case OffsetOfNode::Field: 10100 case OffsetOfNode::Identifier: 10101 Comp.isBrackets = false; 10102 Comp.U.IdentInfo = ON.getFieldName(); 10103 if (!Comp.U.IdentInfo) 10104 continue; 10105 10106 break; 10107 10108 case OffsetOfNode::Base: 10109 // Will be recomputed during the rebuild. 10110 continue; 10111 } 10112 10113 Components.push_back(Comp); 10114 } 10115 10116 // If nothing changed, retain the existing expression. 10117 if (!getDerived().AlwaysRebuild() && 10118 Type == E->getTypeSourceInfo() && 10119 !ExprChanged) 10120 return E; 10121 10122 // Build a new offsetof expression. 10123 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10124 Components, E->getRParenLoc()); 10125 } 10126 10127 template<typename Derived> 10128 ExprResult 10129 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10130 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10131 "opaque value expression requires transformation"); 10132 return E; 10133 } 10134 10135 template<typename Derived> 10136 ExprResult 10137 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10138 return E; 10139 } 10140 10141 template <typename Derived> 10142 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10143 llvm::SmallVector<Expr *, 8> Children; 10144 bool Changed = false; 10145 for (Expr *C : E->subExpressions()) { 10146 ExprResult NewC = getDerived().TransformExpr(C); 10147 if (NewC.isInvalid()) 10148 return ExprError(); 10149 Children.push_back(NewC.get()); 10150 10151 Changed |= NewC.get() != C; 10152 } 10153 if (!getDerived().AlwaysRebuild() && !Changed) 10154 return E; 10155 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10156 Children); 10157 } 10158 10159 template<typename Derived> 10160 ExprResult 10161 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10162 // Rebuild the syntactic form. The original syntactic form has 10163 // opaque-value expressions in it, so strip those away and rebuild 10164 // the result. This is a really awful way of doing this, but the 10165 // better solution (rebuilding the semantic expressions and 10166 // rebinding OVEs as necessary) doesn't work; we'd need 10167 // TreeTransform to not strip away implicit conversions. 10168 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10169 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10170 if (result.isInvalid()) return ExprError(); 10171 10172 // If that gives us a pseudo-object result back, the pseudo-object 10173 // expression must have been an lvalue-to-rvalue conversion which we 10174 // should reapply. 10175 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10176 result = SemaRef.checkPseudoObjectRValue(result.get()); 10177 10178 return result; 10179 } 10180 10181 template<typename Derived> 10182 ExprResult 10183 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10184 UnaryExprOrTypeTraitExpr *E) { 10185 if (E->isArgumentType()) { 10186 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10187 10188 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10189 if (!NewT) 10190 return ExprError(); 10191 10192 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10193 return E; 10194 10195 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10196 E->getKind(), 10197 E->getSourceRange()); 10198 } 10199 10200 // C++0x [expr.sizeof]p1: 10201 // The operand is either an expression, which is an unevaluated operand 10202 // [...] 10203 EnterExpressionEvaluationContext Unevaluated( 10204 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10205 Sema::ReuseLambdaContextDecl); 10206 10207 // Try to recover if we have something like sizeof(T::X) where X is a type. 10208 // Notably, there must be *exactly* one set of parens if X is a type. 10209 TypeSourceInfo *RecoveryTSI = nullptr; 10210 ExprResult SubExpr; 10211 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10212 if (auto *DRE = 10213 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10214 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10215 PE, DRE, false, &RecoveryTSI); 10216 else 10217 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10218 10219 if (RecoveryTSI) { 10220 return getDerived().RebuildUnaryExprOrTypeTrait( 10221 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10222 } else if (SubExpr.isInvalid()) 10223 return ExprError(); 10224 10225 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10226 return E; 10227 10228 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10229 E->getOperatorLoc(), 10230 E->getKind(), 10231 E->getSourceRange()); 10232 } 10233 10234 template<typename Derived> 10235 ExprResult 10236 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10237 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10238 if (LHS.isInvalid()) 10239 return ExprError(); 10240 10241 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10242 if (RHS.isInvalid()) 10243 return ExprError(); 10244 10245 10246 if (!getDerived().AlwaysRebuild() && 10247 LHS.get() == E->getLHS() && 10248 RHS.get() == E->getRHS()) 10249 return E; 10250 10251 return getDerived().RebuildArraySubscriptExpr( 10252 LHS.get(), 10253 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10254 } 10255 10256 template <typename Derived> 10257 ExprResult 10258 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10259 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10260 if (Base.isInvalid()) 10261 return ExprError(); 10262 10263 ExprResult LowerBound; 10264 if (E->getLowerBound()) { 10265 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10266 if (LowerBound.isInvalid()) 10267 return ExprError(); 10268 } 10269 10270 ExprResult Length; 10271 if (E->getLength()) { 10272 Length = getDerived().TransformExpr(E->getLength()); 10273 if (Length.isInvalid()) 10274 return ExprError(); 10275 } 10276 10277 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10278 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10279 return E; 10280 10281 return getDerived().RebuildOMPArraySectionExpr( 10282 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 10283 Length.get(), E->getRBracketLoc()); 10284 } 10285 10286 template <typename Derived> 10287 ExprResult 10288 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10289 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10290 if (Base.isInvalid()) 10291 return ExprError(); 10292 10293 SmallVector<Expr *, 4> Dims; 10294 bool ErrorFound = false; 10295 for (Expr *Dim : E->getDimensions()) { 10296 ExprResult DimRes = getDerived().TransformExpr(Dim); 10297 if (DimRes.isInvalid()) { 10298 ErrorFound = true; 10299 continue; 10300 } 10301 Dims.push_back(DimRes.get()); 10302 } 10303 10304 if (ErrorFound) 10305 return ExprError(); 10306 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10307 E->getRParenLoc(), Dims, 10308 E->getBracketsRanges()); 10309 } 10310 10311 template <typename Derived> 10312 ExprResult 10313 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10314 unsigned NumIterators = E->numOfIterators(); 10315 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10316 10317 bool ErrorFound = false; 10318 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10319 for (unsigned I = 0; I < NumIterators; ++I) { 10320 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10321 Data[I].DeclIdent = D->getIdentifier(); 10322 Data[I].DeclIdentLoc = D->getLocation(); 10323 if (D->getLocation() == D->getBeginLoc()) { 10324 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10325 "Implicit type must be int."); 10326 } else { 10327 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10328 QualType DeclTy = getDerived().TransformType(D->getType()); 10329 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10330 } 10331 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10332 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10333 ExprResult End = getDerived().TransformExpr(Range.End); 10334 ExprResult Step = getDerived().TransformExpr(Range.Step); 10335 ErrorFound = ErrorFound || 10336 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10337 !Data[I].Type.get().isNull())) || 10338 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10339 if (ErrorFound) 10340 continue; 10341 Data[I].Range.Begin = Begin.get(); 10342 Data[I].Range.End = End.get(); 10343 Data[I].Range.Step = Step.get(); 10344 Data[I].AssignLoc = E->getAssignLoc(I); 10345 Data[I].ColonLoc = E->getColonLoc(I); 10346 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10347 NeedToRebuild = 10348 NeedToRebuild || 10349 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10350 D->getType().getTypePtrOrNull()) || 10351 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10352 Range.Step != Data[I].Range.Step; 10353 } 10354 if (ErrorFound) 10355 return ExprError(); 10356 if (!NeedToRebuild) 10357 return E; 10358 10359 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10360 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10361 if (!Res.isUsable()) 10362 return Res; 10363 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10364 for (unsigned I = 0; I < NumIterators; ++I) 10365 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10366 IE->getIteratorDecl(I)); 10367 return Res; 10368 } 10369 10370 template<typename Derived> 10371 ExprResult 10372 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10373 // Transform the callee. 10374 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10375 if (Callee.isInvalid()) 10376 return ExprError(); 10377 10378 // Transform arguments. 10379 bool ArgChanged = false; 10380 SmallVector<Expr*, 8> Args; 10381 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10382 &ArgChanged)) 10383 return ExprError(); 10384 10385 if (!getDerived().AlwaysRebuild() && 10386 Callee.get() == E->getCallee() && 10387 !ArgChanged) 10388 return SemaRef.MaybeBindToTemporary(E); 10389 10390 // FIXME: Wrong source location information for the '('. 10391 SourceLocation FakeLParenLoc 10392 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10393 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10394 Args, 10395 E->getRParenLoc()); 10396 } 10397 10398 template<typename Derived> 10399 ExprResult 10400 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10401 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10402 if (Base.isInvalid()) 10403 return ExprError(); 10404 10405 NestedNameSpecifierLoc QualifierLoc; 10406 if (E->hasQualifier()) { 10407 QualifierLoc 10408 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10409 10410 if (!QualifierLoc) 10411 return ExprError(); 10412 } 10413 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10414 10415 ValueDecl *Member 10416 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10417 E->getMemberDecl())); 10418 if (!Member) 10419 return ExprError(); 10420 10421 NamedDecl *FoundDecl = E->getFoundDecl(); 10422 if (FoundDecl == E->getMemberDecl()) { 10423 FoundDecl = Member; 10424 } else { 10425 FoundDecl = cast_or_null<NamedDecl>( 10426 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10427 if (!FoundDecl) 10428 return ExprError(); 10429 } 10430 10431 if (!getDerived().AlwaysRebuild() && 10432 Base.get() == E->getBase() && 10433 QualifierLoc == E->getQualifierLoc() && 10434 Member == E->getMemberDecl() && 10435 FoundDecl == E->getFoundDecl() && 10436 !E->hasExplicitTemplateArgs()) { 10437 10438 // Mark it referenced in the new context regardless. 10439 // FIXME: this is a bit instantiation-specific. 10440 SemaRef.MarkMemberReferenced(E); 10441 10442 return E; 10443 } 10444 10445 TemplateArgumentListInfo TransArgs; 10446 if (E->hasExplicitTemplateArgs()) { 10447 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10448 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10449 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10450 E->getNumTemplateArgs(), 10451 TransArgs)) 10452 return ExprError(); 10453 } 10454 10455 // FIXME: Bogus source location for the operator 10456 SourceLocation FakeOperatorLoc = 10457 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10458 10459 // FIXME: to do this check properly, we will need to preserve the 10460 // first-qualifier-in-scope here, just in case we had a dependent 10461 // base (and therefore couldn't do the check) and a 10462 // nested-name-qualifier (and therefore could do the lookup). 10463 NamedDecl *FirstQualifierInScope = nullptr; 10464 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10465 if (MemberNameInfo.getName()) { 10466 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10467 if (!MemberNameInfo.getName()) 10468 return ExprError(); 10469 } 10470 10471 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10472 E->isArrow(), 10473 QualifierLoc, 10474 TemplateKWLoc, 10475 MemberNameInfo, 10476 Member, 10477 FoundDecl, 10478 (E->hasExplicitTemplateArgs() 10479 ? &TransArgs : nullptr), 10480 FirstQualifierInScope); 10481 } 10482 10483 template<typename Derived> 10484 ExprResult 10485 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10486 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10487 if (LHS.isInvalid()) 10488 return ExprError(); 10489 10490 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10491 if (RHS.isInvalid()) 10492 return ExprError(); 10493 10494 if (!getDerived().AlwaysRebuild() && 10495 LHS.get() == E->getLHS() && 10496 RHS.get() == E->getRHS()) 10497 return E; 10498 10499 if (E->isCompoundAssignmentOp()) 10500 // FPFeatures has already been established from trailing storage 10501 return getDerived().RebuildBinaryOperator( 10502 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10503 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10504 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10505 10506 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10507 LHS.get(), RHS.get()); 10508 } 10509 10510 template <typename Derived> 10511 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10512 CXXRewrittenBinaryOperator *E) { 10513 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10514 10515 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10516 if (LHS.isInvalid()) 10517 return ExprError(); 10518 10519 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10520 if (RHS.isInvalid()) 10521 return ExprError(); 10522 10523 if (!getDerived().AlwaysRebuild() && 10524 LHS.get() == Decomp.LHS && 10525 RHS.get() == Decomp.RHS) 10526 return E; 10527 10528 // Extract the already-resolved callee declarations so that we can restrict 10529 // ourselves to using them as the unqualified lookup results when rebuilding. 10530 UnresolvedSet<2> UnqualLookups; 10531 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10532 const_cast<Expr *>(Decomp.InnerBinOp)}; 10533 for (Expr *PossibleBinOp : PossibleBinOps) { 10534 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10535 if (!Op) 10536 continue; 10537 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10538 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10539 continue; 10540 10541 // Transform the callee in case we built a call to a local extern 10542 // declaration. 10543 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10544 E->getOperatorLoc(), Callee->getFoundDecl())); 10545 if (!Found) 10546 return ExprError(); 10547 UnqualLookups.addDecl(Found); 10548 } 10549 10550 return getDerived().RebuildCXXRewrittenBinaryOperator( 10551 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10552 } 10553 10554 template<typename Derived> 10555 ExprResult 10556 TreeTransform<Derived>::TransformCompoundAssignOperator( 10557 CompoundAssignOperator *E) { 10558 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10559 getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts()); 10560 return getDerived().TransformBinaryOperator(E); 10561 } 10562 10563 template<typename Derived> 10564 ExprResult TreeTransform<Derived>:: 10565 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10566 // Just rebuild the common and RHS expressions and see whether we 10567 // get any changes. 10568 10569 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10570 if (commonExpr.isInvalid()) 10571 return ExprError(); 10572 10573 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10574 if (rhs.isInvalid()) 10575 return ExprError(); 10576 10577 if (!getDerived().AlwaysRebuild() && 10578 commonExpr.get() == e->getCommon() && 10579 rhs.get() == e->getFalseExpr()) 10580 return e; 10581 10582 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10583 e->getQuestionLoc(), 10584 nullptr, 10585 e->getColonLoc(), 10586 rhs.get()); 10587 } 10588 10589 template<typename Derived> 10590 ExprResult 10591 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10592 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10593 if (Cond.isInvalid()) 10594 return ExprError(); 10595 10596 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10597 if (LHS.isInvalid()) 10598 return ExprError(); 10599 10600 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10601 if (RHS.isInvalid()) 10602 return ExprError(); 10603 10604 if (!getDerived().AlwaysRebuild() && 10605 Cond.get() == E->getCond() && 10606 LHS.get() == E->getLHS() && 10607 RHS.get() == E->getRHS()) 10608 return E; 10609 10610 return getDerived().RebuildConditionalOperator(Cond.get(), 10611 E->getQuestionLoc(), 10612 LHS.get(), 10613 E->getColonLoc(), 10614 RHS.get()); 10615 } 10616 10617 template<typename Derived> 10618 ExprResult 10619 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10620 // Implicit casts are eliminated during transformation, since they 10621 // will be recomputed by semantic analysis after transformation. 10622 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10623 } 10624 10625 template<typename Derived> 10626 ExprResult 10627 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10628 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10629 if (!Type) 10630 return ExprError(); 10631 10632 ExprResult SubExpr 10633 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10634 if (SubExpr.isInvalid()) 10635 return ExprError(); 10636 10637 if (!getDerived().AlwaysRebuild() && 10638 Type == E->getTypeInfoAsWritten() && 10639 SubExpr.get() == E->getSubExpr()) 10640 return E; 10641 10642 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10643 Type, 10644 E->getRParenLoc(), 10645 SubExpr.get()); 10646 } 10647 10648 template<typename Derived> 10649 ExprResult 10650 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10651 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10652 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10653 if (!NewT) 10654 return ExprError(); 10655 10656 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10657 if (Init.isInvalid()) 10658 return ExprError(); 10659 10660 if (!getDerived().AlwaysRebuild() && 10661 OldT == NewT && 10662 Init.get() == E->getInitializer()) 10663 return SemaRef.MaybeBindToTemporary(E); 10664 10665 // Note: the expression type doesn't necessarily match the 10666 // type-as-written, but that's okay, because it should always be 10667 // derivable from the initializer. 10668 10669 return getDerived().RebuildCompoundLiteralExpr( 10670 E->getLParenLoc(), NewT, 10671 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10672 } 10673 10674 template<typename Derived> 10675 ExprResult 10676 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10677 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10678 if (Base.isInvalid()) 10679 return ExprError(); 10680 10681 if (!getDerived().AlwaysRebuild() && 10682 Base.get() == E->getBase()) 10683 return E; 10684 10685 // FIXME: Bad source location 10686 SourceLocation FakeOperatorLoc = 10687 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10688 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10689 E->getAccessorLoc(), 10690 E->getAccessor()); 10691 } 10692 10693 template<typename Derived> 10694 ExprResult 10695 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10696 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10697 E = Syntactic; 10698 10699 bool InitChanged = false; 10700 10701 EnterExpressionEvaluationContext Context( 10702 getSema(), EnterExpressionEvaluationContext::InitList); 10703 10704 SmallVector<Expr*, 4> Inits; 10705 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10706 Inits, &InitChanged)) 10707 return ExprError(); 10708 10709 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10710 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10711 // in some cases. We can't reuse it in general, because the syntactic and 10712 // semantic forms are linked, and we can't know that semantic form will 10713 // match even if the syntactic form does. 10714 } 10715 10716 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10717 E->getRBraceLoc()); 10718 } 10719 10720 template<typename Derived> 10721 ExprResult 10722 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10723 Designation Desig; 10724 10725 // transform the initializer value 10726 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10727 if (Init.isInvalid()) 10728 return ExprError(); 10729 10730 // transform the designators. 10731 SmallVector<Expr*, 4> ArrayExprs; 10732 bool ExprChanged = false; 10733 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10734 if (D.isFieldDesignator()) { 10735 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10736 D.getDotLoc(), 10737 D.getFieldLoc())); 10738 if (D.getField()) { 10739 FieldDecl *Field = cast_or_null<FieldDecl>( 10740 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10741 if (Field != D.getField()) 10742 // Rebuild the expression when the transformed FieldDecl is 10743 // different to the already assigned FieldDecl. 10744 ExprChanged = true; 10745 } else { 10746 // Ensure that the designator expression is rebuilt when there isn't 10747 // a resolved FieldDecl in the designator as we don't want to assign 10748 // a FieldDecl to a pattern designator that will be instantiated again. 10749 ExprChanged = true; 10750 } 10751 continue; 10752 } 10753 10754 if (D.isArrayDesignator()) { 10755 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10756 if (Index.isInvalid()) 10757 return ExprError(); 10758 10759 Desig.AddDesignator( 10760 Designator::getArray(Index.get(), D.getLBracketLoc())); 10761 10762 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10763 ArrayExprs.push_back(Index.get()); 10764 continue; 10765 } 10766 10767 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10768 ExprResult Start 10769 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10770 if (Start.isInvalid()) 10771 return ExprError(); 10772 10773 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10774 if (End.isInvalid()) 10775 return ExprError(); 10776 10777 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10778 End.get(), 10779 D.getLBracketLoc(), 10780 D.getEllipsisLoc())); 10781 10782 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10783 End.get() != E->getArrayRangeEnd(D); 10784 10785 ArrayExprs.push_back(Start.get()); 10786 ArrayExprs.push_back(End.get()); 10787 } 10788 10789 if (!getDerived().AlwaysRebuild() && 10790 Init.get() == E->getInit() && 10791 !ExprChanged) 10792 return E; 10793 10794 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10795 E->getEqualOrColonLoc(), 10796 E->usesGNUSyntax(), Init.get()); 10797 } 10798 10799 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10800 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10801 template<typename Derived> 10802 ExprResult 10803 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10804 DesignatedInitUpdateExpr *E) { 10805 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10806 "initializer"); 10807 return ExprError(); 10808 } 10809 10810 template<typename Derived> 10811 ExprResult 10812 TreeTransform<Derived>::TransformNoInitExpr( 10813 NoInitExpr *E) { 10814 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10815 return ExprError(); 10816 } 10817 10818 template<typename Derived> 10819 ExprResult 10820 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10821 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10822 return ExprError(); 10823 } 10824 10825 template<typename Derived> 10826 ExprResult 10827 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10828 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10829 return ExprError(); 10830 } 10831 10832 template<typename Derived> 10833 ExprResult 10834 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10835 ImplicitValueInitExpr *E) { 10836 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10837 10838 // FIXME: Will we ever have proper type location here? Will we actually 10839 // need to transform the type? 10840 QualType T = getDerived().TransformType(E->getType()); 10841 if (T.isNull()) 10842 return ExprError(); 10843 10844 if (!getDerived().AlwaysRebuild() && 10845 T == E->getType()) 10846 return E; 10847 10848 return getDerived().RebuildImplicitValueInitExpr(T); 10849 } 10850 10851 template<typename Derived> 10852 ExprResult 10853 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10854 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10855 if (!TInfo) 10856 return ExprError(); 10857 10858 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10859 if (SubExpr.isInvalid()) 10860 return ExprError(); 10861 10862 if (!getDerived().AlwaysRebuild() && 10863 TInfo == E->getWrittenTypeInfo() && 10864 SubExpr.get() == E->getSubExpr()) 10865 return E; 10866 10867 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10868 TInfo, E->getRParenLoc()); 10869 } 10870 10871 template<typename Derived> 10872 ExprResult 10873 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10874 bool ArgumentChanged = false; 10875 SmallVector<Expr*, 4> Inits; 10876 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10877 &ArgumentChanged)) 10878 return ExprError(); 10879 10880 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10881 Inits, 10882 E->getRParenLoc()); 10883 } 10884 10885 /// Transform an address-of-label expression. 10886 /// 10887 /// By default, the transformation of an address-of-label expression always 10888 /// rebuilds the expression, so that the label identifier can be resolved to 10889 /// the corresponding label statement by semantic analysis. 10890 template<typename Derived> 10891 ExprResult 10892 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10893 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10894 E->getLabel()); 10895 if (!LD) 10896 return ExprError(); 10897 10898 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10899 cast<LabelDecl>(LD)); 10900 } 10901 10902 template<typename Derived> 10903 ExprResult 10904 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10905 SemaRef.ActOnStartStmtExpr(); 10906 StmtResult SubStmt 10907 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10908 if (SubStmt.isInvalid()) { 10909 SemaRef.ActOnStmtExprError(); 10910 return ExprError(); 10911 } 10912 10913 unsigned OldDepth = E->getTemplateDepth(); 10914 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 10915 10916 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 10917 SubStmt.get() == E->getSubStmt()) { 10918 // Calling this an 'error' is unintuitive, but it does the right thing. 10919 SemaRef.ActOnStmtExprError(); 10920 return SemaRef.MaybeBindToTemporary(E); 10921 } 10922 10923 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 10924 E->getRParenLoc(), NewDepth); 10925 } 10926 10927 template<typename Derived> 10928 ExprResult 10929 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10930 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10931 if (Cond.isInvalid()) 10932 return ExprError(); 10933 10934 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10935 if (LHS.isInvalid()) 10936 return ExprError(); 10937 10938 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10939 if (RHS.isInvalid()) 10940 return ExprError(); 10941 10942 if (!getDerived().AlwaysRebuild() && 10943 Cond.get() == E->getCond() && 10944 LHS.get() == E->getLHS() && 10945 RHS.get() == E->getRHS()) 10946 return E; 10947 10948 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10949 Cond.get(), LHS.get(), RHS.get(), 10950 E->getRParenLoc()); 10951 } 10952 10953 template<typename Derived> 10954 ExprResult 10955 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10956 return E; 10957 } 10958 10959 template<typename Derived> 10960 ExprResult 10961 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10962 switch (E->getOperator()) { 10963 case OO_New: 10964 case OO_Delete: 10965 case OO_Array_New: 10966 case OO_Array_Delete: 10967 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10968 10969 case OO_Call: { 10970 // This is a call to an object's operator(). 10971 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10972 10973 // Transform the object itself. 10974 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10975 if (Object.isInvalid()) 10976 return ExprError(); 10977 10978 // FIXME: Poor location information 10979 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10980 static_cast<Expr *>(Object.get())->getEndLoc()); 10981 10982 // Transform the call arguments. 10983 SmallVector<Expr*, 8> Args; 10984 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10985 Args)) 10986 return ExprError(); 10987 10988 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10989 E->getEndLoc()); 10990 } 10991 10992 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10993 case OO_##Name: 10994 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10995 #include "clang/Basic/OperatorKinds.def" 10996 case OO_Subscript: 10997 // Handled below. 10998 break; 10999 11000 case OO_Conditional: 11001 llvm_unreachable("conditional operator is not actually overloadable"); 11002 11003 case OO_None: 11004 case NUM_OVERLOADED_OPERATORS: 11005 llvm_unreachable("not an overloaded operator?"); 11006 } 11007 11008 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11009 if (Callee.isInvalid()) 11010 return ExprError(); 11011 11012 ExprResult First; 11013 if (E->getOperator() == OO_Amp) 11014 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11015 else 11016 First = getDerived().TransformExpr(E->getArg(0)); 11017 if (First.isInvalid()) 11018 return ExprError(); 11019 11020 ExprResult Second; 11021 if (E->getNumArgs() == 2) { 11022 Second = getDerived().TransformExpr(E->getArg(1)); 11023 if (Second.isInvalid()) 11024 return ExprError(); 11025 } 11026 11027 if (!getDerived().AlwaysRebuild() && 11028 Callee.get() == E->getCallee() && 11029 First.get() == E->getArg(0) && 11030 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11031 return SemaRef.MaybeBindToTemporary(E); 11032 11033 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11034 getSema().CurFPFeatures = E->getFPFeatures(); 11035 11036 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11037 E->getOperatorLoc(), 11038 Callee.get(), 11039 First.get(), 11040 Second.get()); 11041 } 11042 11043 template<typename Derived> 11044 ExprResult 11045 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11046 return getDerived().TransformCallExpr(E); 11047 } 11048 11049 template <typename Derived> 11050 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11051 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11052 getSema().CurContext != E->getParentContext(); 11053 11054 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11055 return E; 11056 11057 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11058 E->getEndLoc(), 11059 getSema().CurContext); 11060 } 11061 11062 template<typename Derived> 11063 ExprResult 11064 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11065 // Transform the callee. 11066 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11067 if (Callee.isInvalid()) 11068 return ExprError(); 11069 11070 // Transform exec config. 11071 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11072 if (EC.isInvalid()) 11073 return ExprError(); 11074 11075 // Transform arguments. 11076 bool ArgChanged = false; 11077 SmallVector<Expr*, 8> Args; 11078 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11079 &ArgChanged)) 11080 return ExprError(); 11081 11082 if (!getDerived().AlwaysRebuild() && 11083 Callee.get() == E->getCallee() && 11084 !ArgChanged) 11085 return SemaRef.MaybeBindToTemporary(E); 11086 11087 // FIXME: Wrong source location information for the '('. 11088 SourceLocation FakeLParenLoc 11089 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11090 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11091 Args, 11092 E->getRParenLoc(), EC.get()); 11093 } 11094 11095 template<typename Derived> 11096 ExprResult 11097 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11098 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11099 if (!Type) 11100 return ExprError(); 11101 11102 ExprResult SubExpr 11103 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11104 if (SubExpr.isInvalid()) 11105 return ExprError(); 11106 11107 if (!getDerived().AlwaysRebuild() && 11108 Type == E->getTypeInfoAsWritten() && 11109 SubExpr.get() == E->getSubExpr()) 11110 return E; 11111 return getDerived().RebuildCXXNamedCastExpr( 11112 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11113 Type, E->getAngleBrackets().getEnd(), 11114 // FIXME. this should be '(' location 11115 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11116 } 11117 11118 template<typename Derived> 11119 ExprResult 11120 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11121 TypeSourceInfo *TSI = 11122 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11123 if (!TSI) 11124 return ExprError(); 11125 11126 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11127 if (Sub.isInvalid()) 11128 return ExprError(); 11129 11130 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11131 Sub.get(), BCE->getEndLoc()); 11132 } 11133 11134 template<typename Derived> 11135 ExprResult 11136 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11137 return getDerived().TransformCXXNamedCastExpr(E); 11138 } 11139 11140 template<typename Derived> 11141 ExprResult 11142 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11143 return getDerived().TransformCXXNamedCastExpr(E); 11144 } 11145 11146 template<typename Derived> 11147 ExprResult 11148 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11149 CXXReinterpretCastExpr *E) { 11150 return getDerived().TransformCXXNamedCastExpr(E); 11151 } 11152 11153 template<typename Derived> 11154 ExprResult 11155 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11156 return getDerived().TransformCXXNamedCastExpr(E); 11157 } 11158 11159 template<typename Derived> 11160 ExprResult 11161 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11162 return getDerived().TransformCXXNamedCastExpr(E); 11163 } 11164 11165 template<typename Derived> 11166 ExprResult 11167 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11168 CXXFunctionalCastExpr *E) { 11169 TypeSourceInfo *Type = 11170 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11171 if (!Type) 11172 return ExprError(); 11173 11174 ExprResult SubExpr 11175 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11176 if (SubExpr.isInvalid()) 11177 return ExprError(); 11178 11179 if (!getDerived().AlwaysRebuild() && 11180 Type == E->getTypeInfoAsWritten() && 11181 SubExpr.get() == E->getSubExpr()) 11182 return E; 11183 11184 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11185 E->getLParenLoc(), 11186 SubExpr.get(), 11187 E->getRParenLoc(), 11188 E->isListInitialization()); 11189 } 11190 11191 template<typename Derived> 11192 ExprResult 11193 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11194 if (E->isTypeOperand()) { 11195 TypeSourceInfo *TInfo 11196 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11197 if (!TInfo) 11198 return ExprError(); 11199 11200 if (!getDerived().AlwaysRebuild() && 11201 TInfo == E->getTypeOperandSourceInfo()) 11202 return E; 11203 11204 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11205 TInfo, E->getEndLoc()); 11206 } 11207 11208 // We don't know whether the subexpression is potentially evaluated until 11209 // after we perform semantic analysis. We speculatively assume it is 11210 // unevaluated; it will get fixed later if the subexpression is in fact 11211 // potentially evaluated. 11212 EnterExpressionEvaluationContext Unevaluated( 11213 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11214 Sema::ReuseLambdaContextDecl); 11215 11216 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11217 if (SubExpr.isInvalid()) 11218 return ExprError(); 11219 11220 if (!getDerived().AlwaysRebuild() && 11221 SubExpr.get() == E->getExprOperand()) 11222 return E; 11223 11224 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11225 SubExpr.get(), E->getEndLoc()); 11226 } 11227 11228 template<typename Derived> 11229 ExprResult 11230 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11231 if (E->isTypeOperand()) { 11232 TypeSourceInfo *TInfo 11233 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11234 if (!TInfo) 11235 return ExprError(); 11236 11237 if (!getDerived().AlwaysRebuild() && 11238 TInfo == E->getTypeOperandSourceInfo()) 11239 return E; 11240 11241 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11242 TInfo, E->getEndLoc()); 11243 } 11244 11245 EnterExpressionEvaluationContext Unevaluated( 11246 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11247 11248 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11249 if (SubExpr.isInvalid()) 11250 return ExprError(); 11251 11252 if (!getDerived().AlwaysRebuild() && 11253 SubExpr.get() == E->getExprOperand()) 11254 return E; 11255 11256 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11257 SubExpr.get(), E->getEndLoc()); 11258 } 11259 11260 template<typename Derived> 11261 ExprResult 11262 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11263 return E; 11264 } 11265 11266 template<typename Derived> 11267 ExprResult 11268 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11269 CXXNullPtrLiteralExpr *E) { 11270 return E; 11271 } 11272 11273 template<typename Derived> 11274 ExprResult 11275 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11276 QualType T = getSema().getCurrentThisType(); 11277 11278 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11279 // Mark it referenced in the new context regardless. 11280 // FIXME: this is a bit instantiation-specific. 11281 getSema().MarkThisReferenced(E); 11282 return E; 11283 } 11284 11285 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11286 } 11287 11288 template<typename Derived> 11289 ExprResult 11290 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11291 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11292 if (SubExpr.isInvalid()) 11293 return ExprError(); 11294 11295 if (!getDerived().AlwaysRebuild() && 11296 SubExpr.get() == E->getSubExpr()) 11297 return E; 11298 11299 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11300 E->isThrownVariableInScope()); 11301 } 11302 11303 template<typename Derived> 11304 ExprResult 11305 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11306 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11307 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11308 if (!Param) 11309 return ExprError(); 11310 11311 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11312 E->getUsedContext() == SemaRef.CurContext) 11313 return E; 11314 11315 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11316 } 11317 11318 template<typename Derived> 11319 ExprResult 11320 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11321 FieldDecl *Field = cast_or_null<FieldDecl>( 11322 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11323 if (!Field) 11324 return ExprError(); 11325 11326 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11327 E->getUsedContext() == SemaRef.CurContext) 11328 return E; 11329 11330 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11331 } 11332 11333 template<typename Derived> 11334 ExprResult 11335 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11336 CXXScalarValueInitExpr *E) { 11337 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11338 if (!T) 11339 return ExprError(); 11340 11341 if (!getDerived().AlwaysRebuild() && 11342 T == E->getTypeSourceInfo()) 11343 return E; 11344 11345 return getDerived().RebuildCXXScalarValueInitExpr(T, 11346 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11347 E->getRParenLoc()); 11348 } 11349 11350 template<typename Derived> 11351 ExprResult 11352 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11353 // Transform the type that we're allocating 11354 TypeSourceInfo *AllocTypeInfo = 11355 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11356 if (!AllocTypeInfo) 11357 return ExprError(); 11358 11359 // Transform the size of the array we're allocating (if any). 11360 Optional<Expr *> ArraySize; 11361 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11362 ExprResult NewArraySize; 11363 if (*OldArraySize) { 11364 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11365 if (NewArraySize.isInvalid()) 11366 return ExprError(); 11367 } 11368 ArraySize = NewArraySize.get(); 11369 } 11370 11371 // Transform the placement arguments (if any). 11372 bool ArgumentChanged = false; 11373 SmallVector<Expr*, 8> PlacementArgs; 11374 if (getDerived().TransformExprs(E->getPlacementArgs(), 11375 E->getNumPlacementArgs(), true, 11376 PlacementArgs, &ArgumentChanged)) 11377 return ExprError(); 11378 11379 // Transform the initializer (if any). 11380 Expr *OldInit = E->getInitializer(); 11381 ExprResult NewInit; 11382 if (OldInit) 11383 NewInit = getDerived().TransformInitializer(OldInit, true); 11384 if (NewInit.isInvalid()) 11385 return ExprError(); 11386 11387 // Transform new operator and delete operator. 11388 FunctionDecl *OperatorNew = nullptr; 11389 if (E->getOperatorNew()) { 11390 OperatorNew = cast_or_null<FunctionDecl>( 11391 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11392 if (!OperatorNew) 11393 return ExprError(); 11394 } 11395 11396 FunctionDecl *OperatorDelete = nullptr; 11397 if (E->getOperatorDelete()) { 11398 OperatorDelete = cast_or_null<FunctionDecl>( 11399 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11400 if (!OperatorDelete) 11401 return ExprError(); 11402 } 11403 11404 if (!getDerived().AlwaysRebuild() && 11405 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11406 ArraySize == E->getArraySize() && 11407 NewInit.get() == OldInit && 11408 OperatorNew == E->getOperatorNew() && 11409 OperatorDelete == E->getOperatorDelete() && 11410 !ArgumentChanged) { 11411 // Mark any declarations we need as referenced. 11412 // FIXME: instantiation-specific. 11413 if (OperatorNew) 11414 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11415 if (OperatorDelete) 11416 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11417 11418 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11419 QualType ElementType 11420 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11421 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11422 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11423 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11424 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11425 } 11426 } 11427 } 11428 11429 return E; 11430 } 11431 11432 QualType AllocType = AllocTypeInfo->getType(); 11433 if (!ArraySize) { 11434 // If no array size was specified, but the new expression was 11435 // instantiated with an array type (e.g., "new T" where T is 11436 // instantiated with "int[4]"), extract the outer bound from the 11437 // array type as our array size. We do this with constant and 11438 // dependently-sized array types. 11439 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11440 if (!ArrayT) { 11441 // Do nothing 11442 } else if (const ConstantArrayType *ConsArrayT 11443 = dyn_cast<ConstantArrayType>(ArrayT)) { 11444 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11445 SemaRef.Context.getSizeType(), 11446 /*FIXME:*/ E->getBeginLoc()); 11447 AllocType = ConsArrayT->getElementType(); 11448 } else if (const DependentSizedArrayType *DepArrayT 11449 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11450 if (DepArrayT->getSizeExpr()) { 11451 ArraySize = DepArrayT->getSizeExpr(); 11452 AllocType = DepArrayT->getElementType(); 11453 } 11454 } 11455 } 11456 11457 return getDerived().RebuildCXXNewExpr( 11458 E->getBeginLoc(), E->isGlobalNew(), 11459 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11460 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11461 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11462 } 11463 11464 template<typename Derived> 11465 ExprResult 11466 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11467 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11468 if (Operand.isInvalid()) 11469 return ExprError(); 11470 11471 // Transform the delete operator, if known. 11472 FunctionDecl *OperatorDelete = nullptr; 11473 if (E->getOperatorDelete()) { 11474 OperatorDelete = cast_or_null<FunctionDecl>( 11475 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11476 if (!OperatorDelete) 11477 return ExprError(); 11478 } 11479 11480 if (!getDerived().AlwaysRebuild() && 11481 Operand.get() == E->getArgument() && 11482 OperatorDelete == E->getOperatorDelete()) { 11483 // Mark any declarations we need as referenced. 11484 // FIXME: instantiation-specific. 11485 if (OperatorDelete) 11486 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11487 11488 if (!E->getArgument()->isTypeDependent()) { 11489 QualType Destroyed = SemaRef.Context.getBaseElementType( 11490 E->getDestroyedType()); 11491 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11492 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11493 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11494 SemaRef.LookupDestructor(Record)); 11495 } 11496 } 11497 11498 return E; 11499 } 11500 11501 return getDerived().RebuildCXXDeleteExpr( 11502 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11503 } 11504 11505 template<typename Derived> 11506 ExprResult 11507 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11508 CXXPseudoDestructorExpr *E) { 11509 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11510 if (Base.isInvalid()) 11511 return ExprError(); 11512 11513 ParsedType ObjectTypePtr; 11514 bool MayBePseudoDestructor = false; 11515 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11516 E->getOperatorLoc(), 11517 E->isArrow()? tok::arrow : tok::period, 11518 ObjectTypePtr, 11519 MayBePseudoDestructor); 11520 if (Base.isInvalid()) 11521 return ExprError(); 11522 11523 QualType ObjectType = ObjectTypePtr.get(); 11524 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11525 if (QualifierLoc) { 11526 QualifierLoc 11527 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11528 if (!QualifierLoc) 11529 return ExprError(); 11530 } 11531 CXXScopeSpec SS; 11532 SS.Adopt(QualifierLoc); 11533 11534 PseudoDestructorTypeStorage Destroyed; 11535 if (E->getDestroyedTypeInfo()) { 11536 TypeSourceInfo *DestroyedTypeInfo 11537 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11538 ObjectType, nullptr, SS); 11539 if (!DestroyedTypeInfo) 11540 return ExprError(); 11541 Destroyed = DestroyedTypeInfo; 11542 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11543 // We aren't likely to be able to resolve the identifier down to a type 11544 // now anyway, so just retain the identifier. 11545 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11546 E->getDestroyedTypeLoc()); 11547 } else { 11548 // Look for a destructor known with the given name. 11549 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11550 *E->getDestroyedTypeIdentifier(), 11551 E->getDestroyedTypeLoc(), 11552 /*Scope=*/nullptr, 11553 SS, ObjectTypePtr, 11554 false); 11555 if (!T) 11556 return ExprError(); 11557 11558 Destroyed 11559 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11560 E->getDestroyedTypeLoc()); 11561 } 11562 11563 TypeSourceInfo *ScopeTypeInfo = nullptr; 11564 if (E->getScopeTypeInfo()) { 11565 CXXScopeSpec EmptySS; 11566 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11567 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11568 if (!ScopeTypeInfo) 11569 return ExprError(); 11570 } 11571 11572 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11573 E->getOperatorLoc(), 11574 E->isArrow(), 11575 SS, 11576 ScopeTypeInfo, 11577 E->getColonColonLoc(), 11578 E->getTildeLoc(), 11579 Destroyed); 11580 } 11581 11582 template <typename Derived> 11583 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11584 bool RequiresADL, 11585 LookupResult &R) { 11586 // Transform all the decls. 11587 bool AllEmptyPacks = true; 11588 for (auto *OldD : Old->decls()) { 11589 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11590 if (!InstD) { 11591 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11592 // This can happen because of dependent hiding. 11593 if (isa<UsingShadowDecl>(OldD)) 11594 continue; 11595 else { 11596 R.clear(); 11597 return true; 11598 } 11599 } 11600 11601 // Expand using pack declarations. 11602 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11603 ArrayRef<NamedDecl*> Decls = SingleDecl; 11604 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11605 Decls = UPD->expansions(); 11606 11607 // Expand using declarations. 11608 for (auto *D : Decls) { 11609 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11610 for (auto *SD : UD->shadows()) 11611 R.addDecl(SD); 11612 } else { 11613 R.addDecl(D); 11614 } 11615 } 11616 11617 AllEmptyPacks &= Decls.empty(); 11618 }; 11619 11620 // C++ [temp.res]/8.4.2: 11621 // The program is ill-formed, no diagnostic required, if [...] lookup for 11622 // a name in the template definition found a using-declaration, but the 11623 // lookup in the corresponding scope in the instantiation odoes not find 11624 // any declarations because the using-declaration was a pack expansion and 11625 // the corresponding pack is empty 11626 if (AllEmptyPacks && !RequiresADL) { 11627 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11628 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11629 return true; 11630 } 11631 11632 // Resolve a kind, but don't do any further analysis. If it's 11633 // ambiguous, the callee needs to deal with it. 11634 R.resolveKind(); 11635 return false; 11636 } 11637 11638 template<typename Derived> 11639 ExprResult 11640 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11641 UnresolvedLookupExpr *Old) { 11642 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11643 Sema::LookupOrdinaryName); 11644 11645 // Transform the declaration set. 11646 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11647 return ExprError(); 11648 11649 // Rebuild the nested-name qualifier, if present. 11650 CXXScopeSpec SS; 11651 if (Old->getQualifierLoc()) { 11652 NestedNameSpecifierLoc QualifierLoc 11653 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11654 if (!QualifierLoc) 11655 return ExprError(); 11656 11657 SS.Adopt(QualifierLoc); 11658 } 11659 11660 if (Old->getNamingClass()) { 11661 CXXRecordDecl *NamingClass 11662 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11663 Old->getNameLoc(), 11664 Old->getNamingClass())); 11665 if (!NamingClass) { 11666 R.clear(); 11667 return ExprError(); 11668 } 11669 11670 R.setNamingClass(NamingClass); 11671 } 11672 11673 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11674 11675 // If we have neither explicit template arguments, nor the template keyword, 11676 // it's a normal declaration name or member reference. 11677 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11678 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11679 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11680 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11681 // give a good diagnostic. 11682 if (D && D->isCXXInstanceMember()) { 11683 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11684 /*TemplateArgs=*/nullptr, 11685 /*Scope=*/nullptr); 11686 } 11687 11688 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11689 } 11690 11691 // If we have template arguments, rebuild them, then rebuild the 11692 // templateid expression. 11693 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11694 if (Old->hasExplicitTemplateArgs() && 11695 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11696 Old->getNumTemplateArgs(), 11697 TransArgs)) { 11698 R.clear(); 11699 return ExprError(); 11700 } 11701 11702 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11703 Old->requiresADL(), &TransArgs); 11704 } 11705 11706 template<typename Derived> 11707 ExprResult 11708 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11709 bool ArgChanged = false; 11710 SmallVector<TypeSourceInfo *, 4> Args; 11711 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11712 TypeSourceInfo *From = E->getArg(I); 11713 TypeLoc FromTL = From->getTypeLoc(); 11714 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11715 TypeLocBuilder TLB; 11716 TLB.reserve(FromTL.getFullDataSize()); 11717 QualType To = getDerived().TransformType(TLB, FromTL); 11718 if (To.isNull()) 11719 return ExprError(); 11720 11721 if (To == From->getType()) 11722 Args.push_back(From); 11723 else { 11724 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11725 ArgChanged = true; 11726 } 11727 continue; 11728 } 11729 11730 ArgChanged = true; 11731 11732 // We have a pack expansion. Instantiate it. 11733 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11734 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11735 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11736 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11737 11738 // Determine whether the set of unexpanded parameter packs can and should 11739 // be expanded. 11740 bool Expand = true; 11741 bool RetainExpansion = false; 11742 Optional<unsigned> OrigNumExpansions = 11743 ExpansionTL.getTypePtr()->getNumExpansions(); 11744 Optional<unsigned> NumExpansions = OrigNumExpansions; 11745 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11746 PatternTL.getSourceRange(), 11747 Unexpanded, 11748 Expand, RetainExpansion, 11749 NumExpansions)) 11750 return ExprError(); 11751 11752 if (!Expand) { 11753 // The transform has determined that we should perform a simple 11754 // transformation on the pack expansion, producing another pack 11755 // expansion. 11756 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11757 11758 TypeLocBuilder TLB; 11759 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11760 11761 QualType To = getDerived().TransformType(TLB, PatternTL); 11762 if (To.isNull()) 11763 return ExprError(); 11764 11765 To = getDerived().RebuildPackExpansionType(To, 11766 PatternTL.getSourceRange(), 11767 ExpansionTL.getEllipsisLoc(), 11768 NumExpansions); 11769 if (To.isNull()) 11770 return ExprError(); 11771 11772 PackExpansionTypeLoc ToExpansionTL 11773 = TLB.push<PackExpansionTypeLoc>(To); 11774 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11775 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11776 continue; 11777 } 11778 11779 // Expand the pack expansion by substituting for each argument in the 11780 // pack(s). 11781 for (unsigned I = 0; I != *NumExpansions; ++I) { 11782 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11783 TypeLocBuilder TLB; 11784 TLB.reserve(PatternTL.getFullDataSize()); 11785 QualType To = getDerived().TransformType(TLB, PatternTL); 11786 if (To.isNull()) 11787 return ExprError(); 11788 11789 if (To->containsUnexpandedParameterPack()) { 11790 To = getDerived().RebuildPackExpansionType(To, 11791 PatternTL.getSourceRange(), 11792 ExpansionTL.getEllipsisLoc(), 11793 NumExpansions); 11794 if (To.isNull()) 11795 return ExprError(); 11796 11797 PackExpansionTypeLoc ToExpansionTL 11798 = TLB.push<PackExpansionTypeLoc>(To); 11799 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11800 } 11801 11802 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11803 } 11804 11805 if (!RetainExpansion) 11806 continue; 11807 11808 // If we're supposed to retain a pack expansion, do so by temporarily 11809 // forgetting the partially-substituted parameter pack. 11810 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11811 11812 TypeLocBuilder TLB; 11813 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11814 11815 QualType To = getDerived().TransformType(TLB, PatternTL); 11816 if (To.isNull()) 11817 return ExprError(); 11818 11819 To = getDerived().RebuildPackExpansionType(To, 11820 PatternTL.getSourceRange(), 11821 ExpansionTL.getEllipsisLoc(), 11822 NumExpansions); 11823 if (To.isNull()) 11824 return ExprError(); 11825 11826 PackExpansionTypeLoc ToExpansionTL 11827 = TLB.push<PackExpansionTypeLoc>(To); 11828 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11829 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11830 } 11831 11832 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11833 return E; 11834 11835 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11836 E->getEndLoc()); 11837 } 11838 11839 template<typename Derived> 11840 ExprResult 11841 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11842 ConceptSpecializationExpr *E) { 11843 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11844 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11845 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11846 Old->NumTemplateArgs, TransArgs)) 11847 return ExprError(); 11848 11849 return getDerived().RebuildConceptSpecializationExpr( 11850 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11851 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11852 &TransArgs); 11853 } 11854 11855 template<typename Derived> 11856 ExprResult 11857 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11858 SmallVector<ParmVarDecl*, 4> TransParams; 11859 SmallVector<QualType, 4> TransParamTypes; 11860 Sema::ExtParameterInfoBuilder ExtParamInfos; 11861 11862 // C++2a [expr.prim.req]p2 11863 // Expressions appearing within a requirement-body are unevaluated operands. 11864 EnterExpressionEvaluationContext Ctx( 11865 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11866 11867 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11868 getSema().Context, getSema().CurContext, 11869 E->getBody()->getBeginLoc()); 11870 11871 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11872 11873 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11874 E->getLocalParameters(), 11875 /*ParamTypes=*/nullptr, 11876 /*ParamInfos=*/nullptr, 11877 TransParamTypes, &TransParams, 11878 ExtParamInfos)) 11879 return ExprError(); 11880 11881 for (ParmVarDecl *Param : TransParams) 11882 Param->setDeclContext(Body); 11883 11884 SmallVector<concepts::Requirement *, 4> TransReqs; 11885 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11886 TransReqs)) 11887 return ExprError(); 11888 11889 for (concepts::Requirement *Req : TransReqs) { 11890 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11891 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11892 ER->getReturnTypeRequirement() 11893 .getTypeConstraintTemplateParameterList()->getParam(0) 11894 ->setDeclContext(Body); 11895 } 11896 } 11897 } 11898 11899 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11900 TransParams, TransReqs, 11901 E->getRBraceLoc()); 11902 } 11903 11904 template<typename Derived> 11905 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11906 ArrayRef<concepts::Requirement *> Reqs, 11907 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11908 for (concepts::Requirement *Req : Reqs) { 11909 concepts::Requirement *TransReq = nullptr; 11910 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11911 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11912 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11913 TransReq = getDerived().TransformExprRequirement(ExprReq); 11914 else 11915 TransReq = getDerived().TransformNestedRequirement( 11916 cast<concepts::NestedRequirement>(Req)); 11917 if (!TransReq) 11918 return true; 11919 Transformed.push_back(TransReq); 11920 } 11921 return false; 11922 } 11923 11924 template<typename Derived> 11925 concepts::TypeRequirement * 11926 TreeTransform<Derived>::TransformTypeRequirement( 11927 concepts::TypeRequirement *Req) { 11928 if (Req->isSubstitutionFailure()) { 11929 if (getDerived().AlwaysRebuild()) 11930 return getDerived().RebuildTypeRequirement( 11931 Req->getSubstitutionDiagnostic()); 11932 return Req; 11933 } 11934 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11935 if (!TransType) 11936 return nullptr; 11937 return getDerived().RebuildTypeRequirement(TransType); 11938 } 11939 11940 template<typename Derived> 11941 concepts::ExprRequirement * 11942 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 11943 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 11944 if (Req->isExprSubstitutionFailure()) 11945 TransExpr = Req->getExprSubstitutionDiagnostic(); 11946 else { 11947 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 11948 if (TransExprRes.isInvalid()) 11949 return nullptr; 11950 TransExpr = TransExprRes.get(); 11951 } 11952 11953 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 11954 const auto &RetReq = Req->getReturnTypeRequirement(); 11955 if (RetReq.isEmpty()) 11956 TransRetReq.emplace(); 11957 else if (RetReq.isSubstitutionFailure()) 11958 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 11959 else if (RetReq.isTypeConstraint()) { 11960 TemplateParameterList *OrigTPL = 11961 RetReq.getTypeConstraintTemplateParameterList(); 11962 TemplateParameterList *TPL = 11963 getDerived().TransformTemplateParameterList(OrigTPL); 11964 if (!TPL) 11965 return nullptr; 11966 TransRetReq.emplace(TPL); 11967 } 11968 assert(TransRetReq.hasValue() && 11969 "All code paths leading here must set TransRetReq"); 11970 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 11971 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 11972 Req->getNoexceptLoc(), 11973 std::move(*TransRetReq)); 11974 return getDerived().RebuildExprRequirement( 11975 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 11976 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 11977 } 11978 11979 template<typename Derived> 11980 concepts::NestedRequirement * 11981 TreeTransform<Derived>::TransformNestedRequirement( 11982 concepts::NestedRequirement *Req) { 11983 if (Req->isSubstitutionFailure()) { 11984 if (getDerived().AlwaysRebuild()) 11985 return getDerived().RebuildNestedRequirement( 11986 Req->getSubstitutionDiagnostic()); 11987 return Req; 11988 } 11989 ExprResult TransConstraint = 11990 getDerived().TransformExpr(Req->getConstraintExpr()); 11991 if (TransConstraint.isInvalid()) 11992 return nullptr; 11993 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 11994 } 11995 11996 template<typename Derived> 11997 ExprResult 11998 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 11999 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12000 if (!T) 12001 return ExprError(); 12002 12003 if (!getDerived().AlwaysRebuild() && 12004 T == E->getQueriedTypeSourceInfo()) 12005 return E; 12006 12007 ExprResult SubExpr; 12008 { 12009 EnterExpressionEvaluationContext Unevaluated( 12010 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12011 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12012 if (SubExpr.isInvalid()) 12013 return ExprError(); 12014 12015 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12016 return E; 12017 } 12018 12019 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12020 SubExpr.get(), E->getEndLoc()); 12021 } 12022 12023 template<typename Derived> 12024 ExprResult 12025 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12026 ExprResult SubExpr; 12027 { 12028 EnterExpressionEvaluationContext Unevaluated( 12029 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12030 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12031 if (SubExpr.isInvalid()) 12032 return ExprError(); 12033 12034 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12035 return E; 12036 } 12037 12038 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12039 SubExpr.get(), E->getEndLoc()); 12040 } 12041 12042 template <typename Derived> 12043 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12044 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12045 TypeSourceInfo **RecoveryTSI) { 12046 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12047 DRE, AddrTaken, RecoveryTSI); 12048 12049 // Propagate both errors and recovered types, which return ExprEmpty. 12050 if (!NewDRE.isUsable()) 12051 return NewDRE; 12052 12053 // We got an expr, wrap it up in parens. 12054 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12055 return PE; 12056 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12057 PE->getRParen()); 12058 } 12059 12060 template <typename Derived> 12061 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12062 DependentScopeDeclRefExpr *E) { 12063 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12064 nullptr); 12065 } 12066 12067 template<typename Derived> 12068 ExprResult 12069 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12070 DependentScopeDeclRefExpr *E, 12071 bool IsAddressOfOperand, 12072 TypeSourceInfo **RecoveryTSI) { 12073 assert(E->getQualifierLoc()); 12074 NestedNameSpecifierLoc QualifierLoc 12075 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12076 if (!QualifierLoc) 12077 return ExprError(); 12078 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12079 12080 // TODO: If this is a conversion-function-id, verify that the 12081 // destination type name (if present) resolves the same way after 12082 // instantiation as it did in the local scope. 12083 12084 DeclarationNameInfo NameInfo 12085 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12086 if (!NameInfo.getName()) 12087 return ExprError(); 12088 12089 if (!E->hasExplicitTemplateArgs()) { 12090 if (!getDerived().AlwaysRebuild() && 12091 QualifierLoc == E->getQualifierLoc() && 12092 // Note: it is sufficient to compare the Name component of NameInfo: 12093 // if name has not changed, DNLoc has not changed either. 12094 NameInfo.getName() == E->getDeclName()) 12095 return E; 12096 12097 return getDerived().RebuildDependentScopeDeclRefExpr( 12098 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12099 IsAddressOfOperand, RecoveryTSI); 12100 } 12101 12102 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12103 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12104 E->getNumTemplateArgs(), 12105 TransArgs)) 12106 return ExprError(); 12107 12108 return getDerived().RebuildDependentScopeDeclRefExpr( 12109 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12110 RecoveryTSI); 12111 } 12112 12113 template<typename Derived> 12114 ExprResult 12115 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12116 // CXXConstructExprs other than for list-initialization and 12117 // CXXTemporaryObjectExpr are always implicit, so when we have 12118 // a 1-argument construction we just transform that argument. 12119 if (getDerived().AllowSkippingCXXConstructExpr() && 12120 ((E->getNumArgs() == 1 || 12121 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12122 (!getDerived().DropCallArgument(E->getArg(0))) && 12123 !E->isListInitialization())) 12124 return getDerived().TransformExpr(E->getArg(0)); 12125 12126 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12127 12128 QualType T = getDerived().TransformType(E->getType()); 12129 if (T.isNull()) 12130 return ExprError(); 12131 12132 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12133 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12134 if (!Constructor) 12135 return ExprError(); 12136 12137 bool ArgumentChanged = false; 12138 SmallVector<Expr*, 8> Args; 12139 { 12140 EnterExpressionEvaluationContext Context( 12141 getSema(), EnterExpressionEvaluationContext::InitList, 12142 E->isListInitialization()); 12143 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12144 &ArgumentChanged)) 12145 return ExprError(); 12146 } 12147 12148 if (!getDerived().AlwaysRebuild() && 12149 T == E->getType() && 12150 Constructor == E->getConstructor() && 12151 !ArgumentChanged) { 12152 // Mark the constructor as referenced. 12153 // FIXME: Instantiation-specific 12154 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12155 return E; 12156 } 12157 12158 return getDerived().RebuildCXXConstructExpr( 12159 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12160 E->hadMultipleCandidates(), E->isListInitialization(), 12161 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12162 E->getConstructionKind(), E->getParenOrBraceRange()); 12163 } 12164 12165 template<typename Derived> 12166 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12167 CXXInheritedCtorInitExpr *E) { 12168 QualType T = getDerived().TransformType(E->getType()); 12169 if (T.isNull()) 12170 return ExprError(); 12171 12172 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12173 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12174 if (!Constructor) 12175 return ExprError(); 12176 12177 if (!getDerived().AlwaysRebuild() && 12178 T == E->getType() && 12179 Constructor == E->getConstructor()) { 12180 // Mark the constructor as referenced. 12181 // FIXME: Instantiation-specific 12182 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12183 return E; 12184 } 12185 12186 return getDerived().RebuildCXXInheritedCtorInitExpr( 12187 T, E->getLocation(), Constructor, 12188 E->constructsVBase(), E->inheritedFromVBase()); 12189 } 12190 12191 /// Transform a C++ temporary-binding expression. 12192 /// 12193 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12194 /// transform the subexpression and return that. 12195 template<typename Derived> 12196 ExprResult 12197 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12198 return getDerived().TransformExpr(E->getSubExpr()); 12199 } 12200 12201 /// Transform a C++ expression that contains cleanups that should 12202 /// be run after the expression is evaluated. 12203 /// 12204 /// Since ExprWithCleanups nodes are implicitly generated, we 12205 /// just transform the subexpression and return that. 12206 template<typename Derived> 12207 ExprResult 12208 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12209 return getDerived().TransformExpr(E->getSubExpr()); 12210 } 12211 12212 template<typename Derived> 12213 ExprResult 12214 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12215 CXXTemporaryObjectExpr *E) { 12216 TypeSourceInfo *T = 12217 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12218 if (!T) 12219 return ExprError(); 12220 12221 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12222 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12223 if (!Constructor) 12224 return ExprError(); 12225 12226 bool ArgumentChanged = false; 12227 SmallVector<Expr*, 8> Args; 12228 Args.reserve(E->getNumArgs()); 12229 { 12230 EnterExpressionEvaluationContext Context( 12231 getSema(), EnterExpressionEvaluationContext::InitList, 12232 E->isListInitialization()); 12233 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12234 &ArgumentChanged)) 12235 return ExprError(); 12236 } 12237 12238 if (!getDerived().AlwaysRebuild() && 12239 T == E->getTypeSourceInfo() && 12240 Constructor == E->getConstructor() && 12241 !ArgumentChanged) { 12242 // FIXME: Instantiation-specific 12243 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12244 return SemaRef.MaybeBindToTemporary(E); 12245 } 12246 12247 // FIXME: We should just pass E->isListInitialization(), but we're not 12248 // prepared to handle list-initialization without a child InitListExpr. 12249 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12250 return getDerived().RebuildCXXTemporaryObjectExpr( 12251 T, LParenLoc, Args, E->getEndLoc(), 12252 /*ListInitialization=*/LParenLoc.isInvalid()); 12253 } 12254 12255 template<typename Derived> 12256 ExprResult 12257 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12258 // Transform any init-capture expressions before entering the scope of the 12259 // lambda body, because they are not semantically within that scope. 12260 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12261 struct TransformedInitCapture { 12262 // The location of the ... if the result is retaining a pack expansion. 12263 SourceLocation EllipsisLoc; 12264 // Zero or more expansions of the init-capture. 12265 SmallVector<InitCaptureInfoTy, 4> Expansions; 12266 }; 12267 SmallVector<TransformedInitCapture, 4> InitCaptures; 12268 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12269 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12270 CEnd = E->capture_end(); 12271 C != CEnd; ++C) { 12272 if (!E->isInitCapture(C)) 12273 continue; 12274 12275 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12276 VarDecl *OldVD = C->getCapturedVar(); 12277 12278 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12279 Optional<unsigned> NumExpansions) { 12280 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12281 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12282 12283 if (NewExprInitResult.isInvalid()) { 12284 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12285 return; 12286 } 12287 Expr *NewExprInit = NewExprInitResult.get(); 12288 12289 QualType NewInitCaptureType = 12290 getSema().buildLambdaInitCaptureInitialization( 12291 C->getLocation(), OldVD->getType()->isReferenceType(), 12292 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12293 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12294 NewExprInit); 12295 Result.Expansions.push_back( 12296 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12297 }; 12298 12299 // If this is an init-capture pack, consider expanding the pack now. 12300 if (OldVD->isParameterPack()) { 12301 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12302 ->getTypeLoc() 12303 .castAs<PackExpansionTypeLoc>(); 12304 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12305 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12306 12307 // Determine whether the set of unexpanded parameter packs can and should 12308 // be expanded. 12309 bool Expand = true; 12310 bool RetainExpansion = false; 12311 Optional<unsigned> OrigNumExpansions = 12312 ExpansionTL.getTypePtr()->getNumExpansions(); 12313 Optional<unsigned> NumExpansions = OrigNumExpansions; 12314 if (getDerived().TryExpandParameterPacks( 12315 ExpansionTL.getEllipsisLoc(), 12316 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12317 RetainExpansion, NumExpansions)) 12318 return ExprError(); 12319 if (Expand) { 12320 for (unsigned I = 0; I != *NumExpansions; ++I) { 12321 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12322 SubstInitCapture(SourceLocation(), None); 12323 } 12324 } 12325 if (!Expand || RetainExpansion) { 12326 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12327 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12328 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12329 } 12330 } else { 12331 SubstInitCapture(SourceLocation(), None); 12332 } 12333 } 12334 12335 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12336 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12337 12338 // Transform the template parameters, and add them to the current 12339 // instantiation scope. The null case is handled correctly. 12340 auto TPL = getDerived().TransformTemplateParameterList( 12341 E->getTemplateParameterList()); 12342 LSI->GLTemplateParameterList = TPL; 12343 12344 // Transform the type of the original lambda's call operator. 12345 // The transformation MUST be done in the CurrentInstantiationScope since 12346 // it introduces a mapping of the original to the newly created 12347 // transformed parameters. 12348 TypeSourceInfo *NewCallOpTSI = nullptr; 12349 { 12350 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12351 FunctionProtoTypeLoc OldCallOpFPTL = 12352 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12353 12354 TypeLocBuilder NewCallOpTLBuilder; 12355 SmallVector<QualType, 4> ExceptionStorage; 12356 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12357 QualType NewCallOpType = TransformFunctionProtoType( 12358 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12359 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12360 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12361 ExceptionStorage, Changed); 12362 }); 12363 if (NewCallOpType.isNull()) 12364 return ExprError(); 12365 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12366 NewCallOpType); 12367 } 12368 12369 // Transform the trailing requires clause 12370 ExprResult NewTrailingRequiresClause; 12371 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12372 // FIXME: Concepts: Substitution into requires clause should only happen 12373 // when checking satisfaction. 12374 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12375 12376 // Create the local class that will describe the lambda. 12377 // FIXME: KnownDependent below is wrong when substituting inside a templated 12378 // context that isn't a DeclContext (such as a variable template). 12379 CXXRecordDecl *OldClass = E->getLambdaClass(); 12380 CXXRecordDecl *Class 12381 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12382 NewCallOpTSI, 12383 /*KnownDependent=*/false, 12384 E->getCaptureDefault()); 12385 getDerived().transformedLocalDecl(OldClass, {Class}); 12386 12387 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12388 if (getDerived().ReplacingOriginal()) 12389 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12390 OldClass->hasKnownLambdaInternalLinkage(), 12391 OldClass->getLambdaContextDecl()); 12392 12393 // Build the call operator. 12394 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12395 Class, E->getIntroducerRange(), NewCallOpTSI, 12396 E->getCallOperator()->getEndLoc(), 12397 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12398 E->getCallOperator()->getConstexprKind(), 12399 NewTrailingRequiresClause.get()); 12400 12401 LSI->CallOperator = NewCallOperator; 12402 12403 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12404 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12405 12406 // Number the lambda for linkage purposes if necessary. 12407 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12408 12409 // Introduce the context of the call operator. 12410 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12411 /*NewThisContext*/false); 12412 12413 // Enter the scope of the lambda. 12414 getSema().buildLambdaScope(LSI, NewCallOperator, 12415 E->getIntroducerRange(), 12416 E->getCaptureDefault(), 12417 E->getCaptureDefaultLoc(), 12418 E->hasExplicitParameters(), 12419 E->hasExplicitResultType(), 12420 E->isMutable()); 12421 12422 bool Invalid = false; 12423 12424 // Transform captures. 12425 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12426 CEnd = E->capture_end(); 12427 C != CEnd; ++C) { 12428 // When we hit the first implicit capture, tell Sema that we've finished 12429 // the list of explicit captures. 12430 if (C->isImplicit()) 12431 break; 12432 12433 // Capturing 'this' is trivial. 12434 if (C->capturesThis()) { 12435 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12436 /*BuildAndDiagnose*/ true, nullptr, 12437 C->getCaptureKind() == LCK_StarThis); 12438 continue; 12439 } 12440 // Captured expression will be recaptured during captured variables 12441 // rebuilding. 12442 if (C->capturesVLAType()) 12443 continue; 12444 12445 // Rebuild init-captures, including the implied field declaration. 12446 if (E->isInitCapture(C)) { 12447 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12448 12449 VarDecl *OldVD = C->getCapturedVar(); 12450 llvm::SmallVector<Decl*, 4> NewVDs; 12451 12452 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12453 ExprResult Init = Info.first; 12454 QualType InitQualType = Info.second; 12455 if (Init.isInvalid() || InitQualType.isNull()) { 12456 Invalid = true; 12457 break; 12458 } 12459 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12460 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12461 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12462 if (!NewVD) { 12463 Invalid = true; 12464 break; 12465 } 12466 NewVDs.push_back(NewVD); 12467 getSema().addInitCapture(LSI, NewVD); 12468 } 12469 12470 if (Invalid) 12471 break; 12472 12473 getDerived().transformedLocalDecl(OldVD, NewVDs); 12474 continue; 12475 } 12476 12477 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12478 12479 // Determine the capture kind for Sema. 12480 Sema::TryCaptureKind Kind 12481 = C->isImplicit()? Sema::TryCapture_Implicit 12482 : C->getCaptureKind() == LCK_ByCopy 12483 ? Sema::TryCapture_ExplicitByVal 12484 : Sema::TryCapture_ExplicitByRef; 12485 SourceLocation EllipsisLoc; 12486 if (C->isPackExpansion()) { 12487 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12488 bool ShouldExpand = false; 12489 bool RetainExpansion = false; 12490 Optional<unsigned> NumExpansions; 12491 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12492 C->getLocation(), 12493 Unexpanded, 12494 ShouldExpand, RetainExpansion, 12495 NumExpansions)) { 12496 Invalid = true; 12497 continue; 12498 } 12499 12500 if (ShouldExpand) { 12501 // The transform has determined that we should perform an expansion; 12502 // transform and capture each of the arguments. 12503 // expansion of the pattern. Do so. 12504 VarDecl *Pack = C->getCapturedVar(); 12505 for (unsigned I = 0; I != *NumExpansions; ++I) { 12506 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12507 VarDecl *CapturedVar 12508 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12509 Pack)); 12510 if (!CapturedVar) { 12511 Invalid = true; 12512 continue; 12513 } 12514 12515 // Capture the transformed variable. 12516 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12517 } 12518 12519 // FIXME: Retain a pack expansion if RetainExpansion is true. 12520 12521 continue; 12522 } 12523 12524 EllipsisLoc = C->getEllipsisLoc(); 12525 } 12526 12527 // Transform the captured variable. 12528 VarDecl *CapturedVar 12529 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12530 C->getCapturedVar())); 12531 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12532 Invalid = true; 12533 continue; 12534 } 12535 12536 // Capture the transformed variable. 12537 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12538 EllipsisLoc); 12539 } 12540 getSema().finishLambdaExplicitCaptures(LSI); 12541 12542 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12543 // evaluation context even if we're not transforming the function body. 12544 getSema().PushExpressionEvaluationContext( 12545 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12546 12547 // Instantiate the body of the lambda expression. 12548 StmtResult Body = 12549 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12550 12551 // ActOnLambda* will pop the function scope for us. 12552 FuncScopeCleanup.disable(); 12553 12554 if (Body.isInvalid()) { 12555 SavedContext.pop(); 12556 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12557 /*IsInstantiation=*/true); 12558 return ExprError(); 12559 } 12560 12561 // Copy the LSI before ActOnFinishFunctionBody removes it. 12562 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12563 // the call operator. 12564 auto LSICopy = *LSI; 12565 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12566 /*IsInstantiation*/ true); 12567 SavedContext.pop(); 12568 12569 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12570 &LSICopy); 12571 } 12572 12573 template<typename Derived> 12574 StmtResult 12575 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12576 return TransformStmt(S); 12577 } 12578 12579 template<typename Derived> 12580 StmtResult 12581 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12582 // Transform captures. 12583 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12584 CEnd = E->capture_end(); 12585 C != CEnd; ++C) { 12586 // When we hit the first implicit capture, tell Sema that we've finished 12587 // the list of explicit captures. 12588 if (!C->isImplicit()) 12589 continue; 12590 12591 // Capturing 'this' is trivial. 12592 if (C->capturesThis()) { 12593 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12594 /*BuildAndDiagnose*/ true, nullptr, 12595 C->getCaptureKind() == LCK_StarThis); 12596 continue; 12597 } 12598 // Captured expression will be recaptured during captured variables 12599 // rebuilding. 12600 if (C->capturesVLAType()) 12601 continue; 12602 12603 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12604 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12605 12606 // Transform the captured variable. 12607 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12608 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12609 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12610 return StmtError(); 12611 12612 // Capture the transformed variable. 12613 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12614 } 12615 12616 return S; 12617 } 12618 12619 template<typename Derived> 12620 ExprResult 12621 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12622 CXXUnresolvedConstructExpr *E) { 12623 TypeSourceInfo *T = 12624 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12625 if (!T) 12626 return ExprError(); 12627 12628 bool ArgumentChanged = false; 12629 SmallVector<Expr*, 8> Args; 12630 Args.reserve(E->arg_size()); 12631 { 12632 EnterExpressionEvaluationContext Context( 12633 getSema(), EnterExpressionEvaluationContext::InitList, 12634 E->isListInitialization()); 12635 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12636 &ArgumentChanged)) 12637 return ExprError(); 12638 } 12639 12640 if (!getDerived().AlwaysRebuild() && 12641 T == E->getTypeSourceInfo() && 12642 !ArgumentChanged) 12643 return E; 12644 12645 // FIXME: we're faking the locations of the commas 12646 return getDerived().RebuildCXXUnresolvedConstructExpr( 12647 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12648 } 12649 12650 template<typename Derived> 12651 ExprResult 12652 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12653 CXXDependentScopeMemberExpr *E) { 12654 // Transform the base of the expression. 12655 ExprResult Base((Expr*) nullptr); 12656 Expr *OldBase; 12657 QualType BaseType; 12658 QualType ObjectType; 12659 if (!E->isImplicitAccess()) { 12660 OldBase = E->getBase(); 12661 Base = getDerived().TransformExpr(OldBase); 12662 if (Base.isInvalid()) 12663 return ExprError(); 12664 12665 // Start the member reference and compute the object's type. 12666 ParsedType ObjectTy; 12667 bool MayBePseudoDestructor = false; 12668 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12669 E->getOperatorLoc(), 12670 E->isArrow()? tok::arrow : tok::period, 12671 ObjectTy, 12672 MayBePseudoDestructor); 12673 if (Base.isInvalid()) 12674 return ExprError(); 12675 12676 ObjectType = ObjectTy.get(); 12677 BaseType = ((Expr*) Base.get())->getType(); 12678 } else { 12679 OldBase = nullptr; 12680 BaseType = getDerived().TransformType(E->getBaseType()); 12681 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12682 } 12683 12684 // Transform the first part of the nested-name-specifier that qualifies 12685 // the member name. 12686 NamedDecl *FirstQualifierInScope 12687 = getDerived().TransformFirstQualifierInScope( 12688 E->getFirstQualifierFoundInScope(), 12689 E->getQualifierLoc().getBeginLoc()); 12690 12691 NestedNameSpecifierLoc QualifierLoc; 12692 if (E->getQualifier()) { 12693 QualifierLoc 12694 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12695 ObjectType, 12696 FirstQualifierInScope); 12697 if (!QualifierLoc) 12698 return ExprError(); 12699 } 12700 12701 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12702 12703 // TODO: If this is a conversion-function-id, verify that the 12704 // destination type name (if present) resolves the same way after 12705 // instantiation as it did in the local scope. 12706 12707 DeclarationNameInfo NameInfo 12708 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12709 if (!NameInfo.getName()) 12710 return ExprError(); 12711 12712 if (!E->hasExplicitTemplateArgs()) { 12713 // This is a reference to a member without an explicitly-specified 12714 // template argument list. Optimize for this common case. 12715 if (!getDerived().AlwaysRebuild() && 12716 Base.get() == OldBase && 12717 BaseType == E->getBaseType() && 12718 QualifierLoc == E->getQualifierLoc() && 12719 NameInfo.getName() == E->getMember() && 12720 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12721 return E; 12722 12723 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12724 BaseType, 12725 E->isArrow(), 12726 E->getOperatorLoc(), 12727 QualifierLoc, 12728 TemplateKWLoc, 12729 FirstQualifierInScope, 12730 NameInfo, 12731 /*TemplateArgs*/nullptr); 12732 } 12733 12734 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12735 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12736 E->getNumTemplateArgs(), 12737 TransArgs)) 12738 return ExprError(); 12739 12740 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12741 BaseType, 12742 E->isArrow(), 12743 E->getOperatorLoc(), 12744 QualifierLoc, 12745 TemplateKWLoc, 12746 FirstQualifierInScope, 12747 NameInfo, 12748 &TransArgs); 12749 } 12750 12751 template<typename Derived> 12752 ExprResult 12753 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12754 // Transform the base of the expression. 12755 ExprResult Base((Expr*) nullptr); 12756 QualType BaseType; 12757 if (!Old->isImplicitAccess()) { 12758 Base = getDerived().TransformExpr(Old->getBase()); 12759 if (Base.isInvalid()) 12760 return ExprError(); 12761 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12762 Old->isArrow()); 12763 if (Base.isInvalid()) 12764 return ExprError(); 12765 BaseType = Base.get()->getType(); 12766 } else { 12767 BaseType = getDerived().TransformType(Old->getBaseType()); 12768 } 12769 12770 NestedNameSpecifierLoc QualifierLoc; 12771 if (Old->getQualifierLoc()) { 12772 QualifierLoc 12773 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12774 if (!QualifierLoc) 12775 return ExprError(); 12776 } 12777 12778 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12779 12780 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12781 Sema::LookupOrdinaryName); 12782 12783 // Transform the declaration set. 12784 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12785 return ExprError(); 12786 12787 // Determine the naming class. 12788 if (Old->getNamingClass()) { 12789 CXXRecordDecl *NamingClass 12790 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12791 Old->getMemberLoc(), 12792 Old->getNamingClass())); 12793 if (!NamingClass) 12794 return ExprError(); 12795 12796 R.setNamingClass(NamingClass); 12797 } 12798 12799 TemplateArgumentListInfo TransArgs; 12800 if (Old->hasExplicitTemplateArgs()) { 12801 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12802 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12803 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12804 Old->getNumTemplateArgs(), 12805 TransArgs)) 12806 return ExprError(); 12807 } 12808 12809 // FIXME: to do this check properly, we will need to preserve the 12810 // first-qualifier-in-scope here, just in case we had a dependent 12811 // base (and therefore couldn't do the check) and a 12812 // nested-name-qualifier (and therefore could do the lookup). 12813 NamedDecl *FirstQualifierInScope = nullptr; 12814 12815 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12816 BaseType, 12817 Old->getOperatorLoc(), 12818 Old->isArrow(), 12819 QualifierLoc, 12820 TemplateKWLoc, 12821 FirstQualifierInScope, 12822 R, 12823 (Old->hasExplicitTemplateArgs() 12824 ? &TransArgs : nullptr)); 12825 } 12826 12827 template<typename Derived> 12828 ExprResult 12829 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12830 EnterExpressionEvaluationContext Unevaluated( 12831 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12832 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12833 if (SubExpr.isInvalid()) 12834 return ExprError(); 12835 12836 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12837 return E; 12838 12839 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12840 } 12841 12842 template<typename Derived> 12843 ExprResult 12844 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12845 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12846 if (Pattern.isInvalid()) 12847 return ExprError(); 12848 12849 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12850 return E; 12851 12852 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12853 E->getNumExpansions()); 12854 } 12855 12856 template<typename Derived> 12857 ExprResult 12858 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12859 // If E is not value-dependent, then nothing will change when we transform it. 12860 // Note: This is an instantiation-centric view. 12861 if (!E->isValueDependent()) 12862 return E; 12863 12864 EnterExpressionEvaluationContext Unevaluated( 12865 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12866 12867 ArrayRef<TemplateArgument> PackArgs; 12868 TemplateArgument ArgStorage; 12869 12870 // Find the argument list to transform. 12871 if (E->isPartiallySubstituted()) { 12872 PackArgs = E->getPartialArguments(); 12873 } else if (E->isValueDependent()) { 12874 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12875 bool ShouldExpand = false; 12876 bool RetainExpansion = false; 12877 Optional<unsigned> NumExpansions; 12878 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12879 Unexpanded, 12880 ShouldExpand, RetainExpansion, 12881 NumExpansions)) 12882 return ExprError(); 12883 12884 // If we need to expand the pack, build a template argument from it and 12885 // expand that. 12886 if (ShouldExpand) { 12887 auto *Pack = E->getPack(); 12888 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12889 ArgStorage = getSema().Context.getPackExpansionType( 12890 getSema().Context.getTypeDeclType(TTPD), None); 12891 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12892 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12893 } else { 12894 auto *VD = cast<ValueDecl>(Pack); 12895 ExprResult DRE = getSema().BuildDeclRefExpr( 12896 VD, VD->getType().getNonLValueExprType(getSema().Context), 12897 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12898 E->getPackLoc()); 12899 if (DRE.isInvalid()) 12900 return ExprError(); 12901 ArgStorage = new (getSema().Context) PackExpansionExpr( 12902 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12903 } 12904 PackArgs = ArgStorage; 12905 } 12906 } 12907 12908 // If we're not expanding the pack, just transform the decl. 12909 if (!PackArgs.size()) { 12910 auto *Pack = cast_or_null<NamedDecl>( 12911 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12912 if (!Pack) 12913 return ExprError(); 12914 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12915 E->getPackLoc(), 12916 E->getRParenLoc(), None, None); 12917 } 12918 12919 // Try to compute the result without performing a partial substitution. 12920 Optional<unsigned> Result = 0; 12921 for (const TemplateArgument &Arg : PackArgs) { 12922 if (!Arg.isPackExpansion()) { 12923 Result = *Result + 1; 12924 continue; 12925 } 12926 12927 TemplateArgumentLoc ArgLoc; 12928 InventTemplateArgumentLoc(Arg, ArgLoc); 12929 12930 // Find the pattern of the pack expansion. 12931 SourceLocation Ellipsis; 12932 Optional<unsigned> OrigNumExpansions; 12933 TemplateArgumentLoc Pattern = 12934 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12935 OrigNumExpansions); 12936 12937 // Substitute under the pack expansion. Do not expand the pack (yet). 12938 TemplateArgumentLoc OutPattern; 12939 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12940 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 12941 /*Uneval*/ true)) 12942 return true; 12943 12944 // See if we can determine the number of arguments from the result. 12945 Optional<unsigned> NumExpansions = 12946 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 12947 if (!NumExpansions) { 12948 // No: we must be in an alias template expansion, and we're going to need 12949 // to actually expand the packs. 12950 Result = None; 12951 break; 12952 } 12953 12954 Result = *Result + *NumExpansions; 12955 } 12956 12957 // Common case: we could determine the number of expansions without 12958 // substituting. 12959 if (Result) 12960 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12961 E->getPackLoc(), 12962 E->getRParenLoc(), *Result, None); 12963 12964 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 12965 E->getPackLoc()); 12966 { 12967 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 12968 typedef TemplateArgumentLocInventIterator< 12969 Derived, const TemplateArgument*> PackLocIterator; 12970 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 12971 PackLocIterator(*this, PackArgs.end()), 12972 TransformedPackArgs, /*Uneval*/true)) 12973 return ExprError(); 12974 } 12975 12976 // Check whether we managed to fully-expand the pack. 12977 // FIXME: Is it possible for us to do so and not hit the early exit path? 12978 SmallVector<TemplateArgument, 8> Args; 12979 bool PartialSubstitution = false; 12980 for (auto &Loc : TransformedPackArgs.arguments()) { 12981 Args.push_back(Loc.getArgument()); 12982 if (Loc.getArgument().isPackExpansion()) 12983 PartialSubstitution = true; 12984 } 12985 12986 if (PartialSubstitution) 12987 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12988 E->getPackLoc(), 12989 E->getRParenLoc(), None, Args); 12990 12991 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12992 E->getPackLoc(), E->getRParenLoc(), 12993 Args.size(), None); 12994 } 12995 12996 template<typename Derived> 12997 ExprResult 12998 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 12999 SubstNonTypeTemplateParmPackExpr *E) { 13000 // Default behavior is to do nothing with this transformation. 13001 return E; 13002 } 13003 13004 template<typename Derived> 13005 ExprResult 13006 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13007 SubstNonTypeTemplateParmExpr *E) { 13008 // Default behavior is to do nothing with this transformation. 13009 return E; 13010 } 13011 13012 template<typename Derived> 13013 ExprResult 13014 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13015 // Default behavior is to do nothing with this transformation. 13016 return E; 13017 } 13018 13019 template<typename Derived> 13020 ExprResult 13021 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13022 MaterializeTemporaryExpr *E) { 13023 return getDerived().TransformExpr(E->getSubExpr()); 13024 } 13025 13026 template<typename Derived> 13027 ExprResult 13028 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13029 Expr *Pattern = E->getPattern(); 13030 13031 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13032 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13033 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13034 13035 // Determine whether the set of unexpanded parameter packs can and should 13036 // be expanded. 13037 bool Expand = true; 13038 bool RetainExpansion = false; 13039 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13040 NumExpansions = OrigNumExpansions; 13041 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13042 Pattern->getSourceRange(), 13043 Unexpanded, 13044 Expand, RetainExpansion, 13045 NumExpansions)) 13046 return true; 13047 13048 if (!Expand) { 13049 // Do not expand any packs here, just transform and rebuild a fold 13050 // expression. 13051 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13052 13053 ExprResult LHS = 13054 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13055 if (LHS.isInvalid()) 13056 return true; 13057 13058 ExprResult RHS = 13059 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13060 if (RHS.isInvalid()) 13061 return true; 13062 13063 if (!getDerived().AlwaysRebuild() && 13064 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13065 return E; 13066 13067 return getDerived().RebuildCXXFoldExpr( 13068 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 13069 RHS.get(), E->getEndLoc(), NumExpansions); 13070 } 13071 13072 // The transform has determined that we should perform an elementwise 13073 // expansion of the pattern. Do so. 13074 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13075 if (Result.isInvalid()) 13076 return true; 13077 bool LeftFold = E->isLeftFold(); 13078 13079 // If we're retaining an expansion for a right fold, it is the innermost 13080 // component and takes the init (if any). 13081 if (!LeftFold && RetainExpansion) { 13082 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13083 13084 ExprResult Out = getDerived().TransformExpr(Pattern); 13085 if (Out.isInvalid()) 13086 return true; 13087 13088 Result = getDerived().RebuildCXXFoldExpr( 13089 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 13090 Result.get(), E->getEndLoc(), OrigNumExpansions); 13091 if (Result.isInvalid()) 13092 return true; 13093 } 13094 13095 for (unsigned I = 0; I != *NumExpansions; ++I) { 13096 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13097 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13098 ExprResult Out = getDerived().TransformExpr(Pattern); 13099 if (Out.isInvalid()) 13100 return true; 13101 13102 if (Out.get()->containsUnexpandedParameterPack()) { 13103 // We still have a pack; retain a pack expansion for this slice. 13104 Result = getDerived().RebuildCXXFoldExpr( 13105 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13106 E->getOperator(), E->getEllipsisLoc(), 13107 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13108 OrigNumExpansions); 13109 } else if (Result.isUsable()) { 13110 // We've got down to a single element; build a binary operator. 13111 Result = getDerived().RebuildBinaryOperator( 13112 E->getEllipsisLoc(), E->getOperator(), 13113 LeftFold ? Result.get() : Out.get(), 13114 LeftFold ? Out.get() : Result.get()); 13115 } else 13116 Result = Out; 13117 13118 if (Result.isInvalid()) 13119 return true; 13120 } 13121 13122 // If we're retaining an expansion for a left fold, it is the outermost 13123 // component and takes the complete expansion so far as its init (if any). 13124 if (LeftFold && RetainExpansion) { 13125 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13126 13127 ExprResult Out = getDerived().TransformExpr(Pattern); 13128 if (Out.isInvalid()) 13129 return true; 13130 13131 Result = getDerived().RebuildCXXFoldExpr( 13132 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 13133 Out.get(), E->getEndLoc(), OrigNumExpansions); 13134 if (Result.isInvalid()) 13135 return true; 13136 } 13137 13138 // If we had no init and an empty pack, and we're not retaining an expansion, 13139 // then produce a fallback value or error. 13140 if (Result.isUnset()) 13141 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13142 E->getOperator()); 13143 13144 return Result; 13145 } 13146 13147 template<typename Derived> 13148 ExprResult 13149 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13150 CXXStdInitializerListExpr *E) { 13151 return getDerived().TransformExpr(E->getSubExpr()); 13152 } 13153 13154 template<typename Derived> 13155 ExprResult 13156 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13157 return SemaRef.MaybeBindToTemporary(E); 13158 } 13159 13160 template<typename Derived> 13161 ExprResult 13162 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13163 return E; 13164 } 13165 13166 template<typename Derived> 13167 ExprResult 13168 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13169 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13170 if (SubExpr.isInvalid()) 13171 return ExprError(); 13172 13173 if (!getDerived().AlwaysRebuild() && 13174 SubExpr.get() == E->getSubExpr()) 13175 return E; 13176 13177 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13178 } 13179 13180 template<typename Derived> 13181 ExprResult 13182 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13183 // Transform each of the elements. 13184 SmallVector<Expr *, 8> Elements; 13185 bool ArgChanged = false; 13186 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13187 /*IsCall=*/false, Elements, &ArgChanged)) 13188 return ExprError(); 13189 13190 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13191 return SemaRef.MaybeBindToTemporary(E); 13192 13193 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13194 Elements.data(), 13195 Elements.size()); 13196 } 13197 13198 template<typename Derived> 13199 ExprResult 13200 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13201 ObjCDictionaryLiteral *E) { 13202 // Transform each of the elements. 13203 SmallVector<ObjCDictionaryElement, 8> Elements; 13204 bool ArgChanged = false; 13205 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13206 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13207 13208 if (OrigElement.isPackExpansion()) { 13209 // This key/value element is a pack expansion. 13210 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13211 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13212 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13213 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13214 13215 // Determine whether the set of unexpanded parameter packs can 13216 // and should be expanded. 13217 bool Expand = true; 13218 bool RetainExpansion = false; 13219 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13220 Optional<unsigned> NumExpansions = OrigNumExpansions; 13221 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13222 OrigElement.Value->getEndLoc()); 13223 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13224 PatternRange, Unexpanded, Expand, 13225 RetainExpansion, NumExpansions)) 13226 return ExprError(); 13227 13228 if (!Expand) { 13229 // The transform has determined that we should perform a simple 13230 // transformation on the pack expansion, producing another pack 13231 // expansion. 13232 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13233 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13234 if (Key.isInvalid()) 13235 return ExprError(); 13236 13237 if (Key.get() != OrigElement.Key) 13238 ArgChanged = true; 13239 13240 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13241 if (Value.isInvalid()) 13242 return ExprError(); 13243 13244 if (Value.get() != OrigElement.Value) 13245 ArgChanged = true; 13246 13247 ObjCDictionaryElement Expansion = { 13248 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13249 }; 13250 Elements.push_back(Expansion); 13251 continue; 13252 } 13253 13254 // Record right away that the argument was changed. This needs 13255 // to happen even if the array expands to nothing. 13256 ArgChanged = true; 13257 13258 // The transform has determined that we should perform an elementwise 13259 // expansion of the pattern. Do so. 13260 for (unsigned I = 0; I != *NumExpansions; ++I) { 13261 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13262 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13263 if (Key.isInvalid()) 13264 return ExprError(); 13265 13266 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13267 if (Value.isInvalid()) 13268 return ExprError(); 13269 13270 ObjCDictionaryElement Element = { 13271 Key.get(), Value.get(), SourceLocation(), NumExpansions 13272 }; 13273 13274 // If any unexpanded parameter packs remain, we still have a 13275 // pack expansion. 13276 // FIXME: Can this really happen? 13277 if (Key.get()->containsUnexpandedParameterPack() || 13278 Value.get()->containsUnexpandedParameterPack()) 13279 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13280 13281 Elements.push_back(Element); 13282 } 13283 13284 // FIXME: Retain a pack expansion if RetainExpansion is true. 13285 13286 // We've finished with this pack expansion. 13287 continue; 13288 } 13289 13290 // Transform and check key. 13291 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13292 if (Key.isInvalid()) 13293 return ExprError(); 13294 13295 if (Key.get() != OrigElement.Key) 13296 ArgChanged = true; 13297 13298 // Transform and check value. 13299 ExprResult Value 13300 = getDerived().TransformExpr(OrigElement.Value); 13301 if (Value.isInvalid()) 13302 return ExprError(); 13303 13304 if (Value.get() != OrigElement.Value) 13305 ArgChanged = true; 13306 13307 ObjCDictionaryElement Element = { 13308 Key.get(), Value.get(), SourceLocation(), None 13309 }; 13310 Elements.push_back(Element); 13311 } 13312 13313 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13314 return SemaRef.MaybeBindToTemporary(E); 13315 13316 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13317 Elements); 13318 } 13319 13320 template<typename Derived> 13321 ExprResult 13322 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13323 TypeSourceInfo *EncodedTypeInfo 13324 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13325 if (!EncodedTypeInfo) 13326 return ExprError(); 13327 13328 if (!getDerived().AlwaysRebuild() && 13329 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13330 return E; 13331 13332 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13333 EncodedTypeInfo, 13334 E->getRParenLoc()); 13335 } 13336 13337 template<typename Derived> 13338 ExprResult TreeTransform<Derived>:: 13339 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13340 // This is a kind of implicit conversion, and it needs to get dropped 13341 // and recomputed for the same general reasons that ImplicitCastExprs 13342 // do, as well a more specific one: this expression is only valid when 13343 // it appears *immediately* as an argument expression. 13344 return getDerived().TransformExpr(E->getSubExpr()); 13345 } 13346 13347 template<typename Derived> 13348 ExprResult TreeTransform<Derived>:: 13349 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13350 TypeSourceInfo *TSInfo 13351 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13352 if (!TSInfo) 13353 return ExprError(); 13354 13355 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13356 if (Result.isInvalid()) 13357 return ExprError(); 13358 13359 if (!getDerived().AlwaysRebuild() && 13360 TSInfo == E->getTypeInfoAsWritten() && 13361 Result.get() == E->getSubExpr()) 13362 return E; 13363 13364 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13365 E->getBridgeKeywordLoc(), TSInfo, 13366 Result.get()); 13367 } 13368 13369 template <typename Derived> 13370 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13371 ObjCAvailabilityCheckExpr *E) { 13372 return E; 13373 } 13374 13375 template<typename Derived> 13376 ExprResult 13377 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13378 // Transform arguments. 13379 bool ArgChanged = false; 13380 SmallVector<Expr*, 8> Args; 13381 Args.reserve(E->getNumArgs()); 13382 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13383 &ArgChanged)) 13384 return ExprError(); 13385 13386 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13387 // Class message: transform the receiver type. 13388 TypeSourceInfo *ReceiverTypeInfo 13389 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13390 if (!ReceiverTypeInfo) 13391 return ExprError(); 13392 13393 // If nothing changed, just retain the existing message send. 13394 if (!getDerived().AlwaysRebuild() && 13395 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13396 return SemaRef.MaybeBindToTemporary(E); 13397 13398 // Build a new class message send. 13399 SmallVector<SourceLocation, 16> SelLocs; 13400 E->getSelectorLocs(SelLocs); 13401 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13402 E->getSelector(), 13403 SelLocs, 13404 E->getMethodDecl(), 13405 E->getLeftLoc(), 13406 Args, 13407 E->getRightLoc()); 13408 } 13409 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13410 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13411 if (!E->getMethodDecl()) 13412 return ExprError(); 13413 13414 // Build a new class message send to 'super'. 13415 SmallVector<SourceLocation, 16> SelLocs; 13416 E->getSelectorLocs(SelLocs); 13417 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13418 E->getSelector(), 13419 SelLocs, 13420 E->getReceiverType(), 13421 E->getMethodDecl(), 13422 E->getLeftLoc(), 13423 Args, 13424 E->getRightLoc()); 13425 } 13426 13427 // Instance message: transform the receiver 13428 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13429 "Only class and instance messages may be instantiated"); 13430 ExprResult Receiver 13431 = getDerived().TransformExpr(E->getInstanceReceiver()); 13432 if (Receiver.isInvalid()) 13433 return ExprError(); 13434 13435 // If nothing changed, just retain the existing message send. 13436 if (!getDerived().AlwaysRebuild() && 13437 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13438 return SemaRef.MaybeBindToTemporary(E); 13439 13440 // Build a new instance message send. 13441 SmallVector<SourceLocation, 16> SelLocs; 13442 E->getSelectorLocs(SelLocs); 13443 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13444 E->getSelector(), 13445 SelLocs, 13446 E->getMethodDecl(), 13447 E->getLeftLoc(), 13448 Args, 13449 E->getRightLoc()); 13450 } 13451 13452 template<typename Derived> 13453 ExprResult 13454 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13455 return E; 13456 } 13457 13458 template<typename Derived> 13459 ExprResult 13460 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13461 return E; 13462 } 13463 13464 template<typename Derived> 13465 ExprResult 13466 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13467 // Transform the base expression. 13468 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13469 if (Base.isInvalid()) 13470 return ExprError(); 13471 13472 // We don't need to transform the ivar; it will never change. 13473 13474 // If nothing changed, just retain the existing expression. 13475 if (!getDerived().AlwaysRebuild() && 13476 Base.get() == E->getBase()) 13477 return E; 13478 13479 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13480 E->getLocation(), 13481 E->isArrow(), E->isFreeIvar()); 13482 } 13483 13484 template<typename Derived> 13485 ExprResult 13486 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13487 // 'super' and types never change. Property never changes. Just 13488 // retain the existing expression. 13489 if (!E->isObjectReceiver()) 13490 return E; 13491 13492 // Transform the base expression. 13493 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13494 if (Base.isInvalid()) 13495 return ExprError(); 13496 13497 // We don't need to transform the property; it will never change. 13498 13499 // If nothing changed, just retain the existing expression. 13500 if (!getDerived().AlwaysRebuild() && 13501 Base.get() == E->getBase()) 13502 return E; 13503 13504 if (E->isExplicitProperty()) 13505 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13506 E->getExplicitProperty(), 13507 E->getLocation()); 13508 13509 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13510 SemaRef.Context.PseudoObjectTy, 13511 E->getImplicitPropertyGetter(), 13512 E->getImplicitPropertySetter(), 13513 E->getLocation()); 13514 } 13515 13516 template<typename Derived> 13517 ExprResult 13518 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13519 // Transform the base expression. 13520 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13521 if (Base.isInvalid()) 13522 return ExprError(); 13523 13524 // Transform the key expression. 13525 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13526 if (Key.isInvalid()) 13527 return ExprError(); 13528 13529 // If nothing changed, just retain the existing expression. 13530 if (!getDerived().AlwaysRebuild() && 13531 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13532 return E; 13533 13534 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13535 Base.get(), Key.get(), 13536 E->getAtIndexMethodDecl(), 13537 E->setAtIndexMethodDecl()); 13538 } 13539 13540 template<typename Derived> 13541 ExprResult 13542 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13543 // Transform the base expression. 13544 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13545 if (Base.isInvalid()) 13546 return ExprError(); 13547 13548 // If nothing changed, just retain the existing expression. 13549 if (!getDerived().AlwaysRebuild() && 13550 Base.get() == E->getBase()) 13551 return E; 13552 13553 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13554 E->getOpLoc(), 13555 E->isArrow()); 13556 } 13557 13558 template<typename Derived> 13559 ExprResult 13560 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13561 bool ArgumentChanged = false; 13562 SmallVector<Expr*, 8> SubExprs; 13563 SubExprs.reserve(E->getNumSubExprs()); 13564 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13565 SubExprs, &ArgumentChanged)) 13566 return ExprError(); 13567 13568 if (!getDerived().AlwaysRebuild() && 13569 !ArgumentChanged) 13570 return E; 13571 13572 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13573 SubExprs, 13574 E->getRParenLoc()); 13575 } 13576 13577 template<typename Derived> 13578 ExprResult 13579 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13580 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13581 if (SrcExpr.isInvalid()) 13582 return ExprError(); 13583 13584 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13585 if (!Type) 13586 return ExprError(); 13587 13588 if (!getDerived().AlwaysRebuild() && 13589 Type == E->getTypeSourceInfo() && 13590 SrcExpr.get() == E->getSrcExpr()) 13591 return E; 13592 13593 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13594 SrcExpr.get(), Type, 13595 E->getRParenLoc()); 13596 } 13597 13598 template<typename Derived> 13599 ExprResult 13600 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13601 BlockDecl *oldBlock = E->getBlockDecl(); 13602 13603 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13604 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13605 13606 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13607 blockScope->TheDecl->setBlockMissingReturnType( 13608 oldBlock->blockMissingReturnType()); 13609 13610 SmallVector<ParmVarDecl*, 4> params; 13611 SmallVector<QualType, 4> paramTypes; 13612 13613 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13614 13615 // Parameter substitution. 13616 Sema::ExtParameterInfoBuilder extParamInfos; 13617 if (getDerived().TransformFunctionTypeParams( 13618 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13619 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13620 extParamInfos)) { 13621 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13622 return ExprError(); 13623 } 13624 13625 QualType exprResultType = 13626 getDerived().TransformType(exprFunctionType->getReturnType()); 13627 13628 auto epi = exprFunctionType->getExtProtoInfo(); 13629 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13630 13631 QualType functionType = 13632 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13633 blockScope->FunctionType = functionType; 13634 13635 // Set the parameters on the block decl. 13636 if (!params.empty()) 13637 blockScope->TheDecl->setParams(params); 13638 13639 if (!oldBlock->blockMissingReturnType()) { 13640 blockScope->HasImplicitReturnType = false; 13641 blockScope->ReturnType = exprResultType; 13642 } 13643 13644 // Transform the body 13645 StmtResult body = getDerived().TransformStmt(E->getBody()); 13646 if (body.isInvalid()) { 13647 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13648 return ExprError(); 13649 } 13650 13651 #ifndef NDEBUG 13652 // In builds with assertions, make sure that we captured everything we 13653 // captured before. 13654 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13655 for (const auto &I : oldBlock->captures()) { 13656 VarDecl *oldCapture = I.getVariable(); 13657 13658 // Ignore parameter packs. 13659 if (oldCapture->isParameterPack()) 13660 continue; 13661 13662 VarDecl *newCapture = 13663 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13664 oldCapture)); 13665 assert(blockScope->CaptureMap.count(newCapture)); 13666 } 13667 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13668 } 13669 #endif 13670 13671 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13672 /*Scope=*/nullptr); 13673 } 13674 13675 template<typename Derived> 13676 ExprResult 13677 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13678 llvm_unreachable("Cannot transform asType expressions yet"); 13679 } 13680 13681 template<typename Derived> 13682 ExprResult 13683 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13684 bool ArgumentChanged = false; 13685 SmallVector<Expr*, 8> SubExprs; 13686 SubExprs.reserve(E->getNumSubExprs()); 13687 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13688 SubExprs, &ArgumentChanged)) 13689 return ExprError(); 13690 13691 if (!getDerived().AlwaysRebuild() && 13692 !ArgumentChanged) 13693 return E; 13694 13695 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13696 E->getOp(), E->getRParenLoc()); 13697 } 13698 13699 //===----------------------------------------------------------------------===// 13700 // Type reconstruction 13701 //===----------------------------------------------------------------------===// 13702 13703 template<typename Derived> 13704 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13705 SourceLocation Star) { 13706 return SemaRef.BuildPointerType(PointeeType, Star, 13707 getDerived().getBaseEntity()); 13708 } 13709 13710 template<typename Derived> 13711 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13712 SourceLocation Star) { 13713 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13714 getDerived().getBaseEntity()); 13715 } 13716 13717 template<typename Derived> 13718 QualType 13719 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13720 bool WrittenAsLValue, 13721 SourceLocation Sigil) { 13722 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13723 Sigil, getDerived().getBaseEntity()); 13724 } 13725 13726 template<typename Derived> 13727 QualType 13728 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13729 QualType ClassType, 13730 SourceLocation Sigil) { 13731 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13732 getDerived().getBaseEntity()); 13733 } 13734 13735 template<typename Derived> 13736 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13737 const ObjCTypeParamDecl *Decl, 13738 SourceLocation ProtocolLAngleLoc, 13739 ArrayRef<ObjCProtocolDecl *> Protocols, 13740 ArrayRef<SourceLocation> ProtocolLocs, 13741 SourceLocation ProtocolRAngleLoc) { 13742 return SemaRef.BuildObjCTypeParamType(Decl, 13743 ProtocolLAngleLoc, Protocols, 13744 ProtocolLocs, ProtocolRAngleLoc, 13745 /*FailOnError=*/true); 13746 } 13747 13748 template<typename Derived> 13749 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13750 QualType BaseType, 13751 SourceLocation Loc, 13752 SourceLocation TypeArgsLAngleLoc, 13753 ArrayRef<TypeSourceInfo *> TypeArgs, 13754 SourceLocation TypeArgsRAngleLoc, 13755 SourceLocation ProtocolLAngleLoc, 13756 ArrayRef<ObjCProtocolDecl *> Protocols, 13757 ArrayRef<SourceLocation> ProtocolLocs, 13758 SourceLocation ProtocolRAngleLoc) { 13759 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13760 TypeArgs, TypeArgsRAngleLoc, 13761 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13762 ProtocolRAngleLoc, 13763 /*FailOnError=*/true); 13764 } 13765 13766 template<typename Derived> 13767 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13768 QualType PointeeType, 13769 SourceLocation Star) { 13770 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13771 } 13772 13773 template<typename Derived> 13774 QualType 13775 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13776 ArrayType::ArraySizeModifier SizeMod, 13777 const llvm::APInt *Size, 13778 Expr *SizeExpr, 13779 unsigned IndexTypeQuals, 13780 SourceRange BracketsRange) { 13781 if (SizeExpr || !Size) 13782 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13783 IndexTypeQuals, BracketsRange, 13784 getDerived().getBaseEntity()); 13785 13786 QualType Types[] = { 13787 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13788 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13789 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13790 }; 13791 const unsigned NumTypes = llvm::array_lengthof(Types); 13792 QualType SizeType; 13793 for (unsigned I = 0; I != NumTypes; ++I) 13794 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13795 SizeType = Types[I]; 13796 break; 13797 } 13798 13799 // Note that we can return a VariableArrayType here in the case where 13800 // the element type was a dependent VariableArrayType. 13801 IntegerLiteral *ArraySize 13802 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13803 /*FIXME*/BracketsRange.getBegin()); 13804 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13805 IndexTypeQuals, BracketsRange, 13806 getDerived().getBaseEntity()); 13807 } 13808 13809 template<typename Derived> 13810 QualType 13811 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13812 ArrayType::ArraySizeModifier SizeMod, 13813 const llvm::APInt &Size, 13814 Expr *SizeExpr, 13815 unsigned IndexTypeQuals, 13816 SourceRange BracketsRange) { 13817 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13818 IndexTypeQuals, BracketsRange); 13819 } 13820 13821 template<typename Derived> 13822 QualType 13823 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13824 ArrayType::ArraySizeModifier SizeMod, 13825 unsigned IndexTypeQuals, 13826 SourceRange BracketsRange) { 13827 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13828 IndexTypeQuals, BracketsRange); 13829 } 13830 13831 template<typename Derived> 13832 QualType 13833 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13834 ArrayType::ArraySizeModifier SizeMod, 13835 Expr *SizeExpr, 13836 unsigned IndexTypeQuals, 13837 SourceRange BracketsRange) { 13838 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13839 SizeExpr, 13840 IndexTypeQuals, BracketsRange); 13841 } 13842 13843 template<typename Derived> 13844 QualType 13845 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13846 ArrayType::ArraySizeModifier SizeMod, 13847 Expr *SizeExpr, 13848 unsigned IndexTypeQuals, 13849 SourceRange BracketsRange) { 13850 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13851 SizeExpr, 13852 IndexTypeQuals, BracketsRange); 13853 } 13854 13855 template <typename Derived> 13856 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13857 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13858 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13859 AttributeLoc); 13860 } 13861 13862 template <typename Derived> 13863 QualType 13864 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13865 unsigned NumElements, 13866 VectorType::VectorKind VecKind) { 13867 // FIXME: semantic checking! 13868 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13869 } 13870 13871 template <typename Derived> 13872 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13873 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13874 VectorType::VectorKind VecKind) { 13875 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13876 } 13877 13878 template<typename Derived> 13879 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13880 unsigned NumElements, 13881 SourceLocation AttributeLoc) { 13882 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13883 NumElements, true); 13884 IntegerLiteral *VectorSize 13885 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13886 AttributeLoc); 13887 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13888 } 13889 13890 template<typename Derived> 13891 QualType 13892 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13893 Expr *SizeExpr, 13894 SourceLocation AttributeLoc) { 13895 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13896 } 13897 13898 template <typename Derived> 13899 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 13900 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 13901 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 13902 NumColumns); 13903 } 13904 13905 template <typename Derived> 13906 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 13907 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 13908 SourceLocation AttributeLoc) { 13909 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 13910 AttributeLoc); 13911 } 13912 13913 template<typename Derived> 13914 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13915 QualType T, 13916 MutableArrayRef<QualType> ParamTypes, 13917 const FunctionProtoType::ExtProtoInfo &EPI) { 13918 return SemaRef.BuildFunctionType(T, ParamTypes, 13919 getDerived().getBaseLocation(), 13920 getDerived().getBaseEntity(), 13921 EPI); 13922 } 13923 13924 template<typename Derived> 13925 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13926 return SemaRef.Context.getFunctionNoProtoType(T); 13927 } 13928 13929 template<typename Derived> 13930 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13931 Decl *D) { 13932 assert(D && "no decl found"); 13933 if (D->isInvalidDecl()) return QualType(); 13934 13935 // FIXME: Doesn't account for ObjCInterfaceDecl! 13936 TypeDecl *Ty; 13937 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 13938 // A valid resolved using typename pack expansion decl can have multiple 13939 // UsingDecls, but they must each have exactly one type, and it must be 13940 // the same type in every case. But we must have at least one expansion! 13941 if (UPD->expansions().empty()) { 13942 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 13943 << UPD->isCXXClassMember() << UPD; 13944 return QualType(); 13945 } 13946 13947 // We might still have some unresolved types. Try to pick a resolved type 13948 // if we can. The final instantiation will check that the remaining 13949 // unresolved types instantiate to the type we pick. 13950 QualType FallbackT; 13951 QualType T; 13952 for (auto *E : UPD->expansions()) { 13953 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 13954 if (ThisT.isNull()) 13955 continue; 13956 else if (ThisT->getAs<UnresolvedUsingType>()) 13957 FallbackT = ThisT; 13958 else if (T.isNull()) 13959 T = ThisT; 13960 else 13961 assert(getSema().Context.hasSameType(ThisT, T) && 13962 "mismatched resolved types in using pack expansion"); 13963 } 13964 return T.isNull() ? FallbackT : T; 13965 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 13966 assert(Using->hasTypename() && 13967 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 13968 13969 // A valid resolved using typename decl points to exactly one type decl. 13970 assert(++Using->shadow_begin() == Using->shadow_end()); 13971 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 13972 } else { 13973 assert(isa<UnresolvedUsingTypenameDecl>(D) && 13974 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 13975 Ty = cast<UnresolvedUsingTypenameDecl>(D); 13976 } 13977 13978 return SemaRef.Context.getTypeDeclType(Ty); 13979 } 13980 13981 template<typename Derived> 13982 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 13983 SourceLocation Loc) { 13984 return SemaRef.BuildTypeofExprType(E, Loc); 13985 } 13986 13987 template<typename Derived> 13988 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 13989 return SemaRef.Context.getTypeOfType(Underlying); 13990 } 13991 13992 template<typename Derived> 13993 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 13994 SourceLocation Loc) { 13995 return SemaRef.BuildDecltypeType(E, Loc); 13996 } 13997 13998 template<typename Derived> 13999 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14000 UnaryTransformType::UTTKind UKind, 14001 SourceLocation Loc) { 14002 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14003 } 14004 14005 template<typename Derived> 14006 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14007 TemplateName Template, 14008 SourceLocation TemplateNameLoc, 14009 TemplateArgumentListInfo &TemplateArgs) { 14010 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14011 } 14012 14013 template<typename Derived> 14014 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14015 SourceLocation KWLoc) { 14016 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14017 } 14018 14019 template<typename Derived> 14020 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14021 SourceLocation KWLoc, 14022 bool isReadPipe) { 14023 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14024 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14025 } 14026 14027 template <typename Derived> 14028 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14029 unsigned NumBits, 14030 SourceLocation Loc) { 14031 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14032 NumBits, true); 14033 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14034 SemaRef.Context.IntTy, Loc); 14035 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14036 } 14037 14038 template <typename Derived> 14039 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14040 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14041 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14042 } 14043 14044 template<typename Derived> 14045 TemplateName 14046 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14047 bool TemplateKW, 14048 TemplateDecl *Template) { 14049 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14050 Template); 14051 } 14052 14053 template<typename Derived> 14054 TemplateName 14055 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14056 SourceLocation TemplateKWLoc, 14057 const IdentifierInfo &Name, 14058 SourceLocation NameLoc, 14059 QualType ObjectType, 14060 NamedDecl *FirstQualifierInScope, 14061 bool AllowInjectedClassName) { 14062 UnqualifiedId TemplateName; 14063 TemplateName.setIdentifier(&Name, NameLoc); 14064 Sema::TemplateTy Template; 14065 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14066 TemplateName, ParsedType::make(ObjectType), 14067 /*EnteringContext=*/false, Template, 14068 AllowInjectedClassName); 14069 return Template.get(); 14070 } 14071 14072 template<typename Derived> 14073 TemplateName 14074 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14075 SourceLocation TemplateKWLoc, 14076 OverloadedOperatorKind Operator, 14077 SourceLocation NameLoc, 14078 QualType ObjectType, 14079 bool AllowInjectedClassName) { 14080 UnqualifiedId Name; 14081 // FIXME: Bogus location information. 14082 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14083 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14084 Sema::TemplateTy Template; 14085 getSema().ActOnTemplateName( 14086 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14087 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14088 return Template.get(); 14089 } 14090 14091 template<typename Derived> 14092 ExprResult 14093 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14094 SourceLocation OpLoc, 14095 Expr *OrigCallee, 14096 Expr *First, 14097 Expr *Second) { 14098 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14099 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14100 14101 if (First->getObjectKind() == OK_ObjCProperty) { 14102 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14103 if (BinaryOperator::isAssignmentOp(Opc)) 14104 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14105 First, Second); 14106 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14107 if (Result.isInvalid()) 14108 return ExprError(); 14109 First = Result.get(); 14110 } 14111 14112 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14113 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14114 if (Result.isInvalid()) 14115 return ExprError(); 14116 Second = Result.get(); 14117 } 14118 14119 // Determine whether this should be a builtin operation. 14120 if (Op == OO_Subscript) { 14121 if (!First->getType()->isOverloadableType() && 14122 !Second->getType()->isOverloadableType()) 14123 return getSema().CreateBuiltinArraySubscriptExpr( 14124 First, Callee->getBeginLoc(), Second, OpLoc); 14125 } else if (Op == OO_Arrow) { 14126 // -> is never a builtin operation. 14127 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14128 } else if (Second == nullptr || isPostIncDec) { 14129 if (!First->getType()->isOverloadableType() || 14130 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14131 // The argument is not of overloadable type, or this is an expression 14132 // of the form &Class::member, so try to create a built-in unary 14133 // operation. 14134 UnaryOperatorKind Opc 14135 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14136 14137 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14138 } 14139 } else { 14140 if (!First->getType()->isOverloadableType() && 14141 !Second->getType()->isOverloadableType()) { 14142 // Neither of the arguments is an overloadable type, so try to 14143 // create a built-in binary operation. 14144 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14145 ExprResult Result 14146 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14147 if (Result.isInvalid()) 14148 return ExprError(); 14149 14150 return Result; 14151 } 14152 } 14153 14154 // Compute the transformed set of functions (and function templates) to be 14155 // used during overload resolution. 14156 UnresolvedSet<16> Functions; 14157 bool RequiresADL; 14158 14159 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14160 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14161 // If the overload could not be resolved in the template definition 14162 // (because we had a dependent argument), ADL is performed as part of 14163 // template instantiation. 14164 RequiresADL = ULE->requiresADL(); 14165 } else { 14166 // If we've resolved this to a particular non-member function, just call 14167 // that function. If we resolved it to a member function, 14168 // CreateOverloaded* will find that function for us. 14169 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14170 if (!isa<CXXMethodDecl>(ND)) 14171 Functions.addDecl(ND); 14172 RequiresADL = false; 14173 } 14174 14175 // Add any functions found via argument-dependent lookup. 14176 Expr *Args[2] = { First, Second }; 14177 unsigned NumArgs = 1 + (Second != nullptr); 14178 14179 // Create the overloaded operator invocation for unary operators. 14180 if (NumArgs == 1 || isPostIncDec) { 14181 UnaryOperatorKind Opc 14182 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14183 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14184 RequiresADL); 14185 } 14186 14187 if (Op == OO_Subscript) { 14188 SourceLocation LBrace; 14189 SourceLocation RBrace; 14190 14191 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14192 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14193 LBrace = SourceLocation::getFromRawEncoding( 14194 NameLoc.CXXOperatorName.BeginOpNameLoc); 14195 RBrace = SourceLocation::getFromRawEncoding( 14196 NameLoc.CXXOperatorName.EndOpNameLoc); 14197 } else { 14198 LBrace = Callee->getBeginLoc(); 14199 RBrace = OpLoc; 14200 } 14201 14202 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14203 First, Second); 14204 } 14205 14206 // Create the overloaded operator invocation for binary operators. 14207 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14208 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14209 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14210 if (Result.isInvalid()) 14211 return ExprError(); 14212 14213 return Result; 14214 } 14215 14216 template<typename Derived> 14217 ExprResult 14218 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14219 SourceLocation OperatorLoc, 14220 bool isArrow, 14221 CXXScopeSpec &SS, 14222 TypeSourceInfo *ScopeType, 14223 SourceLocation CCLoc, 14224 SourceLocation TildeLoc, 14225 PseudoDestructorTypeStorage Destroyed) { 14226 QualType BaseType = Base->getType(); 14227 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14228 (!isArrow && !BaseType->getAs<RecordType>()) || 14229 (isArrow && BaseType->getAs<PointerType>() && 14230 !BaseType->castAs<PointerType>()->getPointeeType() 14231 ->template getAs<RecordType>())){ 14232 // This pseudo-destructor expression is still a pseudo-destructor. 14233 return SemaRef.BuildPseudoDestructorExpr( 14234 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14235 CCLoc, TildeLoc, Destroyed); 14236 } 14237 14238 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14239 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14240 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14241 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14242 NameInfo.setNamedTypeInfo(DestroyedType); 14243 14244 // The scope type is now known to be a valid nested name specifier 14245 // component. Tack it on to the end of the nested name specifier. 14246 if (ScopeType) { 14247 if (!ScopeType->getType()->getAs<TagType>()) { 14248 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14249 diag::err_expected_class_or_namespace) 14250 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14251 return ExprError(); 14252 } 14253 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14254 CCLoc); 14255 } 14256 14257 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14258 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14259 OperatorLoc, isArrow, 14260 SS, TemplateKWLoc, 14261 /*FIXME: FirstQualifier*/ nullptr, 14262 NameInfo, 14263 /*TemplateArgs*/ nullptr, 14264 /*S*/nullptr); 14265 } 14266 14267 template<typename Derived> 14268 StmtResult 14269 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14270 SourceLocation Loc = S->getBeginLoc(); 14271 CapturedDecl *CD = S->getCapturedDecl(); 14272 unsigned NumParams = CD->getNumParams(); 14273 unsigned ContextParamPos = CD->getContextParamPosition(); 14274 SmallVector<Sema::CapturedParamNameType, 4> Params; 14275 for (unsigned I = 0; I < NumParams; ++I) { 14276 if (I != ContextParamPos) { 14277 Params.push_back( 14278 std::make_pair( 14279 CD->getParam(I)->getName(), 14280 getDerived().TransformType(CD->getParam(I)->getType()))); 14281 } else { 14282 Params.push_back(std::make_pair(StringRef(), QualType())); 14283 } 14284 } 14285 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14286 S->getCapturedRegionKind(), Params); 14287 StmtResult Body; 14288 { 14289 Sema::CompoundScopeRAII CompoundScope(getSema()); 14290 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14291 } 14292 14293 if (Body.isInvalid()) { 14294 getSema().ActOnCapturedRegionError(); 14295 return StmtError(); 14296 } 14297 14298 return getSema().ActOnCapturedRegionEnd(Body.get()); 14299 } 14300 14301 } // end namespace clang 14302 14303 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14304