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/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 #include <optional> 44 45 using namespace llvm::omp; 46 47 namespace clang { 48 using namespace sema; 49 50 /// A semantic tree transformation that allows one to transform one 51 /// abstract syntax tree into another. 52 /// 53 /// A new tree transformation is defined by creating a new subclass \c X of 54 /// \c TreeTransform<X> and then overriding certain operations to provide 55 /// behavior specific to that transformation. For example, template 56 /// instantiation is implemented as a tree transformation where the 57 /// transformation of TemplateTypeParmType nodes involves substituting the 58 /// template arguments for their corresponding template parameters; a similar 59 /// transformation is performed for non-type template parameters and 60 /// template template parameters. 61 /// 62 /// This tree-transformation template uses static polymorphism to allow 63 /// subclasses to customize any of its operations. Thus, a subclass can 64 /// override any of the transformation or rebuild operators by providing an 65 /// operation with the same signature as the default implementation. The 66 /// overriding function should not be virtual. 67 /// 68 /// Semantic tree transformations are split into two stages, either of which 69 /// can be replaced by a subclass. The "transform" step transforms an AST node 70 /// or the parts of an AST node using the various transformation functions, 71 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 72 /// node of the appropriate kind from the pieces. The default transformation 73 /// routines recursively transform the operands to composite AST nodes (e.g., 74 /// the pointee type of a PointerType node) and, if any of those operand nodes 75 /// were changed by the transformation, invokes the rebuild operation to create 76 /// a new AST node. 77 /// 78 /// Subclasses can customize the transformation at various levels. The 79 /// most coarse-grained transformations involve replacing TransformType(), 80 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 81 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 82 /// new implementations. 83 /// 84 /// For more fine-grained transformations, subclasses can replace any of the 85 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 86 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 87 /// replacing TransformTemplateTypeParmType() allows template instantiation 88 /// to substitute template arguments for their corresponding template 89 /// parameters. Additionally, subclasses can override the \c RebuildXXX 90 /// functions to control how AST nodes are rebuilt when their operands change. 91 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 92 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 93 /// be able to use more efficient rebuild steps. 94 /// 95 /// There are a handful of other functions that can be overridden, allowing one 96 /// to avoid traversing nodes that don't need any transformation 97 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 98 /// operands have not changed (\c AlwaysRebuild()), and customize the 99 /// default locations and entity names used for type-checking 100 /// (\c getBaseLocation(), \c getBaseEntity()). 101 template<typename Derived> 102 class TreeTransform { 103 /// Private RAII object that helps us forget and then re-remember 104 /// the template argument corresponding to a partially-substituted parameter 105 /// pack. 106 class ForgetPartiallySubstitutedPackRAII { 107 Derived &Self; 108 TemplateArgument Old; 109 110 public: 111 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 112 Old = Self.ForgetPartiallySubstitutedPack(); 113 } 114 115 ~ForgetPartiallySubstitutedPackRAII() { 116 Self.RememberPartiallySubstitutedPack(Old); 117 } 118 }; 119 120 protected: 121 Sema &SemaRef; 122 123 /// The set of local declarations that have been transformed, for 124 /// cases where we are forced to build new declarations within the transformer 125 /// rather than in the subclass (e.g., lambda closure types). 126 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 127 128 public: 129 /// Initializes a new tree transformer. 130 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 131 132 /// Retrieves a reference to the derived class. 133 Derived &getDerived() { return static_cast<Derived&>(*this); } 134 135 /// Retrieves a reference to the derived class. 136 const Derived &getDerived() const { 137 return static_cast<const Derived&>(*this); 138 } 139 140 static inline ExprResult Owned(Expr *E) { return E; } 141 static inline StmtResult Owned(Stmt *S) { return S; } 142 143 /// Retrieves a reference to the semantic analysis object used for 144 /// this tree transform. 145 Sema &getSema() const { return SemaRef; } 146 147 /// Whether the transformation should always rebuild AST nodes, even 148 /// if none of the children have changed. 149 /// 150 /// Subclasses may override this function to specify when the transformation 151 /// should rebuild all AST nodes. 152 /// 153 /// We must always rebuild all AST nodes when performing variadic template 154 /// pack expansion, in order to avoid violating the AST invariant that each 155 /// statement node appears at most once in its containing declaration. 156 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 157 158 /// Whether the transformation is forming an expression or statement that 159 /// replaces the original. In this case, we'll reuse mangling numbers from 160 /// existing lambdas. 161 bool ReplacingOriginal() { return false; } 162 163 /// Wether CXXConstructExpr can be skipped when they are implicit. 164 /// They will be reconstructed when used if needed. 165 /// This is useful when the user that cause rebuilding of the 166 /// CXXConstructExpr is outside of the expression at which the TreeTransform 167 /// started. 168 bool AllowSkippingCXXConstructExpr() { return true; } 169 170 /// Returns the location of the entity being transformed, if that 171 /// information was not available elsewhere in the AST. 172 /// 173 /// By default, returns no source-location information. Subclasses can 174 /// provide an alternative implementation that provides better location 175 /// information. 176 SourceLocation getBaseLocation() { return SourceLocation(); } 177 178 /// Returns the name of the entity being transformed, if that 179 /// information was not available elsewhere in the AST. 180 /// 181 /// By default, returns an empty name. Subclasses can provide an alternative 182 /// implementation with a more precise name. 183 DeclarationName getBaseEntity() { return DeclarationName(); } 184 185 /// Sets the "base" location and entity when that 186 /// information is known based on another transformation. 187 /// 188 /// By default, the source location and entity are ignored. Subclasses can 189 /// override this function to provide a customized implementation. 190 void setBase(SourceLocation Loc, DeclarationName Entity) { } 191 192 /// RAII object that temporarily sets the base location and entity 193 /// used for reporting diagnostics in types. 194 class TemporaryBase { 195 TreeTransform &Self; 196 SourceLocation OldLocation; 197 DeclarationName OldEntity; 198 199 public: 200 TemporaryBase(TreeTransform &Self, SourceLocation Location, 201 DeclarationName Entity) : Self(Self) { 202 OldLocation = Self.getDerived().getBaseLocation(); 203 OldEntity = Self.getDerived().getBaseEntity(); 204 205 if (Location.isValid()) 206 Self.getDerived().setBase(Location, Entity); 207 } 208 209 ~TemporaryBase() { 210 Self.getDerived().setBase(OldLocation, OldEntity); 211 } 212 }; 213 214 /// Determine whether the given type \p T has already been 215 /// transformed. 216 /// 217 /// Subclasses can provide an alternative implementation of this routine 218 /// to short-circuit evaluation when it is known that a given type will 219 /// not change. For example, template instantiation need not traverse 220 /// non-dependent types. 221 bool AlreadyTransformed(QualType T) { 222 return T.isNull(); 223 } 224 225 /// Transform a template parameter depth level. 226 /// 227 /// During a transformation that transforms template parameters, this maps 228 /// an old template parameter depth to a new depth. 229 unsigned TransformTemplateDepth(unsigned Depth) { 230 return Depth; 231 } 232 233 /// Determine whether the given call argument should be dropped, e.g., 234 /// because it is a default argument. 235 /// 236 /// Subclasses can provide an alternative implementation of this routine to 237 /// determine which kinds of call arguments get dropped. By default, 238 /// CXXDefaultArgument nodes are dropped (prior to transformation). 239 bool DropCallArgument(Expr *E) { 240 return E->isDefaultArgument(); 241 } 242 243 /// Determine whether we should expand a pack expansion with the 244 /// given set of parameter packs into separate arguments by repeatedly 245 /// transforming the pattern. 246 /// 247 /// By default, the transformer never tries to expand pack expansions. 248 /// Subclasses can override this routine to provide different behavior. 249 /// 250 /// \param EllipsisLoc The location of the ellipsis that identifies the 251 /// pack expansion. 252 /// 253 /// \param PatternRange The source range that covers the entire pattern of 254 /// the pack expansion. 255 /// 256 /// \param Unexpanded The set of unexpanded parameter packs within the 257 /// pattern. 258 /// 259 /// \param ShouldExpand Will be set to \c true if the transformer should 260 /// expand the corresponding pack expansions into separate arguments. When 261 /// set, \c NumExpansions must also be set. 262 /// 263 /// \param RetainExpansion Whether the caller should add an unexpanded 264 /// pack expansion after all of the expanded arguments. This is used 265 /// when extending explicitly-specified template argument packs per 266 /// C++0x [temp.arg.explicit]p9. 267 /// 268 /// \param NumExpansions The number of separate arguments that will be in 269 /// the expanded form of the corresponding pack expansion. This is both an 270 /// input and an output parameter, which can be set by the caller if the 271 /// number of expansions is known a priori (e.g., due to a prior substitution) 272 /// and will be set by the callee when the number of expansions is known. 273 /// The callee must set this value when \c ShouldExpand is \c true; it may 274 /// set this value in other cases. 275 /// 276 /// \returns true if an error occurred (e.g., because the parameter packs 277 /// are to be instantiated with arguments of different lengths), false 278 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 279 /// must be set. 280 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 281 SourceRange PatternRange, 282 ArrayRef<UnexpandedParameterPack> Unexpanded, 283 bool &ShouldExpand, bool &RetainExpansion, 284 std::optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Subclasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB, 640 TemplateTypeParmTypeLoc TL, 641 bool SuppressObjCLifetime); 642 QualType 643 TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB, 644 SubstTemplateTypeParmPackTypeLoc TL, 645 bool SuppressObjCLifetime); 646 647 template<typename Fn> 648 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 649 FunctionProtoTypeLoc TL, 650 CXXRecordDecl *ThisContext, 651 Qualifiers ThisTypeQuals, 652 Fn TransformExceptionSpec); 653 654 bool TransformExceptionSpec(SourceLocation Loc, 655 FunctionProtoType::ExceptionSpecInfo &ESI, 656 SmallVectorImpl<QualType> &Exceptions, 657 bool &Changed); 658 659 StmtResult TransformSEHHandler(Stmt *Handler); 660 661 QualType 662 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 663 TemplateSpecializationTypeLoc TL, 664 TemplateName Template); 665 666 QualType 667 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 668 DependentTemplateSpecializationTypeLoc TL, 669 TemplateName Template, 670 CXXScopeSpec &SS); 671 672 QualType TransformDependentTemplateSpecializationType( 673 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 674 NestedNameSpecifierLoc QualifierLoc); 675 676 /// Transforms the parameters of a function type into the 677 /// given vectors. 678 /// 679 /// The result vectors should be kept in sync; null entries in the 680 /// variables vector are acceptable. 681 /// 682 /// LastParamTransformed, if non-null, will be set to the index of the last 683 /// parameter on which transfromation was started. In the event of an error, 684 /// this will contain the parameter which failed to instantiate. 685 /// 686 /// Return true on error. 687 bool TransformFunctionTypeParams( 688 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 689 const QualType *ParamTypes, 690 const FunctionProtoType::ExtParameterInfo *ParamInfos, 691 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 692 Sema::ExtParameterInfoBuilder &PInfos, unsigned *LastParamTransformed); 693 694 bool TransformFunctionTypeParams( 695 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 696 const QualType *ParamTypes, 697 const FunctionProtoType::ExtParameterInfo *ParamInfos, 698 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 699 Sema::ExtParameterInfoBuilder &PInfos) { 700 return getDerived().TransformFunctionTypeParams( 701 Loc, Params, ParamTypes, ParamInfos, PTypes, PVars, PInfos, nullptr); 702 } 703 704 /// Transforms the parameters of a requires expresison into the given vectors. 705 /// 706 /// The result vectors should be kept in sync; null entries in the 707 /// variables vector are acceptable. 708 /// 709 /// Returns an unset ExprResult on success. Returns an ExprResult the 'not 710 /// satisfied' RequiresExpr if subsitution failed, OR an ExprError, both of 711 /// which are cases where transformation shouldn't continue. 712 ExprResult TransformRequiresTypeParams( 713 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE, 714 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params, 715 SmallVectorImpl<QualType> &PTypes, 716 SmallVectorImpl<ParmVarDecl *> &TransParams, 717 Sema::ExtParameterInfoBuilder &PInfos) { 718 if (getDerived().TransformFunctionTypeParams( 719 KWLoc, Params, /*ParamTypes=*/nullptr, 720 /*ParamInfos=*/nullptr, PTypes, &TransParams, PInfos)) 721 return ExprError(); 722 723 return ExprResult{}; 724 } 725 726 /// Transforms a single function-type parameter. Return null 727 /// on error. 728 /// 729 /// \param indexAdjustment - A number to add to the parameter's 730 /// scope index; can be negative 731 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 732 int indexAdjustment, 733 std::optional<unsigned> NumExpansions, 734 bool ExpectParameterPack); 735 736 /// Transform the body of a lambda-expression. 737 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 738 /// Alternative implementation of TransformLambdaBody that skips transforming 739 /// the body. 740 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 741 742 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 743 744 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 745 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 746 747 TemplateParameterList *TransformTemplateParameterList( 748 TemplateParameterList *TPL) { 749 return TPL; 750 } 751 752 ExprResult TransformAddressOfOperand(Expr *E); 753 754 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 755 bool IsAddressOfOperand, 756 TypeSourceInfo **RecoveryTSI); 757 758 ExprResult TransformParenDependentScopeDeclRefExpr( 759 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 760 TypeSourceInfo **RecoveryTSI); 761 762 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 763 764 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 765 // amount of stack usage with clang. 766 #define STMT(Node, Parent) \ 767 LLVM_ATTRIBUTE_NOINLINE \ 768 StmtResult Transform##Node(Node *S); 769 #define VALUESTMT(Node, Parent) \ 770 LLVM_ATTRIBUTE_NOINLINE \ 771 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 772 #define EXPR(Node, Parent) \ 773 LLVM_ATTRIBUTE_NOINLINE \ 774 ExprResult Transform##Node(Node *E); 775 #define ABSTRACT_STMT(Stmt) 776 #include "clang/AST/StmtNodes.inc" 777 778 #define GEN_CLANG_CLAUSE_CLASS 779 #define CLAUSE_CLASS(Enum, Str, Class) \ 780 LLVM_ATTRIBUTE_NOINLINE \ 781 OMPClause *Transform##Class(Class *S); 782 #include "llvm/Frontend/OpenMP/OMP.inc" 783 784 /// Build a new qualified type given its unqualified type and type location. 785 /// 786 /// By default, this routine adds type qualifiers only to types that can 787 /// have qualifiers, and silently suppresses those qualifiers that are not 788 /// permitted. Subclasses may override this routine to provide different 789 /// behavior. 790 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 791 792 /// Build a new pointer type given its pointee type. 793 /// 794 /// By default, performs semantic analysis when building the pointer type. 795 /// Subclasses may override this routine to provide different behavior. 796 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 797 798 /// Build a new block pointer type given its pointee type. 799 /// 800 /// By default, performs semantic analysis when building the block pointer 801 /// type. Subclasses may override this routine to provide different behavior. 802 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 803 804 /// Build a new reference type given the type it references. 805 /// 806 /// By default, performs semantic analysis when building the 807 /// reference type. Subclasses may override this routine to provide 808 /// different behavior. 809 /// 810 /// \param LValue whether the type was written with an lvalue sigil 811 /// or an rvalue sigil. 812 QualType RebuildReferenceType(QualType ReferentType, 813 bool LValue, 814 SourceLocation Sigil); 815 816 /// Build a new member pointer type given the pointee type and the 817 /// class type it refers into. 818 /// 819 /// By default, performs semantic analysis when building the member pointer 820 /// type. Subclasses may override this routine to provide different behavior. 821 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 822 SourceLocation Sigil); 823 824 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 825 SourceLocation ProtocolLAngleLoc, 826 ArrayRef<ObjCProtocolDecl *> Protocols, 827 ArrayRef<SourceLocation> ProtocolLocs, 828 SourceLocation ProtocolRAngleLoc); 829 830 /// Build an Objective-C object type. 831 /// 832 /// By default, performs semantic analysis when building the object type. 833 /// Subclasses may override this routine to provide different behavior. 834 QualType RebuildObjCObjectType(QualType BaseType, 835 SourceLocation Loc, 836 SourceLocation TypeArgsLAngleLoc, 837 ArrayRef<TypeSourceInfo *> TypeArgs, 838 SourceLocation TypeArgsRAngleLoc, 839 SourceLocation ProtocolLAngleLoc, 840 ArrayRef<ObjCProtocolDecl *> Protocols, 841 ArrayRef<SourceLocation> ProtocolLocs, 842 SourceLocation ProtocolRAngleLoc); 843 844 /// Build a new Objective-C object pointer type given the pointee type. 845 /// 846 /// By default, directly builds the pointer type, with no additional semantic 847 /// analysis. 848 QualType RebuildObjCObjectPointerType(QualType PointeeType, 849 SourceLocation Star); 850 851 /// Build a new array type given the element type, size 852 /// modifier, size of the array (if known), size expression, and index type 853 /// qualifiers. 854 /// 855 /// By default, performs semantic analysis when building the array type. 856 /// Subclasses may override this routine to provide different behavior. 857 /// Also by default, all of the other Rebuild*Array 858 QualType RebuildArrayType(QualType ElementType, 859 ArrayType::ArraySizeModifier SizeMod, 860 const llvm::APInt *Size, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new constant array type given the element type, size 866 /// modifier, (known) size of the array, and index type qualifiers. 867 /// 868 /// By default, performs semantic analysis when building the array type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildConstantArrayType(QualType ElementType, 871 ArrayType::ArraySizeModifier SizeMod, 872 const llvm::APInt &Size, 873 Expr *SizeExpr, 874 unsigned IndexTypeQuals, 875 SourceRange BracketsRange); 876 877 /// Build a new incomplete array type given the element type, size 878 /// modifier, and index type qualifiers. 879 /// 880 /// By default, performs semantic analysis when building the array type. 881 /// Subclasses may override this routine to provide different behavior. 882 QualType RebuildIncompleteArrayType(QualType ElementType, 883 ArrayType::ArraySizeModifier SizeMod, 884 unsigned IndexTypeQuals, 885 SourceRange BracketsRange); 886 887 /// Build a new variable-length array type given the element type, 888 /// size modifier, size expression, and index type qualifiers. 889 /// 890 /// By default, performs semantic analysis when building the array type. 891 /// Subclasses may override this routine to provide different behavior. 892 QualType RebuildVariableArrayType(QualType ElementType, 893 ArrayType::ArraySizeModifier SizeMod, 894 Expr *SizeExpr, 895 unsigned IndexTypeQuals, 896 SourceRange BracketsRange); 897 898 /// Build a new dependent-sized array type given the element type, 899 /// size modifier, size expression, and index type qualifiers. 900 /// 901 /// By default, performs semantic analysis when building the array type. 902 /// Subclasses may override this routine to provide different behavior. 903 QualType RebuildDependentSizedArrayType(QualType ElementType, 904 ArrayType::ArraySizeModifier SizeMod, 905 Expr *SizeExpr, 906 unsigned IndexTypeQuals, 907 SourceRange BracketsRange); 908 909 /// Build a new vector type given the element type and 910 /// number of elements. 911 /// 912 /// By default, performs semantic analysis when building the vector type. 913 /// Subclasses may override this routine to provide different behavior. 914 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 915 VectorType::VectorKind VecKind); 916 917 /// Build a new potentially dependently-sized extended vector type 918 /// given the element type and number of elements. 919 /// 920 /// By default, performs semantic analysis when building the vector type. 921 /// Subclasses may override this routine to provide different behavior. 922 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 923 SourceLocation AttributeLoc, 924 VectorType::VectorKind); 925 926 /// Build a new extended vector type given the element type and 927 /// number of elements. 928 /// 929 /// By default, performs semantic analysis when building the vector type. 930 /// Subclasses may override this routine to provide different behavior. 931 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 932 SourceLocation AttributeLoc); 933 934 /// Build a new potentially dependently-sized extended vector type 935 /// given the element type and number of elements. 936 /// 937 /// By default, performs semantic analysis when building the vector type. 938 /// Subclasses may override this routine to provide different behavior. 939 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 940 Expr *SizeExpr, 941 SourceLocation AttributeLoc); 942 943 /// Build a new matrix type given the element type and dimensions. 944 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 945 unsigned NumColumns); 946 947 /// Build a new matrix type given the type and dependently-defined 948 /// dimensions. 949 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 950 Expr *ColumnExpr, 951 SourceLocation AttributeLoc); 952 953 /// Build a new DependentAddressSpaceType or return the pointee 954 /// type variable with the correct address space (retrieved from 955 /// AddrSpaceExpr) applied to it. The former will be returned in cases 956 /// where the address space remains dependent. 957 /// 958 /// By default, performs semantic analysis when building the type with address 959 /// space applied. Subclasses may override this routine to provide different 960 /// behavior. 961 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 962 Expr *AddrSpaceExpr, 963 SourceLocation AttributeLoc); 964 965 /// Build a new function type. 966 /// 967 /// By default, performs semantic analysis when building the function type. 968 /// Subclasses may override this routine to provide different behavior. 969 QualType RebuildFunctionProtoType(QualType T, 970 MutableArrayRef<QualType> ParamTypes, 971 const FunctionProtoType::ExtProtoInfo &EPI); 972 973 /// Build a new unprototyped function type. 974 QualType RebuildFunctionNoProtoType(QualType ResultType); 975 976 /// Rebuild an unresolved typename type, given the decl that 977 /// the UnresolvedUsingTypenameDecl was transformed to. 978 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 979 980 /// Build a new type found via an alias. 981 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 982 return SemaRef.Context.getUsingType(Found, Underlying); 983 } 984 985 /// Build a new typedef type. 986 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 987 return SemaRef.Context.getTypeDeclType(Typedef); 988 } 989 990 /// Build a new MacroDefined type. 991 QualType RebuildMacroQualifiedType(QualType T, 992 const IdentifierInfo *MacroII) { 993 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 994 } 995 996 /// Build a new class/struct/union type. 997 QualType RebuildRecordType(RecordDecl *Record) { 998 return SemaRef.Context.getTypeDeclType(Record); 999 } 1000 1001 /// Build a new Enum type. 1002 QualType RebuildEnumType(EnumDecl *Enum) { 1003 return SemaRef.Context.getTypeDeclType(Enum); 1004 } 1005 1006 /// Build a new typeof(expr) type. 1007 /// 1008 /// By default, performs semantic analysis when building the typeof type. 1009 /// Subclasses may override this routine to provide different behavior. 1010 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc, 1011 TypeOfKind Kind); 1012 1013 /// Build a new typeof(type) type. 1014 /// 1015 /// By default, builds a new TypeOfType with the given underlying type. 1016 QualType RebuildTypeOfType(QualType Underlying, TypeOfKind Kind); 1017 1018 /// Build a new unary transform type. 1019 QualType RebuildUnaryTransformType(QualType BaseType, 1020 UnaryTransformType::UTTKind UKind, 1021 SourceLocation Loc); 1022 1023 /// Build a new C++11 decltype type. 1024 /// 1025 /// By default, performs semantic analysis when building the decltype type. 1026 /// Subclasses may override this routine to provide different behavior. 1027 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 1028 1029 /// Build a new C++11 auto type. 1030 /// 1031 /// By default, builds a new AutoType with the given deduced type. 1032 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 1033 ConceptDecl *TypeConstraintConcept, 1034 ArrayRef<TemplateArgument> TypeConstraintArgs) { 1035 // Note, IsDependent is always false here: we implicitly convert an 'auto' 1036 // which has been deduced to a dependent type into an undeduced 'auto', so 1037 // that we'll retry deduction after the transformation. 1038 return SemaRef.Context.getAutoType(Deduced, Keyword, 1039 /*IsDependent*/ false, /*IsPack=*/false, 1040 TypeConstraintConcept, 1041 TypeConstraintArgs); 1042 } 1043 1044 /// By default, builds a new DeducedTemplateSpecializationType with the given 1045 /// deduced type. 1046 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1047 QualType Deduced) { 1048 return SemaRef.Context.getDeducedTemplateSpecializationType( 1049 Template, Deduced, /*IsDependent*/ false); 1050 } 1051 1052 /// Build a new template specialization type. 1053 /// 1054 /// By default, performs semantic analysis when building the template 1055 /// specialization type. Subclasses may override this routine to provide 1056 /// different behavior. 1057 QualType RebuildTemplateSpecializationType(TemplateName Template, 1058 SourceLocation TemplateLoc, 1059 TemplateArgumentListInfo &Args); 1060 1061 /// Build a new parenthesized type. 1062 /// 1063 /// By default, builds a new ParenType type from the inner type. 1064 /// Subclasses may override this routine to provide different behavior. 1065 QualType RebuildParenType(QualType InnerType) { 1066 return SemaRef.BuildParenType(InnerType); 1067 } 1068 1069 /// Build a new qualified name type. 1070 /// 1071 /// By default, builds a new ElaboratedType type from the keyword, 1072 /// the nested-name-specifier and the named type. 1073 /// Subclasses may override this routine to provide different behavior. 1074 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1075 ElaboratedTypeKeyword Keyword, 1076 NestedNameSpecifierLoc QualifierLoc, 1077 QualType Named) { 1078 return SemaRef.Context.getElaboratedType(Keyword, 1079 QualifierLoc.getNestedNameSpecifier(), 1080 Named); 1081 } 1082 1083 /// Build a new typename type that refers to a template-id. 1084 /// 1085 /// By default, builds a new DependentNameType type from the 1086 /// nested-name-specifier and the given type. Subclasses may override 1087 /// this routine to provide different behavior. 1088 QualType RebuildDependentTemplateSpecializationType( 1089 ElaboratedTypeKeyword Keyword, 1090 NestedNameSpecifierLoc QualifierLoc, 1091 SourceLocation TemplateKWLoc, 1092 const IdentifierInfo *Name, 1093 SourceLocation NameLoc, 1094 TemplateArgumentListInfo &Args, 1095 bool AllowInjectedClassName) { 1096 // Rebuild the template name. 1097 // TODO: avoid TemplateName abstraction 1098 CXXScopeSpec SS; 1099 SS.Adopt(QualifierLoc); 1100 TemplateName InstName = getDerived().RebuildTemplateName( 1101 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1102 AllowInjectedClassName); 1103 1104 if (InstName.isNull()) 1105 return QualType(); 1106 1107 // If it's still dependent, make a dependent specialization. 1108 if (InstName.getAsDependentTemplateName()) 1109 return SemaRef.Context.getDependentTemplateSpecializationType( 1110 Keyword, QualifierLoc.getNestedNameSpecifier(), Name, 1111 Args.arguments()); 1112 1113 // Otherwise, make an elaborated type wrapping a non-dependent 1114 // specialization. 1115 QualType T = 1116 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1117 if (T.isNull()) 1118 return QualType(); 1119 return SemaRef.Context.getElaboratedType( 1120 Keyword, QualifierLoc.getNestedNameSpecifier(), T); 1121 } 1122 1123 /// Build a new typename type that refers to an identifier. 1124 /// 1125 /// By default, performs semantic analysis when building the typename type 1126 /// (or elaborated type). Subclasses may override this routine to provide 1127 /// different behavior. 1128 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1129 SourceLocation KeywordLoc, 1130 NestedNameSpecifierLoc QualifierLoc, 1131 const IdentifierInfo *Id, 1132 SourceLocation IdLoc, 1133 bool DeducedTSTContext) { 1134 CXXScopeSpec SS; 1135 SS.Adopt(QualifierLoc); 1136 1137 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1138 // If the name is still dependent, just build a new dependent name type. 1139 if (!SemaRef.computeDeclContext(SS)) 1140 return SemaRef.Context.getDependentNameType(Keyword, 1141 QualifierLoc.getNestedNameSpecifier(), 1142 Id); 1143 } 1144 1145 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1146 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1147 *Id, IdLoc, DeducedTSTContext); 1148 } 1149 1150 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1151 1152 // We had a dependent elaborated-type-specifier that has been transformed 1153 // into a non-dependent elaborated-type-specifier. Find the tag we're 1154 // referring to. 1155 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1156 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1157 if (!DC) 1158 return QualType(); 1159 1160 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1161 return QualType(); 1162 1163 TagDecl *Tag = nullptr; 1164 SemaRef.LookupQualifiedName(Result, DC); 1165 switch (Result.getResultKind()) { 1166 case LookupResult::NotFound: 1167 case LookupResult::NotFoundInCurrentInstantiation: 1168 break; 1169 1170 case LookupResult::Found: 1171 Tag = Result.getAsSingle<TagDecl>(); 1172 break; 1173 1174 case LookupResult::FoundOverloaded: 1175 case LookupResult::FoundUnresolvedValue: 1176 llvm_unreachable("Tag lookup cannot find non-tags"); 1177 1178 case LookupResult::Ambiguous: 1179 // Let the LookupResult structure handle ambiguities. 1180 return QualType(); 1181 } 1182 1183 if (!Tag) { 1184 // Check where the name exists but isn't a tag type and use that to emit 1185 // better diagnostics. 1186 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1187 SemaRef.LookupQualifiedName(Result, DC); 1188 switch (Result.getResultKind()) { 1189 case LookupResult::Found: 1190 case LookupResult::FoundOverloaded: 1191 case LookupResult::FoundUnresolvedValue: { 1192 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1193 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1194 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1195 << NTK << Kind; 1196 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1197 break; 1198 } 1199 default: 1200 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1201 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1202 break; 1203 } 1204 return QualType(); 1205 } 1206 1207 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1208 IdLoc, Id)) { 1209 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1210 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1211 return QualType(); 1212 } 1213 1214 // Build the elaborated-type-specifier type. 1215 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1216 return SemaRef.Context.getElaboratedType(Keyword, 1217 QualifierLoc.getNestedNameSpecifier(), 1218 T); 1219 } 1220 1221 /// Build a new pack expansion type. 1222 /// 1223 /// By default, builds a new PackExpansionType type from the given pattern. 1224 /// Subclasses may override this routine to provide different behavior. 1225 QualType RebuildPackExpansionType(QualType Pattern, SourceRange PatternRange, 1226 SourceLocation EllipsisLoc, 1227 std::optional<unsigned> NumExpansions) { 1228 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1229 NumExpansions); 1230 } 1231 1232 /// Build a new atomic type given its value type. 1233 /// 1234 /// By default, performs semantic analysis when building the atomic type. 1235 /// Subclasses may override this routine to provide different behavior. 1236 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1237 1238 /// Build a new pipe type given its value type. 1239 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1240 bool isReadPipe); 1241 1242 /// Build a bit-precise int given its value type. 1243 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1244 SourceLocation Loc); 1245 1246 /// Build a dependent bit-precise int given its value type. 1247 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1248 SourceLocation Loc); 1249 1250 /// Build a new template name given a nested name specifier, a flag 1251 /// indicating whether the "template" keyword was provided, and the template 1252 /// that the template name refers to. 1253 /// 1254 /// By default, builds the new template name directly. Subclasses may override 1255 /// this routine to provide different behavior. 1256 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1257 bool TemplateKW, 1258 TemplateDecl *Template); 1259 1260 /// Build a new template name given a nested name specifier and the 1261 /// name that is referred to as a template. 1262 /// 1263 /// By default, performs semantic analysis to determine whether the name can 1264 /// be resolved to a specific template, then builds the appropriate kind of 1265 /// template name. Subclasses may override this routine to provide different 1266 /// behavior. 1267 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1268 SourceLocation TemplateKWLoc, 1269 const IdentifierInfo &Name, 1270 SourceLocation NameLoc, QualType ObjectType, 1271 NamedDecl *FirstQualifierInScope, 1272 bool AllowInjectedClassName); 1273 1274 /// Build a new template name given a nested name specifier and the 1275 /// overloaded operator name that is referred to as a template. 1276 /// 1277 /// By default, performs semantic analysis to determine whether the name can 1278 /// be resolved to a specific template, then builds the appropriate kind of 1279 /// template name. Subclasses may override this routine to provide different 1280 /// behavior. 1281 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1282 SourceLocation TemplateKWLoc, 1283 OverloadedOperatorKind Operator, 1284 SourceLocation NameLoc, QualType ObjectType, 1285 bool AllowInjectedClassName); 1286 1287 /// Build a new template name given a template template parameter pack 1288 /// and the 1289 /// 1290 /// By default, performs semantic analysis to determine whether the name can 1291 /// be resolved to a specific template, then builds the appropriate kind of 1292 /// template name. Subclasses may override this routine to provide different 1293 /// behavior. 1294 TemplateName RebuildTemplateName(const TemplateArgument &ArgPack, 1295 Decl *AssociatedDecl, unsigned Index, 1296 bool Final) { 1297 return getSema().Context.getSubstTemplateTemplateParmPack( 1298 ArgPack, AssociatedDecl, Index, Final); 1299 } 1300 1301 /// Build a new compound statement. 1302 /// 1303 /// By default, performs semantic analysis to build the new statement. 1304 /// Subclasses may override this routine to provide different behavior. 1305 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1306 MultiStmtArg Statements, 1307 SourceLocation RBraceLoc, 1308 bool IsStmtExpr) { 1309 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1310 IsStmtExpr); 1311 } 1312 1313 /// Build a new case statement. 1314 /// 1315 /// By default, performs semantic analysis to build the new statement. 1316 /// Subclasses may override this routine to provide different behavior. 1317 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1318 Expr *LHS, 1319 SourceLocation EllipsisLoc, 1320 Expr *RHS, 1321 SourceLocation ColonLoc) { 1322 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1323 ColonLoc); 1324 } 1325 1326 /// Attach the body to a new case statement. 1327 /// 1328 /// By default, performs semantic analysis to build the new statement. 1329 /// Subclasses may override this routine to provide different behavior. 1330 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1331 getSema().ActOnCaseStmtBody(S, Body); 1332 return S; 1333 } 1334 1335 /// Build a new default statement. 1336 /// 1337 /// By default, performs semantic analysis to build the new statement. 1338 /// Subclasses may override this routine to provide different behavior. 1339 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1340 SourceLocation ColonLoc, 1341 Stmt *SubStmt) { 1342 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1343 /*CurScope=*/nullptr); 1344 } 1345 1346 /// Build a new label 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 RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1351 SourceLocation ColonLoc, Stmt *SubStmt) { 1352 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1353 } 1354 1355 /// Build a new attributed 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 RebuildAttributedStmt(SourceLocation AttrLoc, 1360 ArrayRef<const Attr *> Attrs, 1361 Stmt *SubStmt) { 1362 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1363 } 1364 1365 /// Build a new "if" statement. 1366 /// 1367 /// By default, performs semantic analysis to build the new statement. 1368 /// Subclasses may override this routine to provide different behavior. 1369 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1370 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1371 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1372 SourceLocation ElseLoc, Stmt *Else) { 1373 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1374 Then, ElseLoc, Else); 1375 } 1376 1377 /// Start building a new switch statement. 1378 /// 1379 /// By default, performs semantic analysis to build the new statement. 1380 /// Subclasses may override this routine to provide different behavior. 1381 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1382 SourceLocation LParenLoc, Stmt *Init, 1383 Sema::ConditionResult Cond, 1384 SourceLocation RParenLoc) { 1385 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1386 RParenLoc); 1387 } 1388 1389 /// Attach the body to the switch statement. 1390 /// 1391 /// By default, performs semantic analysis to build the new statement. 1392 /// Subclasses may override this routine to provide different behavior. 1393 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1394 Stmt *Switch, Stmt *Body) { 1395 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1396 } 1397 1398 /// Build a new while statement. 1399 /// 1400 /// By default, performs semantic analysis to build the new statement. 1401 /// Subclasses may override this routine to provide different behavior. 1402 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1403 Sema::ConditionResult Cond, 1404 SourceLocation RParenLoc, Stmt *Body) { 1405 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1406 } 1407 1408 /// Build a new do-while statement. 1409 /// 1410 /// By default, performs semantic analysis to build the new statement. 1411 /// Subclasses may override this routine to provide different behavior. 1412 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1413 SourceLocation WhileLoc, SourceLocation LParenLoc, 1414 Expr *Cond, SourceLocation RParenLoc) { 1415 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1416 Cond, RParenLoc); 1417 } 1418 1419 /// Build a new for statement. 1420 /// 1421 /// By default, performs semantic analysis to build the new statement. 1422 /// Subclasses may override this routine to provide different behavior. 1423 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1424 Stmt *Init, Sema::ConditionResult Cond, 1425 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1426 Stmt *Body) { 1427 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1428 Inc, RParenLoc, Body); 1429 } 1430 1431 /// Build a new goto 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 RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1436 LabelDecl *Label) { 1437 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1438 } 1439 1440 /// Build a new indirect goto statement. 1441 /// 1442 /// By default, performs semantic analysis to build the new statement. 1443 /// Subclasses may override this routine to provide different behavior. 1444 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1445 SourceLocation StarLoc, 1446 Expr *Target) { 1447 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1448 } 1449 1450 /// Build a new return statement. 1451 /// 1452 /// By default, performs semantic analysis to build the new statement. 1453 /// Subclasses may override this routine to provide different behavior. 1454 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1455 return getSema().BuildReturnStmt(ReturnLoc, Result); 1456 } 1457 1458 /// Build a new declaration statement. 1459 /// 1460 /// By default, performs semantic analysis to build the new statement. 1461 /// Subclasses may override this routine to provide different behavior. 1462 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1463 SourceLocation StartLoc, SourceLocation EndLoc) { 1464 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1465 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1466 } 1467 1468 /// Build a new inline asm statement. 1469 /// 1470 /// By default, performs semantic analysis to build the new statement. 1471 /// Subclasses may override this routine to provide different behavior. 1472 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1473 bool IsVolatile, unsigned NumOutputs, 1474 unsigned NumInputs, IdentifierInfo **Names, 1475 MultiExprArg Constraints, MultiExprArg Exprs, 1476 Expr *AsmString, MultiExprArg Clobbers, 1477 unsigned NumLabels, 1478 SourceLocation RParenLoc) { 1479 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1480 NumInputs, Names, Constraints, Exprs, 1481 AsmString, Clobbers, NumLabels, RParenLoc); 1482 } 1483 1484 /// Build a new MS style inline asm statement. 1485 /// 1486 /// By default, performs semantic analysis to build the new statement. 1487 /// Subclasses may override this routine to provide different behavior. 1488 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1489 ArrayRef<Token> AsmToks, 1490 StringRef AsmString, 1491 unsigned NumOutputs, unsigned NumInputs, 1492 ArrayRef<StringRef> Constraints, 1493 ArrayRef<StringRef> Clobbers, 1494 ArrayRef<Expr*> Exprs, 1495 SourceLocation EndLoc) { 1496 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1497 NumOutputs, NumInputs, 1498 Constraints, Clobbers, Exprs, EndLoc); 1499 } 1500 1501 /// Build a new co_return statement. 1502 /// 1503 /// By default, performs semantic analysis to build the new statement. 1504 /// Subclasses may override this routine to provide different behavior. 1505 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1506 bool IsImplicit) { 1507 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1508 } 1509 1510 /// Build a new co_await expression. 1511 /// 1512 /// By default, performs semantic analysis to build the new expression. 1513 /// Subclasses may override this routine to provide different behavior. 1514 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Operand, 1515 UnresolvedLookupExpr *OpCoawaitLookup, 1516 bool IsImplicit) { 1517 // This function rebuilds a coawait-expr given its operator. 1518 // For an explicit coawait-expr, the rebuild involves the full set 1519 // of transformations performed by BuildUnresolvedCoawaitExpr(), 1520 // including calling await_transform(). 1521 // For an implicit coawait-expr, we need to rebuild the "operator 1522 // coawait" but not await_transform(), so use BuildResolvedCoawaitExpr(). 1523 // This mirrors how the implicit CoawaitExpr is originally created 1524 // in Sema::ActOnCoroutineBodyStart(). 1525 if (IsImplicit) { 1526 ExprResult Suspend = getSema().BuildOperatorCoawaitCall( 1527 CoawaitLoc, Operand, OpCoawaitLookup); 1528 if (Suspend.isInvalid()) 1529 return ExprError(); 1530 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Operand, 1531 Suspend.get(), true); 1532 } 1533 1534 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Operand, 1535 OpCoawaitLookup); 1536 } 1537 1538 /// Build a new co_await expression. 1539 /// 1540 /// By default, performs semantic analysis to build the new expression. 1541 /// Subclasses may override this routine to provide different behavior. 1542 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1543 Expr *Result, 1544 UnresolvedLookupExpr *Lookup) { 1545 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1546 } 1547 1548 /// Build a new co_yield expression. 1549 /// 1550 /// By default, performs semantic analysis to build the new expression. 1551 /// Subclasses may override this routine to provide different behavior. 1552 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1553 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1554 } 1555 1556 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1557 return getSema().BuildCoroutineBodyStmt(Args); 1558 } 1559 1560 /// Build a new Objective-C \@try statement. 1561 /// 1562 /// By default, performs semantic analysis to build the new statement. 1563 /// Subclasses may override this routine to provide different behavior. 1564 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1565 Stmt *TryBody, 1566 MultiStmtArg CatchStmts, 1567 Stmt *Finally) { 1568 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1569 Finally); 1570 } 1571 1572 /// Rebuild an Objective-C exception declaration. 1573 /// 1574 /// By default, performs semantic analysis to build the new declaration. 1575 /// Subclasses may override this routine to provide different behavior. 1576 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1577 TypeSourceInfo *TInfo, QualType T) { 1578 return getSema().BuildObjCExceptionDecl(TInfo, T, 1579 ExceptionDecl->getInnerLocStart(), 1580 ExceptionDecl->getLocation(), 1581 ExceptionDecl->getIdentifier()); 1582 } 1583 1584 /// Build a new Objective-C \@catch statement. 1585 /// 1586 /// By default, performs semantic analysis to build the new statement. 1587 /// Subclasses may override this routine to provide different behavior. 1588 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1589 SourceLocation RParenLoc, 1590 VarDecl *Var, 1591 Stmt *Body) { 1592 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1593 Var, Body); 1594 } 1595 1596 /// Build a new Objective-C \@finally statement. 1597 /// 1598 /// By default, performs semantic analysis to build the new statement. 1599 /// Subclasses may override this routine to provide different behavior. 1600 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1601 Stmt *Body) { 1602 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1603 } 1604 1605 /// Build a new Objective-C \@throw statement. 1606 /// 1607 /// By default, performs semantic analysis to build the new statement. 1608 /// Subclasses may override this routine to provide different behavior. 1609 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1610 Expr *Operand) { 1611 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1612 } 1613 1614 /// Build a new OpenMP Canonical loop. 1615 /// 1616 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1617 /// OMPCanonicalLoop. 1618 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1619 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1620 } 1621 1622 /// Build a new OpenMP executable directive. 1623 /// 1624 /// By default, performs semantic analysis to build the new statement. 1625 /// Subclasses may override this routine to provide different behavior. 1626 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1627 DeclarationNameInfo DirName, 1628 OpenMPDirectiveKind CancelRegion, 1629 ArrayRef<OMPClause *> Clauses, 1630 Stmt *AStmt, SourceLocation StartLoc, 1631 SourceLocation EndLoc) { 1632 return getSema().ActOnOpenMPExecutableDirective( 1633 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1634 } 1635 1636 /// Build a new OpenMP 'if' clause. 1637 /// 1638 /// By default, performs semantic analysis to build the new OpenMP clause. 1639 /// Subclasses may override this routine to provide different behavior. 1640 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1641 Expr *Condition, SourceLocation StartLoc, 1642 SourceLocation LParenLoc, 1643 SourceLocation NameModifierLoc, 1644 SourceLocation ColonLoc, 1645 SourceLocation EndLoc) { 1646 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1647 LParenLoc, NameModifierLoc, ColonLoc, 1648 EndLoc); 1649 } 1650 1651 /// Build a new OpenMP 'final' clause. 1652 /// 1653 /// By default, performs semantic analysis to build the new OpenMP clause. 1654 /// Subclasses may override this routine to provide different behavior. 1655 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1656 SourceLocation LParenLoc, 1657 SourceLocation EndLoc) { 1658 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1659 EndLoc); 1660 } 1661 1662 /// Build a new OpenMP 'num_threads' clause. 1663 /// 1664 /// By default, performs semantic analysis to build the new OpenMP clause. 1665 /// Subclasses may override this routine to provide different behavior. 1666 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1667 SourceLocation StartLoc, 1668 SourceLocation LParenLoc, 1669 SourceLocation EndLoc) { 1670 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1671 LParenLoc, EndLoc); 1672 } 1673 1674 /// Build a new OpenMP 'safelen' 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 *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1679 SourceLocation LParenLoc, 1680 SourceLocation EndLoc) { 1681 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1682 } 1683 1684 /// Build a new OpenMP 'simdlen' 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 *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1689 SourceLocation LParenLoc, 1690 SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1692 } 1693 1694 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1695 SourceLocation StartLoc, 1696 SourceLocation LParenLoc, 1697 SourceLocation EndLoc) { 1698 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'full' clause. 1702 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1703 SourceLocation EndLoc) { 1704 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1705 } 1706 1707 /// Build a new OpenMP 'partial' clause. 1708 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1709 SourceLocation LParenLoc, 1710 SourceLocation EndLoc) { 1711 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1712 EndLoc); 1713 } 1714 1715 /// Build a new OpenMP 'allocator' clause. 1716 /// 1717 /// By default, performs semantic analysis to build the new OpenMP clause. 1718 /// Subclasses may override this routine to provide different behavior. 1719 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1720 SourceLocation LParenLoc, 1721 SourceLocation EndLoc) { 1722 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1723 } 1724 1725 /// Build a new OpenMP 'collapse' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new OpenMP clause. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1730 SourceLocation LParenLoc, 1731 SourceLocation EndLoc) { 1732 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1733 EndLoc); 1734 } 1735 1736 /// Build a new OpenMP 'default' clause. 1737 /// 1738 /// By default, performs semantic analysis to build the new OpenMP clause. 1739 /// Subclasses may override this routine to provide different behavior. 1740 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1741 SourceLocation StartLoc, 1742 SourceLocation LParenLoc, 1743 SourceLocation EndLoc) { 1744 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1745 StartLoc, LParenLoc, EndLoc); 1746 } 1747 1748 /// Build a new OpenMP 'proc_bind' clause. 1749 /// 1750 /// By default, performs semantic analysis to build the new OpenMP clause. 1751 /// Subclasses may override this routine to provide different behavior. 1752 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1753 SourceLocation KindKwLoc, 1754 SourceLocation StartLoc, 1755 SourceLocation LParenLoc, 1756 SourceLocation EndLoc) { 1757 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1758 StartLoc, LParenLoc, EndLoc); 1759 } 1760 1761 /// Build a new OpenMP 'schedule' clause. 1762 /// 1763 /// By default, performs semantic analysis to build the new OpenMP clause. 1764 /// Subclasses may override this routine to provide different behavior. 1765 OMPClause *RebuildOMPScheduleClause( 1766 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1767 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1768 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1769 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1770 return getSema().ActOnOpenMPScheduleClause( 1771 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1772 CommaLoc, EndLoc); 1773 } 1774 1775 /// Build a new OpenMP 'ordered' clause. 1776 /// 1777 /// By default, performs semantic analysis to build the new OpenMP clause. 1778 /// Subclasses may override this routine to provide different behavior. 1779 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1780 SourceLocation EndLoc, 1781 SourceLocation LParenLoc, Expr *Num) { 1782 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1783 } 1784 1785 /// Build a new OpenMP 'private' clause. 1786 /// 1787 /// By default, performs semantic analysis to build the new OpenMP clause. 1788 /// Subclasses may override this routine to provide different behavior. 1789 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1790 SourceLocation StartLoc, 1791 SourceLocation LParenLoc, 1792 SourceLocation EndLoc) { 1793 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1794 EndLoc); 1795 } 1796 1797 /// Build a new OpenMP 'firstprivate' clause. 1798 /// 1799 /// By default, performs semantic analysis to build the new OpenMP clause. 1800 /// Subclasses may override this routine to provide different behavior. 1801 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1802 SourceLocation StartLoc, 1803 SourceLocation LParenLoc, 1804 SourceLocation EndLoc) { 1805 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1806 EndLoc); 1807 } 1808 1809 /// Build a new OpenMP 'lastprivate' clause. 1810 /// 1811 /// By default, performs semantic analysis to build the new OpenMP clause. 1812 /// Subclasses may override this routine to provide different behavior. 1813 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1814 OpenMPLastprivateModifier LPKind, 1815 SourceLocation LPKindLoc, 1816 SourceLocation ColonLoc, 1817 SourceLocation StartLoc, 1818 SourceLocation LParenLoc, 1819 SourceLocation EndLoc) { 1820 return getSema().ActOnOpenMPLastprivateClause( 1821 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1822 } 1823 1824 /// Build a new OpenMP 'shared' clause. 1825 /// 1826 /// By default, performs semantic analysis to build the new OpenMP clause. 1827 /// Subclasses may override this routine to provide different behavior. 1828 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1829 SourceLocation StartLoc, 1830 SourceLocation LParenLoc, 1831 SourceLocation EndLoc) { 1832 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1833 EndLoc); 1834 } 1835 1836 /// Build a new OpenMP 'reduction' clause. 1837 /// 1838 /// By default, performs semantic analysis to build the new statement. 1839 /// Subclasses may override this routine to provide different behavior. 1840 OMPClause *RebuildOMPReductionClause( 1841 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1842 SourceLocation StartLoc, SourceLocation LParenLoc, 1843 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1844 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1845 const DeclarationNameInfo &ReductionId, 1846 ArrayRef<Expr *> UnresolvedReductions) { 1847 return getSema().ActOnOpenMPReductionClause( 1848 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1849 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1850 } 1851 1852 /// Build a new OpenMP 'task_reduction' clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new statement. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPTaskReductionClause( 1857 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1858 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1859 CXXScopeSpec &ReductionIdScopeSpec, 1860 const DeclarationNameInfo &ReductionId, 1861 ArrayRef<Expr *> UnresolvedReductions) { 1862 return getSema().ActOnOpenMPTaskReductionClause( 1863 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1864 ReductionId, UnresolvedReductions); 1865 } 1866 1867 /// Build a new OpenMP 'in_reduction' clause. 1868 /// 1869 /// By default, performs semantic analysis to build the new statement. 1870 /// Subclasses may override this routine to provide different behavior. 1871 OMPClause * 1872 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1873 SourceLocation LParenLoc, SourceLocation ColonLoc, 1874 SourceLocation EndLoc, 1875 CXXScopeSpec &ReductionIdScopeSpec, 1876 const DeclarationNameInfo &ReductionId, 1877 ArrayRef<Expr *> UnresolvedReductions) { 1878 return getSema().ActOnOpenMPInReductionClause( 1879 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1880 ReductionId, UnresolvedReductions); 1881 } 1882 1883 /// Build a new OpenMP 'linear' clause. 1884 /// 1885 /// By default, performs semantic analysis to build the new OpenMP clause. 1886 /// Subclasses may override this routine to provide different behavior. 1887 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1888 SourceLocation StartLoc, 1889 SourceLocation LParenLoc, 1890 OpenMPLinearClauseKind Modifier, 1891 SourceLocation ModifierLoc, 1892 SourceLocation ColonLoc, 1893 SourceLocation EndLoc) { 1894 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1895 Modifier, ModifierLoc, ColonLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'aligned' clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1904 SourceLocation StartLoc, 1905 SourceLocation LParenLoc, 1906 SourceLocation ColonLoc, 1907 SourceLocation EndLoc) { 1908 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1909 LParenLoc, ColonLoc, EndLoc); 1910 } 1911 1912 /// Build a new OpenMP 'copyin' clause. 1913 /// 1914 /// By default, performs semantic analysis to build the new OpenMP clause. 1915 /// Subclasses may override this routine to provide different behavior. 1916 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1917 SourceLocation StartLoc, 1918 SourceLocation LParenLoc, 1919 SourceLocation EndLoc) { 1920 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1921 EndLoc); 1922 } 1923 1924 /// Build a new OpenMP 'copyprivate' clause. 1925 /// 1926 /// By default, performs semantic analysis to build the new OpenMP clause. 1927 /// Subclasses may override this routine to provide different behavior. 1928 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1929 SourceLocation StartLoc, 1930 SourceLocation LParenLoc, 1931 SourceLocation EndLoc) { 1932 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1933 EndLoc); 1934 } 1935 1936 /// Build a new OpenMP 'flush' pseudo clause. 1937 /// 1938 /// By default, performs semantic analysis to build the new OpenMP clause. 1939 /// Subclasses may override this routine to provide different behavior. 1940 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1941 SourceLocation StartLoc, 1942 SourceLocation LParenLoc, 1943 SourceLocation EndLoc) { 1944 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1945 EndLoc); 1946 } 1947 1948 /// Build a new OpenMP 'depobj' pseudo clause. 1949 /// 1950 /// By default, performs semantic analysis to build the new OpenMP clause. 1951 /// Subclasses may override this routine to provide different behavior. 1952 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1953 SourceLocation LParenLoc, 1954 SourceLocation EndLoc) { 1955 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1956 EndLoc); 1957 } 1958 1959 /// Build a new OpenMP 'depend' pseudo clause. 1960 /// 1961 /// By default, performs semantic analysis to build the new OpenMP clause. 1962 /// Subclasses may override this routine to provide different behavior. 1963 OMPClause *RebuildOMPDependClause(OMPDependClause::DependDataTy Data, 1964 Expr *DepModifier, ArrayRef<Expr *> VarList, 1965 SourceLocation StartLoc, 1966 SourceLocation LParenLoc, 1967 SourceLocation EndLoc) { 1968 return getSema().ActOnOpenMPDependClause(Data, DepModifier, VarList, 1969 StartLoc, LParenLoc, EndLoc); 1970 } 1971 1972 /// Build a new OpenMP 'device' clause. 1973 /// 1974 /// By default, performs semantic analysis to build the new statement. 1975 /// Subclasses may override this routine to provide different behavior. 1976 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1977 Expr *Device, SourceLocation StartLoc, 1978 SourceLocation LParenLoc, 1979 SourceLocation ModifierLoc, 1980 SourceLocation EndLoc) { 1981 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1982 LParenLoc, ModifierLoc, EndLoc); 1983 } 1984 1985 /// Build a new OpenMP 'map' clause. 1986 /// 1987 /// By default, performs semantic analysis to build the new OpenMP clause. 1988 /// Subclasses may override this routine to provide different behavior. 1989 OMPClause *RebuildOMPMapClause( 1990 Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1991 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1992 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1993 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1994 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1995 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1996 return getSema().ActOnOpenMPMapClause( 1997 IteratorModifier, MapTypeModifiers, MapTypeModifiersLoc, 1998 MapperIdScopeSpec, MapperId, MapType, IsMapTypeImplicit, MapLoc, 1999 ColonLoc, VarList, Locs, 2000 /*NoDiagnose=*/false, UnresolvedMappers); 2001 } 2002 2003 /// Build a new OpenMP 'allocate' clause. 2004 /// 2005 /// By default, performs semantic analysis to build the new OpenMP clause. 2006 /// Subclasses may override this routine to provide different behavior. 2007 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 2008 SourceLocation StartLoc, 2009 SourceLocation LParenLoc, 2010 SourceLocation ColonLoc, 2011 SourceLocation EndLoc) { 2012 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 2013 LParenLoc, ColonLoc, EndLoc); 2014 } 2015 2016 /// Build a new OpenMP 'num_teams' clause. 2017 /// 2018 /// By default, performs semantic analysis to build the new statement. 2019 /// Subclasses may override this routine to provide different behavior. 2020 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 2021 SourceLocation LParenLoc, 2022 SourceLocation EndLoc) { 2023 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 2024 EndLoc); 2025 } 2026 2027 /// Build a new OpenMP 'thread_limit' clause. 2028 /// 2029 /// By default, performs semantic analysis to build the new statement. 2030 /// Subclasses may override this routine to provide different behavior. 2031 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 2032 SourceLocation StartLoc, 2033 SourceLocation LParenLoc, 2034 SourceLocation EndLoc) { 2035 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 2036 LParenLoc, EndLoc); 2037 } 2038 2039 /// Build a new OpenMP 'priority' clause. 2040 /// 2041 /// By default, performs semantic analysis to build the new statement. 2042 /// Subclasses may override this routine to provide different behavior. 2043 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 2044 SourceLocation LParenLoc, 2045 SourceLocation EndLoc) { 2046 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 2047 EndLoc); 2048 } 2049 2050 /// Build a new OpenMP 'grainsize' clause. 2051 /// 2052 /// By default, performs semantic analysis to build the new statement. 2053 /// Subclasses may override this routine to provide different behavior. 2054 OMPClause *RebuildOMPGrainsizeClause(OpenMPGrainsizeClauseModifier Modifier, 2055 Expr *Device, SourceLocation StartLoc, 2056 SourceLocation LParenLoc, 2057 SourceLocation ModifierLoc, 2058 SourceLocation EndLoc) { 2059 return getSema().ActOnOpenMPGrainsizeClause(Modifier, Device, StartLoc, 2060 LParenLoc, ModifierLoc, EndLoc); 2061 } 2062 2063 /// Build a new OpenMP 'num_tasks' clause. 2064 /// 2065 /// By default, performs semantic analysis to build the new statement. 2066 /// Subclasses may override this routine to provide different behavior. 2067 OMPClause *RebuildOMPNumTasksClause(OpenMPNumTasksClauseModifier Modifier, 2068 Expr *NumTasks, SourceLocation StartLoc, 2069 SourceLocation LParenLoc, 2070 SourceLocation ModifierLoc, 2071 SourceLocation EndLoc) { 2072 return getSema().ActOnOpenMPNumTasksClause(Modifier, NumTasks, StartLoc, 2073 LParenLoc, ModifierLoc, EndLoc); 2074 } 2075 2076 /// Build a new OpenMP 'hint' clause. 2077 /// 2078 /// By default, performs semantic analysis to build the new statement. 2079 /// Subclasses may override this routine to provide different behavior. 2080 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2081 SourceLocation LParenLoc, 2082 SourceLocation EndLoc) { 2083 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2084 } 2085 2086 /// Build a new OpenMP 'detach' clause. 2087 /// 2088 /// By default, performs semantic analysis to build the new statement. 2089 /// Subclasses may override this routine to provide different behavior. 2090 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2091 SourceLocation LParenLoc, 2092 SourceLocation EndLoc) { 2093 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2094 } 2095 2096 /// Build a new OpenMP 'dist_schedule' clause. 2097 /// 2098 /// By default, performs semantic analysis to build the new OpenMP clause. 2099 /// Subclasses may override this routine to provide different behavior. 2100 OMPClause * 2101 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2102 Expr *ChunkSize, SourceLocation StartLoc, 2103 SourceLocation LParenLoc, SourceLocation KindLoc, 2104 SourceLocation CommaLoc, SourceLocation EndLoc) { 2105 return getSema().ActOnOpenMPDistScheduleClause( 2106 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2107 } 2108 2109 /// Build a new OpenMP 'to' clause. 2110 /// 2111 /// By default, performs semantic analysis to build the new statement. 2112 /// Subclasses may override this routine to provide different behavior. 2113 OMPClause * 2114 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2115 ArrayRef<SourceLocation> MotionModifiersLoc, 2116 CXXScopeSpec &MapperIdScopeSpec, 2117 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2118 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2119 ArrayRef<Expr *> UnresolvedMappers) { 2120 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2121 MapperIdScopeSpec, MapperId, ColonLoc, 2122 VarList, Locs, UnresolvedMappers); 2123 } 2124 2125 /// Build a new OpenMP 'from' clause. 2126 /// 2127 /// By default, performs semantic analysis to build the new statement. 2128 /// Subclasses may override this routine to provide different behavior. 2129 OMPClause * 2130 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2131 ArrayRef<SourceLocation> MotionModifiersLoc, 2132 CXXScopeSpec &MapperIdScopeSpec, 2133 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2134 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2135 ArrayRef<Expr *> UnresolvedMappers) { 2136 return getSema().ActOnOpenMPFromClause( 2137 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2138 ColonLoc, VarList, Locs, UnresolvedMappers); 2139 } 2140 2141 /// Build a new OpenMP 'use_device_ptr' clause. 2142 /// 2143 /// By default, performs semantic analysis to build the new OpenMP clause. 2144 /// Subclasses may override this routine to provide different behavior. 2145 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2146 const OMPVarListLocTy &Locs) { 2147 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2148 } 2149 2150 /// Build a new OpenMP 'use_device_addr' clause. 2151 /// 2152 /// By default, performs semantic analysis to build the new OpenMP clause. 2153 /// Subclasses may override this routine to provide different behavior. 2154 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2155 const OMPVarListLocTy &Locs) { 2156 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2157 } 2158 2159 /// Build a new OpenMP 'is_device_ptr' clause. 2160 /// 2161 /// By default, performs semantic analysis to build the new OpenMP clause. 2162 /// Subclasses may override this routine to provide different behavior. 2163 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2164 const OMPVarListLocTy &Locs) { 2165 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2166 } 2167 2168 /// Build a new OpenMP 'has_device_addr' clause. 2169 /// 2170 /// By default, performs semantic analysis to build the new OpenMP clause. 2171 /// Subclasses may override this routine to provide different behavior. 2172 OMPClause *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList, 2173 const OMPVarListLocTy &Locs) { 2174 return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs); 2175 } 2176 2177 /// Build a new OpenMP 'defaultmap' clause. 2178 /// 2179 /// By default, performs semantic analysis to build the new OpenMP clause. 2180 /// Subclasses may override this routine to provide different behavior. 2181 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2182 OpenMPDefaultmapClauseKind Kind, 2183 SourceLocation StartLoc, 2184 SourceLocation LParenLoc, 2185 SourceLocation MLoc, 2186 SourceLocation KindLoc, 2187 SourceLocation EndLoc) { 2188 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2189 MLoc, KindLoc, EndLoc); 2190 } 2191 2192 /// Build a new OpenMP 'nontemporal' clause. 2193 /// 2194 /// By default, performs semantic analysis to build the new OpenMP clause. 2195 /// Subclasses may override this routine to provide different behavior. 2196 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2197 SourceLocation StartLoc, 2198 SourceLocation LParenLoc, 2199 SourceLocation EndLoc) { 2200 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2201 EndLoc); 2202 } 2203 2204 /// Build a new OpenMP 'inclusive' clause. 2205 /// 2206 /// By default, performs semantic analysis to build the new OpenMP clause. 2207 /// Subclasses may override this routine to provide different behavior. 2208 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2209 SourceLocation StartLoc, 2210 SourceLocation LParenLoc, 2211 SourceLocation EndLoc) { 2212 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2213 EndLoc); 2214 } 2215 2216 /// Build a new OpenMP 'exclusive' clause. 2217 /// 2218 /// By default, performs semantic analysis to build the new OpenMP clause. 2219 /// Subclasses may override this routine to provide different behavior. 2220 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2221 SourceLocation StartLoc, 2222 SourceLocation LParenLoc, 2223 SourceLocation EndLoc) { 2224 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2225 EndLoc); 2226 } 2227 2228 /// Build a new OpenMP 'uses_allocators' clause. 2229 /// 2230 /// By default, performs semantic analysis to build the new OpenMP clause. 2231 /// Subclasses may override this routine to provide different behavior. 2232 OMPClause *RebuildOMPUsesAllocatorsClause( 2233 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2234 SourceLocation LParenLoc, SourceLocation EndLoc) { 2235 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2236 Data); 2237 } 2238 2239 /// Build a new OpenMP 'affinity' clause. 2240 /// 2241 /// By default, performs semantic analysis to build the new OpenMP clause. 2242 /// Subclasses may override this routine to provide different behavior. 2243 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2244 SourceLocation LParenLoc, 2245 SourceLocation ColonLoc, 2246 SourceLocation EndLoc, Expr *Modifier, 2247 ArrayRef<Expr *> Locators) { 2248 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2249 EndLoc, Modifier, Locators); 2250 } 2251 2252 /// Build a new OpenMP 'order' clause. 2253 /// 2254 /// By default, performs semantic analysis to build the new OpenMP clause. 2255 /// Subclasses may override this routine to provide different behavior. 2256 OMPClause *RebuildOMPOrderClause( 2257 OpenMPOrderClauseKind Kind, SourceLocation KindKwLoc, 2258 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, 2259 OpenMPOrderClauseModifier Modifier, SourceLocation ModifierKwLoc) { 2260 return getSema().ActOnOpenMPOrderClause(Modifier, Kind, StartLoc, LParenLoc, 2261 ModifierKwLoc, KindKwLoc, EndLoc); 2262 } 2263 2264 /// Build a new OpenMP 'init' clause. 2265 /// 2266 /// By default, performs semantic analysis to build the new OpenMP clause. 2267 /// Subclasses may override this routine to provide different behavior. 2268 OMPClause *RebuildOMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo, 2269 SourceLocation StartLoc, 2270 SourceLocation LParenLoc, 2271 SourceLocation VarLoc, 2272 SourceLocation EndLoc) { 2273 return getSema().ActOnOpenMPInitClause(InteropVar, InteropInfo, StartLoc, 2274 LParenLoc, VarLoc, EndLoc); 2275 } 2276 2277 /// Build a new OpenMP 'use' clause. 2278 /// 2279 /// By default, performs semantic analysis to build the new OpenMP clause. 2280 /// Subclasses may override this routine to provide different behavior. 2281 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2282 SourceLocation LParenLoc, 2283 SourceLocation VarLoc, SourceLocation EndLoc) { 2284 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2285 VarLoc, EndLoc); 2286 } 2287 2288 /// Build a new OpenMP 'destroy' clause. 2289 /// 2290 /// By default, performs semantic analysis to build the new OpenMP clause. 2291 /// Subclasses may override this routine to provide different behavior. 2292 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2293 SourceLocation LParenLoc, 2294 SourceLocation VarLoc, 2295 SourceLocation EndLoc) { 2296 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2297 VarLoc, EndLoc); 2298 } 2299 2300 /// Build a new OpenMP 'novariants' clause. 2301 /// 2302 /// By default, performs semantic analysis to build the new OpenMP clause. 2303 /// Subclasses may override this routine to provide different behavior. 2304 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2305 SourceLocation StartLoc, 2306 SourceLocation LParenLoc, 2307 SourceLocation EndLoc) { 2308 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2309 EndLoc); 2310 } 2311 2312 /// Build a new OpenMP 'nocontext' clause. 2313 /// 2314 /// By default, performs semantic analysis to build the new OpenMP clause. 2315 /// Subclasses may override this routine to provide different behavior. 2316 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2317 SourceLocation LParenLoc, 2318 SourceLocation EndLoc) { 2319 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2320 EndLoc); 2321 } 2322 2323 /// Build a new OpenMP 'filter' clause. 2324 /// 2325 /// By default, performs semantic analysis to build the new OpenMP clause. 2326 /// Subclasses may override this routine to provide different behavior. 2327 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2328 SourceLocation LParenLoc, 2329 SourceLocation EndLoc) { 2330 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2331 EndLoc); 2332 } 2333 2334 /// Build a new OpenMP 'bind' clause. 2335 /// 2336 /// By default, performs semantic analysis to build the new OpenMP clause. 2337 /// Subclasses may override this routine to provide different behavior. 2338 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2339 SourceLocation KindLoc, 2340 SourceLocation StartLoc, 2341 SourceLocation LParenLoc, 2342 SourceLocation EndLoc) { 2343 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2344 EndLoc); 2345 } 2346 2347 /// Build a new OpenMP 'ompx_dyn_cgroup_mem' clause. 2348 /// 2349 /// By default, performs semantic analysis to build the new OpenMP clause. 2350 /// Subclasses may override this routine to provide different behavior. 2351 OMPClause *RebuildOMPXDynCGroupMemClause(Expr *Size, SourceLocation StartLoc, 2352 SourceLocation LParenLoc, 2353 SourceLocation EndLoc) { 2354 return getSema().ActOnOpenMPXDynCGroupMemClause(Size, StartLoc, LParenLoc, 2355 EndLoc); 2356 } 2357 2358 /// Build a new OpenMP 'align' clause. 2359 /// 2360 /// By default, performs semantic analysis to build the new OpenMP clause. 2361 /// Subclasses may override this routine to provide different behavior. 2362 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2363 SourceLocation LParenLoc, 2364 SourceLocation EndLoc) { 2365 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2366 } 2367 2368 /// Build a new OpenMP 'at' clause. 2369 /// 2370 /// By default, performs semantic analysis to build the new OpenMP clause. 2371 /// Subclasses may override this routine to provide different behavior. 2372 OMPClause *RebuildOMPAtClause(OpenMPAtClauseKind Kind, SourceLocation KwLoc, 2373 SourceLocation StartLoc, 2374 SourceLocation LParenLoc, 2375 SourceLocation EndLoc) { 2376 return getSema().ActOnOpenMPAtClause(Kind, KwLoc, StartLoc, LParenLoc, 2377 EndLoc); 2378 } 2379 2380 /// Build a new OpenMP 'severity' clause. 2381 /// 2382 /// By default, performs semantic analysis to build the new OpenMP clause. 2383 /// Subclasses may override this routine to provide different behavior. 2384 OMPClause *RebuildOMPSeverityClause(OpenMPSeverityClauseKind Kind, 2385 SourceLocation KwLoc, 2386 SourceLocation StartLoc, 2387 SourceLocation LParenLoc, 2388 SourceLocation EndLoc) { 2389 return getSema().ActOnOpenMPSeverityClause(Kind, KwLoc, StartLoc, LParenLoc, 2390 EndLoc); 2391 } 2392 2393 /// Build a new OpenMP 'message' clause. 2394 /// 2395 /// By default, performs semantic analysis to build the new OpenMP clause. 2396 /// Subclasses may override this routine to provide different behavior. 2397 OMPClause *RebuildOMPMessageClause(Expr *MS, SourceLocation StartLoc, 2398 SourceLocation LParenLoc, 2399 SourceLocation EndLoc) { 2400 return getSema().ActOnOpenMPMessageClause(MS, StartLoc, LParenLoc, EndLoc); 2401 } 2402 2403 /// Rebuild the operand to an Objective-C \@synchronized statement. 2404 /// 2405 /// By default, performs semantic analysis to build the new statement. 2406 /// Subclasses may override this routine to provide different behavior. 2407 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2408 Expr *object) { 2409 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2410 } 2411 2412 /// Build a new Objective-C \@synchronized statement. 2413 /// 2414 /// By default, performs semantic analysis to build the new statement. 2415 /// Subclasses may override this routine to provide different behavior. 2416 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2417 Expr *Object, Stmt *Body) { 2418 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2419 } 2420 2421 /// Build a new Objective-C \@autoreleasepool statement. 2422 /// 2423 /// By default, performs semantic analysis to build the new statement. 2424 /// Subclasses may override this routine to provide different behavior. 2425 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2426 Stmt *Body) { 2427 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2428 } 2429 2430 /// Build a new Objective-C fast enumeration statement. 2431 /// 2432 /// By default, performs semantic analysis to build the new statement. 2433 /// Subclasses may override this routine to provide different behavior. 2434 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2435 Stmt *Element, 2436 Expr *Collection, 2437 SourceLocation RParenLoc, 2438 Stmt *Body) { 2439 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2440 Element, 2441 Collection, 2442 RParenLoc); 2443 if (ForEachStmt.isInvalid()) 2444 return StmtError(); 2445 2446 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2447 } 2448 2449 /// Build a new C++ exception declaration. 2450 /// 2451 /// By default, performs semantic analysis to build the new decaration. 2452 /// Subclasses may override this routine to provide different behavior. 2453 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2454 TypeSourceInfo *Declarator, 2455 SourceLocation StartLoc, 2456 SourceLocation IdLoc, 2457 IdentifierInfo *Id) { 2458 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2459 StartLoc, IdLoc, Id); 2460 if (Var) 2461 getSema().CurContext->addDecl(Var); 2462 return Var; 2463 } 2464 2465 /// Build a new C++ catch statement. 2466 /// 2467 /// By default, performs semantic analysis to build the new statement. 2468 /// Subclasses may override this routine to provide different behavior. 2469 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2470 VarDecl *ExceptionDecl, 2471 Stmt *Handler) { 2472 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2473 Handler)); 2474 } 2475 2476 /// Build a new C++ try statement. 2477 /// 2478 /// By default, performs semantic analysis to build the new statement. 2479 /// Subclasses may override this routine to provide different behavior. 2480 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2481 ArrayRef<Stmt *> Handlers) { 2482 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2483 } 2484 2485 /// Build a new C++0x range-based for statement. 2486 /// 2487 /// By default, performs semantic analysis to build the new statement. 2488 /// Subclasses may override this routine to provide different behavior. 2489 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2490 SourceLocation CoawaitLoc, Stmt *Init, 2491 SourceLocation ColonLoc, Stmt *Range, 2492 Stmt *Begin, Stmt *End, Expr *Cond, 2493 Expr *Inc, Stmt *LoopVar, 2494 SourceLocation RParenLoc) { 2495 // If we've just learned that the range is actually an Objective-C 2496 // collection, treat this as an Objective-C fast enumeration loop. 2497 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2498 if (RangeStmt->isSingleDecl()) { 2499 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2500 if (RangeVar->isInvalidDecl()) 2501 return StmtError(); 2502 2503 Expr *RangeExpr = RangeVar->getInit(); 2504 if (!RangeExpr->isTypeDependent() && 2505 RangeExpr->getType()->isObjCObjectPointerType()) { 2506 // FIXME: Support init-statements in Objective-C++20 ranged for 2507 // statement. 2508 if (Init) { 2509 return SemaRef.Diag(Init->getBeginLoc(), 2510 diag::err_objc_for_range_init_stmt) 2511 << Init->getSourceRange(); 2512 } 2513 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2514 RangeExpr, RParenLoc); 2515 } 2516 } 2517 } 2518 } 2519 2520 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2521 Range, Begin, End, Cond, Inc, LoopVar, 2522 RParenLoc, Sema::BFRK_Rebuild); 2523 } 2524 2525 /// Build a new C++0x range-based for statement. 2526 /// 2527 /// By default, performs semantic analysis to build the new statement. 2528 /// Subclasses may override this routine to provide different behavior. 2529 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2530 bool IsIfExists, 2531 NestedNameSpecifierLoc QualifierLoc, 2532 DeclarationNameInfo NameInfo, 2533 Stmt *Nested) { 2534 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2535 QualifierLoc, NameInfo, Nested); 2536 } 2537 2538 /// Attach body to a C++0x range-based for statement. 2539 /// 2540 /// By default, performs semantic analysis to finish the new statement. 2541 /// Subclasses may override this routine to provide different behavior. 2542 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2543 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2544 } 2545 2546 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2547 Stmt *TryBlock, Stmt *Handler) { 2548 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2549 } 2550 2551 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2552 Stmt *Block) { 2553 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2554 } 2555 2556 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2557 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2558 } 2559 2560 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2561 SourceLocation LParen, 2562 SourceLocation RParen, 2563 TypeSourceInfo *TSI) { 2564 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2565 } 2566 2567 /// Build a new predefined expression. 2568 /// 2569 /// By default, performs semantic analysis to build the new expression. 2570 /// Subclasses may override this routine to provide different behavior. 2571 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2572 PredefinedExpr::IdentKind IK) { 2573 return getSema().BuildPredefinedExpr(Loc, IK); 2574 } 2575 2576 /// Build a new expression that references a declaration. 2577 /// 2578 /// By default, performs semantic analysis to build the new expression. 2579 /// Subclasses may override this routine to provide different behavior. 2580 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2581 LookupResult &R, 2582 bool RequiresADL) { 2583 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2584 } 2585 2586 2587 /// Build a new expression that references a declaration. 2588 /// 2589 /// By default, performs semantic analysis to build the new expression. 2590 /// Subclasses may override this routine to provide different behavior. 2591 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2592 ValueDecl *VD, 2593 const DeclarationNameInfo &NameInfo, 2594 NamedDecl *Found, 2595 TemplateArgumentListInfo *TemplateArgs) { 2596 CXXScopeSpec SS; 2597 SS.Adopt(QualifierLoc); 2598 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2599 TemplateArgs); 2600 } 2601 2602 /// Build a new expression in parentheses. 2603 /// 2604 /// By default, performs semantic analysis to build the new expression. 2605 /// Subclasses may override this routine to provide different behavior. 2606 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2607 SourceLocation RParen) { 2608 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2609 } 2610 2611 /// Build a new pseudo-destructor expression. 2612 /// 2613 /// By default, performs semantic analysis to build the new expression. 2614 /// Subclasses may override this routine to provide different behavior. 2615 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2616 SourceLocation OperatorLoc, 2617 bool isArrow, 2618 CXXScopeSpec &SS, 2619 TypeSourceInfo *ScopeType, 2620 SourceLocation CCLoc, 2621 SourceLocation TildeLoc, 2622 PseudoDestructorTypeStorage Destroyed); 2623 2624 /// Build a new unary operator expression. 2625 /// 2626 /// By default, performs semantic analysis to build the new expression. 2627 /// Subclasses may override this routine to provide different behavior. 2628 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2629 UnaryOperatorKind Opc, 2630 Expr *SubExpr) { 2631 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2632 } 2633 2634 /// Build a new builtin offsetof expression. 2635 /// 2636 /// By default, performs semantic analysis to build the new expression. 2637 /// Subclasses may override this routine to provide different behavior. 2638 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2639 TypeSourceInfo *Type, 2640 ArrayRef<Sema::OffsetOfComponent> Components, 2641 SourceLocation RParenLoc) { 2642 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2643 RParenLoc); 2644 } 2645 2646 /// Build a new sizeof, alignof or vec_step expression with a 2647 /// type argument. 2648 /// 2649 /// By default, performs semantic analysis to build the new expression. 2650 /// Subclasses may override this routine to provide different behavior. 2651 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2652 SourceLocation OpLoc, 2653 UnaryExprOrTypeTrait ExprKind, 2654 SourceRange R) { 2655 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2656 } 2657 2658 /// Build a new sizeof, alignof or vec step expression with an 2659 /// expression argument. 2660 /// 2661 /// By default, performs semantic analysis to build the new expression. 2662 /// Subclasses may override this routine to provide different behavior. 2663 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2664 UnaryExprOrTypeTrait ExprKind, 2665 SourceRange R) { 2666 ExprResult Result 2667 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2668 if (Result.isInvalid()) 2669 return ExprError(); 2670 2671 return Result; 2672 } 2673 2674 /// Build a new array subscript expression. 2675 /// 2676 /// By default, performs semantic analysis to build the new expression. 2677 /// Subclasses may override this routine to provide different behavior. 2678 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2679 SourceLocation LBracketLoc, 2680 Expr *RHS, 2681 SourceLocation RBracketLoc) { 2682 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2683 LBracketLoc, RHS, 2684 RBracketLoc); 2685 } 2686 2687 /// Build a new matrix subscript 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 RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2692 Expr *ColumnIdx, 2693 SourceLocation RBracketLoc) { 2694 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2695 RBracketLoc); 2696 } 2697 2698 /// Build a new array section expression. 2699 /// 2700 /// By default, performs semantic analysis to build the new expression. 2701 /// Subclasses may override this routine to provide different behavior. 2702 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2703 Expr *LowerBound, 2704 SourceLocation ColonLocFirst, 2705 SourceLocation ColonLocSecond, 2706 Expr *Length, Expr *Stride, 2707 SourceLocation RBracketLoc) { 2708 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2709 ColonLocFirst, ColonLocSecond, 2710 Length, Stride, RBracketLoc); 2711 } 2712 2713 /// Build a new array shaping expression. 2714 /// 2715 /// By default, performs semantic analysis to build the new expression. 2716 /// Subclasses may override this routine to provide different behavior. 2717 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2718 SourceLocation RParenLoc, 2719 ArrayRef<Expr *> Dims, 2720 ArrayRef<SourceRange> BracketsRanges) { 2721 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2722 BracketsRanges); 2723 } 2724 2725 /// Build a new iterator expression. 2726 /// 2727 /// By default, performs semantic analysis to build the new expression. 2728 /// Subclasses may override this routine to provide different behavior. 2729 ExprResult RebuildOMPIteratorExpr( 2730 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2731 ArrayRef<Sema::OMPIteratorData> Data) { 2732 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2733 LLoc, RLoc, Data); 2734 } 2735 2736 /// Build a new call expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// Subclasses may override this routine to provide different behavior. 2740 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2741 MultiExprArg Args, 2742 SourceLocation RParenLoc, 2743 Expr *ExecConfig = nullptr) { 2744 return getSema().ActOnCallExpr( 2745 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2746 } 2747 2748 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2749 MultiExprArg Args, 2750 SourceLocation RParenLoc) { 2751 return getSema().ActOnArraySubscriptExpr( 2752 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2753 } 2754 2755 /// Build a new member access expression. 2756 /// 2757 /// By default, performs semantic analysis to build the new expression. 2758 /// Subclasses may override this routine to provide different behavior. 2759 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2760 bool isArrow, 2761 NestedNameSpecifierLoc QualifierLoc, 2762 SourceLocation TemplateKWLoc, 2763 const DeclarationNameInfo &MemberNameInfo, 2764 ValueDecl *Member, 2765 NamedDecl *FoundDecl, 2766 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2767 NamedDecl *FirstQualifierInScope) { 2768 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2769 isArrow); 2770 if (!Member->getDeclName()) { 2771 // We have a reference to an unnamed field. This is always the 2772 // base of an anonymous struct/union member access, i.e. the 2773 // field is always of record type. 2774 assert(Member->getType()->isRecordType() && 2775 "unnamed member not of record type?"); 2776 2777 BaseResult = 2778 getSema().PerformObjectMemberConversion(BaseResult.get(), 2779 QualifierLoc.getNestedNameSpecifier(), 2780 FoundDecl, Member); 2781 if (BaseResult.isInvalid()) 2782 return ExprError(); 2783 Base = BaseResult.get(); 2784 2785 CXXScopeSpec EmptySS; 2786 return getSema().BuildFieldReferenceExpr( 2787 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2788 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2789 } 2790 2791 CXXScopeSpec SS; 2792 SS.Adopt(QualifierLoc); 2793 2794 Base = BaseResult.get(); 2795 QualType BaseType = Base->getType(); 2796 2797 if (isArrow && !BaseType->isPointerType()) 2798 return ExprError(); 2799 2800 // FIXME: this involves duplicating earlier analysis in a lot of 2801 // cases; we should avoid this when possible. 2802 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2803 R.addDecl(FoundDecl); 2804 R.resolveKind(); 2805 2806 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2807 SS, TemplateKWLoc, 2808 FirstQualifierInScope, 2809 R, ExplicitTemplateArgs, 2810 /*S*/nullptr); 2811 } 2812 2813 /// Build a new binary operator expression. 2814 /// 2815 /// By default, performs semantic analysis to build the new expression. 2816 /// Subclasses may override this routine to provide different behavior. 2817 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2818 BinaryOperatorKind Opc, 2819 Expr *LHS, Expr *RHS) { 2820 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2821 } 2822 2823 /// Build a new rewritten operator expression. 2824 /// 2825 /// By default, performs semantic analysis to build the new expression. 2826 /// Subclasses may override this routine to provide different behavior. 2827 ExprResult RebuildCXXRewrittenBinaryOperator( 2828 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2829 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2830 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2831 RHS, /*RequiresADL*/false); 2832 } 2833 2834 /// Build a new conditional operator expression. 2835 /// 2836 /// By default, performs semantic analysis to build the new expression. 2837 /// Subclasses may override this routine to provide different behavior. 2838 ExprResult RebuildConditionalOperator(Expr *Cond, 2839 SourceLocation QuestionLoc, 2840 Expr *LHS, 2841 SourceLocation ColonLoc, 2842 Expr *RHS) { 2843 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2844 LHS, RHS); 2845 } 2846 2847 /// Build a new C-style cast expression. 2848 /// 2849 /// By default, performs semantic analysis to build the new expression. 2850 /// Subclasses may override this routine to provide different behavior. 2851 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2852 TypeSourceInfo *TInfo, 2853 SourceLocation RParenLoc, 2854 Expr *SubExpr) { 2855 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2856 SubExpr); 2857 } 2858 2859 /// Build a new compound literal expression. 2860 /// 2861 /// By default, performs semantic analysis to build the new expression. 2862 /// Subclasses may override this routine to provide different behavior. 2863 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2864 TypeSourceInfo *TInfo, 2865 SourceLocation RParenLoc, 2866 Expr *Init) { 2867 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2868 Init); 2869 } 2870 2871 /// Build a new extended vector element access expression. 2872 /// 2873 /// By default, performs semantic analysis to build the new expression. 2874 /// Subclasses may override this routine to provide different behavior. 2875 ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc, 2876 bool IsArrow, 2877 SourceLocation AccessorLoc, 2878 IdentifierInfo &Accessor) { 2879 2880 CXXScopeSpec SS; 2881 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2882 return getSema().BuildMemberReferenceExpr( 2883 Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(), 2884 /*FirstQualifierInScope*/ nullptr, NameInfo, 2885 /* TemplateArgs */ nullptr, 2886 /*S*/ nullptr); 2887 } 2888 2889 /// Build a new initializer list expression. 2890 /// 2891 /// By default, performs semantic analysis to build the new expression. 2892 /// Subclasses may override this routine to provide different behavior. 2893 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2894 MultiExprArg Inits, 2895 SourceLocation RBraceLoc) { 2896 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2897 } 2898 2899 /// Build a new designated initializer expression. 2900 /// 2901 /// By default, performs semantic analysis to build the new expression. 2902 /// Subclasses may override this routine to provide different behavior. 2903 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2904 MultiExprArg ArrayExprs, 2905 SourceLocation EqualOrColonLoc, 2906 bool GNUSyntax, 2907 Expr *Init) { 2908 ExprResult Result 2909 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2910 Init); 2911 if (Result.isInvalid()) 2912 return ExprError(); 2913 2914 return Result; 2915 } 2916 2917 /// Build a new value-initialized expression. 2918 /// 2919 /// By default, builds the implicit value initialization without performing 2920 /// any semantic analysis. Subclasses may override this routine to provide 2921 /// different behavior. 2922 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2923 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2924 } 2925 2926 /// Build a new \c va_arg expression. 2927 /// 2928 /// By default, performs semantic analysis to build the new expression. 2929 /// Subclasses may override this routine to provide different behavior. 2930 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2931 Expr *SubExpr, TypeSourceInfo *TInfo, 2932 SourceLocation RParenLoc) { 2933 return getSema().BuildVAArgExpr(BuiltinLoc, 2934 SubExpr, TInfo, 2935 RParenLoc); 2936 } 2937 2938 /// Build a new expression list in parentheses. 2939 /// 2940 /// By default, performs semantic analysis to build the new expression. 2941 /// Subclasses may override this routine to provide different behavior. 2942 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2943 MultiExprArg SubExprs, 2944 SourceLocation RParenLoc) { 2945 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2946 } 2947 2948 /// Build a new address-of-label expression. 2949 /// 2950 /// By default, performs semantic analysis, using the name of the label 2951 /// rather than attempting to map the label statement itself. 2952 /// Subclasses may override this routine to provide different behavior. 2953 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2954 SourceLocation LabelLoc, LabelDecl *Label) { 2955 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2956 } 2957 2958 /// Build a new GNU statement 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 RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2963 SourceLocation RParenLoc, unsigned TemplateDepth) { 2964 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2965 TemplateDepth); 2966 } 2967 2968 /// Build a new __builtin_choose_expr expression. 2969 /// 2970 /// By default, performs semantic analysis to build the new expression. 2971 /// Subclasses may override this routine to provide different behavior. 2972 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2973 Expr *Cond, Expr *LHS, Expr *RHS, 2974 SourceLocation RParenLoc) { 2975 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2976 Cond, LHS, RHS, 2977 RParenLoc); 2978 } 2979 2980 /// Build a new generic selection expression. 2981 /// 2982 /// By default, performs semantic analysis to build the new expression. 2983 /// Subclasses may override this routine to provide different behavior. 2984 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2985 SourceLocation DefaultLoc, 2986 SourceLocation RParenLoc, 2987 Expr *ControllingExpr, 2988 ArrayRef<TypeSourceInfo *> Types, 2989 ArrayRef<Expr *> Exprs) { 2990 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2991 ControllingExpr, Types, Exprs); 2992 } 2993 2994 /// Build a new overloaded operator call expression. 2995 /// 2996 /// By default, performs semantic analysis to build the new expression. 2997 /// The semantic analysis provides the behavior of template instantiation, 2998 /// copying with transformations that turn what looks like an overloaded 2999 /// operator call into a use of a builtin operator, performing 3000 /// argument-dependent lookup, etc. Subclasses may override this routine to 3001 /// provide different behavior. 3002 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 3003 SourceLocation OpLoc, 3004 Expr *Callee, 3005 Expr *First, 3006 Expr *Second); 3007 3008 /// Build a new C++ "named" cast expression, such as static_cast or 3009 /// reinterpret_cast. 3010 /// 3011 /// By default, this routine dispatches to one of the more-specific routines 3012 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 3013 /// Subclasses may override this routine to provide different behavior. 3014 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 3015 Stmt::StmtClass Class, 3016 SourceLocation LAngleLoc, 3017 TypeSourceInfo *TInfo, 3018 SourceLocation RAngleLoc, 3019 SourceLocation LParenLoc, 3020 Expr *SubExpr, 3021 SourceLocation RParenLoc) { 3022 switch (Class) { 3023 case Stmt::CXXStaticCastExprClass: 3024 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 3025 RAngleLoc, LParenLoc, 3026 SubExpr, RParenLoc); 3027 3028 case Stmt::CXXDynamicCastExprClass: 3029 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 3030 RAngleLoc, LParenLoc, 3031 SubExpr, RParenLoc); 3032 3033 case Stmt::CXXReinterpretCastExprClass: 3034 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 3035 RAngleLoc, LParenLoc, 3036 SubExpr, 3037 RParenLoc); 3038 3039 case Stmt::CXXConstCastExprClass: 3040 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 3041 RAngleLoc, LParenLoc, 3042 SubExpr, RParenLoc); 3043 3044 case Stmt::CXXAddrspaceCastExprClass: 3045 return getDerived().RebuildCXXAddrspaceCastExpr( 3046 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 3047 3048 default: 3049 llvm_unreachable("Invalid C++ named cast"); 3050 } 3051 } 3052 3053 /// Build a new C++ static_cast expression. 3054 /// 3055 /// By default, performs semantic analysis to build the new expression. 3056 /// Subclasses may override this routine to provide different behavior. 3057 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 3058 SourceLocation LAngleLoc, 3059 TypeSourceInfo *TInfo, 3060 SourceLocation RAngleLoc, 3061 SourceLocation LParenLoc, 3062 Expr *SubExpr, 3063 SourceLocation RParenLoc) { 3064 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 3065 TInfo, SubExpr, 3066 SourceRange(LAngleLoc, RAngleLoc), 3067 SourceRange(LParenLoc, RParenLoc)); 3068 } 3069 3070 /// Build a new C++ dynamic_cast expression. 3071 /// 3072 /// By default, performs semantic analysis to build the new expression. 3073 /// Subclasses may override this routine to provide different behavior. 3074 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 3075 SourceLocation LAngleLoc, 3076 TypeSourceInfo *TInfo, 3077 SourceLocation RAngleLoc, 3078 SourceLocation LParenLoc, 3079 Expr *SubExpr, 3080 SourceLocation RParenLoc) { 3081 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 3082 TInfo, SubExpr, 3083 SourceRange(LAngleLoc, RAngleLoc), 3084 SourceRange(LParenLoc, RParenLoc)); 3085 } 3086 3087 /// Build a new C++ reinterpret_cast expression. 3088 /// 3089 /// By default, performs semantic analysis to build the new expression. 3090 /// Subclasses may override this routine to provide different behavior. 3091 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 3092 SourceLocation LAngleLoc, 3093 TypeSourceInfo *TInfo, 3094 SourceLocation RAngleLoc, 3095 SourceLocation LParenLoc, 3096 Expr *SubExpr, 3097 SourceLocation RParenLoc) { 3098 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 3099 TInfo, SubExpr, 3100 SourceRange(LAngleLoc, RAngleLoc), 3101 SourceRange(LParenLoc, RParenLoc)); 3102 } 3103 3104 /// Build a new C++ const_cast expression. 3105 /// 3106 /// By default, performs semantic analysis to build the new expression. 3107 /// Subclasses may override this routine to provide different behavior. 3108 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 3109 SourceLocation LAngleLoc, 3110 TypeSourceInfo *TInfo, 3111 SourceLocation RAngleLoc, 3112 SourceLocation LParenLoc, 3113 Expr *SubExpr, 3114 SourceLocation RParenLoc) { 3115 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3116 TInfo, SubExpr, 3117 SourceRange(LAngleLoc, RAngleLoc), 3118 SourceRange(LParenLoc, RParenLoc)); 3119 } 3120 3121 ExprResult 3122 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3123 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3124 SourceLocation LParenLoc, Expr *SubExpr, 3125 SourceLocation RParenLoc) { 3126 return getSema().BuildCXXNamedCast( 3127 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3128 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3129 } 3130 3131 /// Build a new C++ functional-style cast expression. 3132 /// 3133 /// By default, performs semantic analysis to build the new expression. 3134 /// Subclasses may override this routine to provide different behavior. 3135 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3136 SourceLocation LParenLoc, 3137 Expr *Sub, 3138 SourceLocation RParenLoc, 3139 bool ListInitialization) { 3140 // If Sub is a ParenListExpr, then Sub is the syntatic form of a 3141 // CXXParenListInitExpr. Pass its expanded arguments so that the 3142 // CXXParenListInitExpr can be rebuilt. 3143 if (auto *PLE = dyn_cast<ParenListExpr>(Sub)) 3144 return getSema().BuildCXXTypeConstructExpr( 3145 TInfo, LParenLoc, MultiExprArg(PLE->getExprs(), PLE->getNumExprs()), 3146 RParenLoc, ListInitialization); 3147 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3148 MultiExprArg(&Sub, 1), RParenLoc, 3149 ListInitialization); 3150 } 3151 3152 /// Build a new C++ __builtin_bit_cast expression. 3153 /// 3154 /// By default, performs semantic analysis to build the new expression. 3155 /// Subclasses may override this routine to provide different behavior. 3156 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3157 TypeSourceInfo *TSI, Expr *Sub, 3158 SourceLocation RParenLoc) { 3159 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3160 } 3161 3162 /// Build a new C++ typeid(type) 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 RebuildCXXTypeidExpr(QualType TypeInfoType, 3167 SourceLocation TypeidLoc, 3168 TypeSourceInfo *Operand, 3169 SourceLocation RParenLoc) { 3170 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3171 RParenLoc); 3172 } 3173 3174 3175 /// Build a new C++ typeid(expr) expression. 3176 /// 3177 /// By default, performs semantic analysis to build the new expression. 3178 /// Subclasses may override this routine to provide different behavior. 3179 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3180 SourceLocation TypeidLoc, 3181 Expr *Operand, 3182 SourceLocation RParenLoc) { 3183 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3184 RParenLoc); 3185 } 3186 3187 /// Build a new C++ __uuidof(type) expression. 3188 /// 3189 /// By default, performs semantic analysis to build the new expression. 3190 /// Subclasses may override this routine to provide different behavior. 3191 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3192 TypeSourceInfo *Operand, 3193 SourceLocation RParenLoc) { 3194 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3195 } 3196 3197 /// Build a new C++ __uuidof(expr) expression. 3198 /// 3199 /// By default, performs semantic analysis to build the new expression. 3200 /// Subclasses may override this routine to provide different behavior. 3201 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3202 Expr *Operand, SourceLocation RParenLoc) { 3203 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3204 } 3205 3206 /// Build a new C++ "this" expression. 3207 /// 3208 /// By default, builds a new "this" expression without performing any 3209 /// semantic analysis. Subclasses may override this routine to provide 3210 /// different behavior. 3211 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3212 QualType ThisType, 3213 bool isImplicit) { 3214 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3215 } 3216 3217 /// Build a new C++ throw expression. 3218 /// 3219 /// By default, performs semantic analysis to build the new expression. 3220 /// Subclasses may override this routine to provide different behavior. 3221 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3222 bool IsThrownVariableInScope) { 3223 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3224 } 3225 3226 /// Build a new C++ default-argument expression. 3227 /// 3228 /// By default, builds a new default-argument expression, which does not 3229 /// require any semantic analysis. Subclasses may override this routine to 3230 /// provide different behavior. 3231 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param, 3232 Expr *RewrittenExpr) { 3233 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3234 RewrittenExpr, getSema().CurContext); 3235 } 3236 3237 /// Build a new C++11 default-initialization expression. 3238 /// 3239 /// By default, builds a new default field initialization expression, which 3240 /// does not require any semantic analysis. Subclasses may override this 3241 /// routine to provide different behavior. 3242 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3243 FieldDecl *Field) { 3244 return getSema().BuildCXXDefaultInitExpr(Loc, Field); 3245 } 3246 3247 /// Build a new C++ zero-initialization expression. 3248 /// 3249 /// By default, performs semantic analysis to build the new expression. 3250 /// Subclasses may override this routine to provide different behavior. 3251 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3252 SourceLocation LParenLoc, 3253 SourceLocation RParenLoc) { 3254 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt, 3255 RParenLoc, 3256 /*ListInitialization=*/false); 3257 } 3258 3259 /// Build a new C++ "new" expression. 3260 /// 3261 /// By default, performs semantic analysis to build the new expression. 3262 /// Subclasses may override this routine to provide different behavior. 3263 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal, 3264 SourceLocation PlacementLParen, 3265 MultiExprArg PlacementArgs, 3266 SourceLocation PlacementRParen, 3267 SourceRange TypeIdParens, QualType AllocatedType, 3268 TypeSourceInfo *AllocatedTypeInfo, 3269 std::optional<Expr *> ArraySize, 3270 SourceRange DirectInitRange, Expr *Initializer) { 3271 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3272 PlacementLParen, 3273 PlacementArgs, 3274 PlacementRParen, 3275 TypeIdParens, 3276 AllocatedType, 3277 AllocatedTypeInfo, 3278 ArraySize, 3279 DirectInitRange, 3280 Initializer); 3281 } 3282 3283 /// Build a new C++ "delete" 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 RebuildCXXDeleteExpr(SourceLocation StartLoc, 3288 bool IsGlobalDelete, 3289 bool IsArrayForm, 3290 Expr *Operand) { 3291 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3292 Operand); 3293 } 3294 3295 /// Build a new type trait expression. 3296 /// 3297 /// By default, performs semantic analysis to build the new expression. 3298 /// Subclasses may override this routine to provide different behavior. 3299 ExprResult RebuildTypeTrait(TypeTrait Trait, 3300 SourceLocation StartLoc, 3301 ArrayRef<TypeSourceInfo *> Args, 3302 SourceLocation RParenLoc) { 3303 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3304 } 3305 3306 /// Build a new array type trait expression. 3307 /// 3308 /// By default, performs semantic analysis to build the new expression. 3309 /// Subclasses may override this routine to provide different behavior. 3310 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3311 SourceLocation StartLoc, 3312 TypeSourceInfo *TSInfo, 3313 Expr *DimExpr, 3314 SourceLocation RParenLoc) { 3315 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3316 } 3317 3318 /// Build a new expression trait 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 RebuildExpressionTrait(ExpressionTrait Trait, 3323 SourceLocation StartLoc, 3324 Expr *Queried, 3325 SourceLocation RParenLoc) { 3326 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3327 } 3328 3329 /// Build a new (previously unresolved) declaration reference 3330 /// expression. 3331 /// 3332 /// By default, performs semantic analysis to build the new expression. 3333 /// Subclasses may override this routine to provide different behavior. 3334 ExprResult RebuildDependentScopeDeclRefExpr( 3335 NestedNameSpecifierLoc QualifierLoc, 3336 SourceLocation TemplateKWLoc, 3337 const DeclarationNameInfo &NameInfo, 3338 const TemplateArgumentListInfo *TemplateArgs, 3339 bool IsAddressOfOperand, 3340 TypeSourceInfo **RecoveryTSI) { 3341 CXXScopeSpec SS; 3342 SS.Adopt(QualifierLoc); 3343 3344 if (TemplateArgs || TemplateKWLoc.isValid()) 3345 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3346 TemplateArgs); 3347 3348 return getSema().BuildQualifiedDeclarationNameExpr( 3349 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3350 } 3351 3352 /// Build a new template-id expression. 3353 /// 3354 /// By default, performs semantic analysis to build the new expression. 3355 /// Subclasses may override this routine to provide different behavior. 3356 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3357 SourceLocation TemplateKWLoc, 3358 LookupResult &R, 3359 bool RequiresADL, 3360 const TemplateArgumentListInfo *TemplateArgs) { 3361 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3362 TemplateArgs); 3363 } 3364 3365 /// Build a new object-construction expression. 3366 /// 3367 /// By default, performs semantic analysis to build the new expression. 3368 /// Subclasses may override this routine to provide different behavior. 3369 ExprResult RebuildCXXConstructExpr(QualType T, 3370 SourceLocation Loc, 3371 CXXConstructorDecl *Constructor, 3372 bool IsElidable, 3373 MultiExprArg Args, 3374 bool HadMultipleCandidates, 3375 bool ListInitialization, 3376 bool StdInitListInitialization, 3377 bool RequiresZeroInit, 3378 CXXConstructExpr::ConstructionKind ConstructKind, 3379 SourceRange ParenRange) { 3380 // Reconstruct the constructor we originally found, which might be 3381 // different if this is a call to an inherited constructor. 3382 CXXConstructorDecl *FoundCtor = Constructor; 3383 if (Constructor->isInheritingConstructor()) 3384 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3385 3386 SmallVector<Expr *, 8> ConvertedArgs; 3387 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3388 ConvertedArgs)) 3389 return ExprError(); 3390 3391 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3392 IsElidable, 3393 ConvertedArgs, 3394 HadMultipleCandidates, 3395 ListInitialization, 3396 StdInitListInitialization, 3397 RequiresZeroInit, ConstructKind, 3398 ParenRange); 3399 } 3400 3401 /// Build a new implicit construction via inherited constructor 3402 /// expression. 3403 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3404 CXXConstructorDecl *Constructor, 3405 bool ConstructsVBase, 3406 bool InheritedFromVBase) { 3407 return new (getSema().Context) CXXInheritedCtorInitExpr( 3408 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3409 } 3410 3411 /// Build a new object-construction expression. 3412 /// 3413 /// By default, performs semantic analysis to build the new expression. 3414 /// Subclasses may override this routine to provide different behavior. 3415 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3416 SourceLocation LParenOrBraceLoc, 3417 MultiExprArg Args, 3418 SourceLocation RParenOrBraceLoc, 3419 bool ListInitialization) { 3420 return getSema().BuildCXXTypeConstructExpr( 3421 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3422 } 3423 3424 /// Build a new object-construction expression. 3425 /// 3426 /// By default, performs semantic analysis to build the new expression. 3427 /// Subclasses may override this routine to provide different behavior. 3428 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3429 SourceLocation LParenLoc, 3430 MultiExprArg Args, 3431 SourceLocation RParenLoc, 3432 bool ListInitialization) { 3433 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3434 RParenLoc, ListInitialization); 3435 } 3436 3437 /// Build a new member reference expression. 3438 /// 3439 /// By default, performs semantic analysis to build the new expression. 3440 /// Subclasses may override this routine to provide different behavior. 3441 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3442 QualType BaseType, 3443 bool IsArrow, 3444 SourceLocation OperatorLoc, 3445 NestedNameSpecifierLoc QualifierLoc, 3446 SourceLocation TemplateKWLoc, 3447 NamedDecl *FirstQualifierInScope, 3448 const DeclarationNameInfo &MemberNameInfo, 3449 const TemplateArgumentListInfo *TemplateArgs) { 3450 CXXScopeSpec SS; 3451 SS.Adopt(QualifierLoc); 3452 3453 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3454 OperatorLoc, IsArrow, 3455 SS, TemplateKWLoc, 3456 FirstQualifierInScope, 3457 MemberNameInfo, 3458 TemplateArgs, /*S*/nullptr); 3459 } 3460 3461 /// Build a new member reference expression. 3462 /// 3463 /// By default, performs semantic analysis to build the new expression. 3464 /// Subclasses may override this routine to provide different behavior. 3465 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3466 SourceLocation OperatorLoc, 3467 bool IsArrow, 3468 NestedNameSpecifierLoc QualifierLoc, 3469 SourceLocation TemplateKWLoc, 3470 NamedDecl *FirstQualifierInScope, 3471 LookupResult &R, 3472 const TemplateArgumentListInfo *TemplateArgs) { 3473 CXXScopeSpec SS; 3474 SS.Adopt(QualifierLoc); 3475 3476 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3477 OperatorLoc, IsArrow, 3478 SS, TemplateKWLoc, 3479 FirstQualifierInScope, 3480 R, TemplateArgs, /*S*/nullptr); 3481 } 3482 3483 /// Build a new noexcept expression. 3484 /// 3485 /// By default, performs semantic analysis to build the new expression. 3486 /// Subclasses may override this routine to provide different behavior. 3487 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3488 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3489 } 3490 3491 /// Build a new expression to compute the length of a parameter pack. 3492 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 3493 SourceLocation PackLoc, 3494 SourceLocation RParenLoc, 3495 std::optional<unsigned> Length, 3496 ArrayRef<TemplateArgument> PartialArgs) { 3497 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3498 RParenLoc, Length, PartialArgs); 3499 } 3500 3501 /// Build a new expression representing a call to a source location 3502 /// builtin. 3503 /// 3504 /// By default, performs semantic analysis to build the new expression. 3505 /// Subclasses may override this routine to provide different behavior. 3506 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3507 QualType ResultTy, SourceLocation BuiltinLoc, 3508 SourceLocation RPLoc, 3509 DeclContext *ParentContext) { 3510 return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, 3511 ParentContext); 3512 } 3513 3514 /// Build a new Objective-C boxed expression. 3515 /// 3516 /// By default, performs semantic analysis to build the new expression. 3517 /// Subclasses may override this routine to provide different behavior. 3518 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3519 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3520 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3521 TemplateArgumentListInfo *TALI) { 3522 CXXScopeSpec SS; 3523 SS.Adopt(NNS); 3524 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3525 ConceptNameInfo, 3526 FoundDecl, 3527 NamedConcept, TALI); 3528 if (Result.isInvalid()) 3529 return ExprError(); 3530 return Result; 3531 } 3532 3533 /// \brief Build a new requires expression. 3534 /// 3535 /// By default, performs semantic analysis to build the new expression. 3536 /// Subclasses may override this routine to provide different behavior. 3537 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3538 RequiresExprBodyDecl *Body, 3539 ArrayRef<ParmVarDecl *> LocalParameters, 3540 ArrayRef<concepts::Requirement *> Requirements, 3541 SourceLocation ClosingBraceLoc) { 3542 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3543 LocalParameters, Requirements, ClosingBraceLoc); 3544 } 3545 3546 concepts::TypeRequirement * 3547 RebuildTypeRequirement( 3548 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3549 return SemaRef.BuildTypeRequirement(SubstDiag); 3550 } 3551 3552 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3553 return SemaRef.BuildTypeRequirement(T); 3554 } 3555 3556 concepts::ExprRequirement * 3557 RebuildExprRequirement( 3558 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3559 SourceLocation NoexceptLoc, 3560 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3561 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3562 std::move(Ret)); 3563 } 3564 3565 concepts::ExprRequirement * 3566 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3567 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3568 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3569 std::move(Ret)); 3570 } 3571 3572 concepts::NestedRequirement * 3573 RebuildNestedRequirement(StringRef InvalidConstraintEntity, 3574 const ASTConstraintSatisfaction &Satisfaction) { 3575 return SemaRef.BuildNestedRequirement(InvalidConstraintEntity, 3576 Satisfaction); 3577 } 3578 3579 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3580 return SemaRef.BuildNestedRequirement(Constraint); 3581 } 3582 3583 /// \brief Build a new Objective-C boxed expression. 3584 /// 3585 /// By default, performs semantic analysis to build the new expression. 3586 /// Subclasses may override this routine to provide different behavior. 3587 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3588 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3589 } 3590 3591 /// Build a new Objective-C array literal. 3592 /// 3593 /// By default, performs semantic analysis to build the new expression. 3594 /// Subclasses may override this routine to provide different behavior. 3595 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3596 Expr **Elements, unsigned NumElements) { 3597 return getSema().BuildObjCArrayLiteral(Range, 3598 MultiExprArg(Elements, NumElements)); 3599 } 3600 3601 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3602 Expr *Base, Expr *Key, 3603 ObjCMethodDecl *getterMethod, 3604 ObjCMethodDecl *setterMethod) { 3605 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3606 getterMethod, setterMethod); 3607 } 3608 3609 /// Build a new Objective-C dictionary literal. 3610 /// 3611 /// By default, performs semantic analysis to build the new expression. 3612 /// Subclasses may override this routine to provide different behavior. 3613 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3614 MutableArrayRef<ObjCDictionaryElement> Elements) { 3615 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3616 } 3617 3618 /// Build a new Objective-C \@encode expression. 3619 /// 3620 /// By default, performs semantic analysis to build the new expression. 3621 /// Subclasses may override this routine to provide different behavior. 3622 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3623 TypeSourceInfo *EncodeTypeInfo, 3624 SourceLocation RParenLoc) { 3625 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3626 } 3627 3628 /// Build a new Objective-C class message. 3629 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3630 Selector Sel, 3631 ArrayRef<SourceLocation> SelectorLocs, 3632 ObjCMethodDecl *Method, 3633 SourceLocation LBracLoc, 3634 MultiExprArg Args, 3635 SourceLocation RBracLoc) { 3636 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3637 ReceiverTypeInfo->getType(), 3638 /*SuperLoc=*/SourceLocation(), 3639 Sel, Method, LBracLoc, SelectorLocs, 3640 RBracLoc, Args); 3641 } 3642 3643 /// Build a new Objective-C instance message. 3644 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3645 Selector Sel, 3646 ArrayRef<SourceLocation> SelectorLocs, 3647 ObjCMethodDecl *Method, 3648 SourceLocation LBracLoc, 3649 MultiExprArg Args, 3650 SourceLocation RBracLoc) { 3651 return SemaRef.BuildInstanceMessage(Receiver, 3652 Receiver->getType(), 3653 /*SuperLoc=*/SourceLocation(), 3654 Sel, Method, LBracLoc, SelectorLocs, 3655 RBracLoc, Args); 3656 } 3657 3658 /// Build a new Objective-C instance/class message to 'super'. 3659 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3660 Selector Sel, 3661 ArrayRef<SourceLocation> SelectorLocs, 3662 QualType SuperType, 3663 ObjCMethodDecl *Method, 3664 SourceLocation LBracLoc, 3665 MultiExprArg Args, 3666 SourceLocation RBracLoc) { 3667 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3668 SuperType, 3669 SuperLoc, 3670 Sel, Method, LBracLoc, SelectorLocs, 3671 RBracLoc, Args) 3672 : SemaRef.BuildClassMessage(nullptr, 3673 SuperType, 3674 SuperLoc, 3675 Sel, Method, LBracLoc, SelectorLocs, 3676 RBracLoc, Args); 3677 3678 3679 } 3680 3681 /// Build a new Objective-C ivar reference expression. 3682 /// 3683 /// By default, performs semantic analysis to build the new expression. 3684 /// Subclasses may override this routine to provide different behavior. 3685 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3686 SourceLocation IvarLoc, 3687 bool IsArrow, bool IsFreeIvar) { 3688 CXXScopeSpec SS; 3689 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3690 ExprResult Result = getSema().BuildMemberReferenceExpr( 3691 BaseArg, BaseArg->getType(), 3692 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3693 /*FirstQualifierInScope=*/nullptr, NameInfo, 3694 /*TemplateArgs=*/nullptr, 3695 /*S=*/nullptr); 3696 if (IsFreeIvar && Result.isUsable()) 3697 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3698 return Result; 3699 } 3700 3701 /// Build a new Objective-C property reference expression. 3702 /// 3703 /// By default, performs semantic analysis to build the new expression. 3704 /// Subclasses may override this routine to provide different behavior. 3705 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3706 ObjCPropertyDecl *Property, 3707 SourceLocation PropertyLoc) { 3708 CXXScopeSpec SS; 3709 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3710 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3711 /*FIXME:*/PropertyLoc, 3712 /*IsArrow=*/false, 3713 SS, SourceLocation(), 3714 /*FirstQualifierInScope=*/nullptr, 3715 NameInfo, 3716 /*TemplateArgs=*/nullptr, 3717 /*S=*/nullptr); 3718 } 3719 3720 /// Build a new Objective-C property reference expression. 3721 /// 3722 /// By default, performs semantic analysis to build the new expression. 3723 /// Subclasses may override this routine to provide different behavior. 3724 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3725 ObjCMethodDecl *Getter, 3726 ObjCMethodDecl *Setter, 3727 SourceLocation PropertyLoc) { 3728 // Since these expressions can only be value-dependent, we do not 3729 // need to perform semantic analysis again. 3730 return Owned( 3731 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3732 VK_LValue, OK_ObjCProperty, 3733 PropertyLoc, Base)); 3734 } 3735 3736 /// Build a new Objective-C "isa" expression. 3737 /// 3738 /// By default, performs semantic analysis to build the new expression. 3739 /// Subclasses may override this routine to provide different behavior. 3740 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3741 SourceLocation OpLoc, bool IsArrow) { 3742 CXXScopeSpec SS; 3743 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3744 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3745 OpLoc, IsArrow, 3746 SS, SourceLocation(), 3747 /*FirstQualifierInScope=*/nullptr, 3748 NameInfo, 3749 /*TemplateArgs=*/nullptr, 3750 /*S=*/nullptr); 3751 } 3752 3753 /// Build a new shuffle vector expression. 3754 /// 3755 /// By default, performs semantic analysis to build the new expression. 3756 /// Subclasses may override this routine to provide different behavior. 3757 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3758 MultiExprArg SubExprs, 3759 SourceLocation RParenLoc) { 3760 // Find the declaration for __builtin_shufflevector 3761 const IdentifierInfo &Name 3762 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3763 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3764 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3765 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3766 3767 // Build a reference to the __builtin_shufflevector builtin 3768 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3769 Expr *Callee = new (SemaRef.Context) 3770 DeclRefExpr(SemaRef.Context, Builtin, false, 3771 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3772 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3773 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3774 CK_BuiltinFnToFnPtr).get(); 3775 3776 // Build the CallExpr 3777 ExprResult TheCall = CallExpr::Create( 3778 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3779 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3780 FPOptionsOverride()); 3781 3782 // Type-check the __builtin_shufflevector expression. 3783 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3784 } 3785 3786 /// Build a new convert vector expression. 3787 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3788 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3789 SourceLocation RParenLoc) { 3790 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3791 BuiltinLoc, RParenLoc); 3792 } 3793 3794 /// Build a new template argument pack expansion. 3795 /// 3796 /// By default, performs semantic analysis to build a new pack expansion 3797 /// for a template argument. Subclasses may override this routine to provide 3798 /// different behavior. 3799 TemplateArgumentLoc 3800 RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc, 3801 std::optional<unsigned> NumExpansions) { 3802 switch (Pattern.getArgument().getKind()) { 3803 case TemplateArgument::Expression: { 3804 ExprResult Result 3805 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3806 EllipsisLoc, NumExpansions); 3807 if (Result.isInvalid()) 3808 return TemplateArgumentLoc(); 3809 3810 return TemplateArgumentLoc(Result.get(), Result.get()); 3811 } 3812 3813 case TemplateArgument::Template: 3814 return TemplateArgumentLoc( 3815 SemaRef.Context, 3816 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3817 NumExpansions), 3818 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3819 EllipsisLoc); 3820 3821 case TemplateArgument::Null: 3822 case TemplateArgument::Integral: 3823 case TemplateArgument::Declaration: 3824 case TemplateArgument::Pack: 3825 case TemplateArgument::TemplateExpansion: 3826 case TemplateArgument::NullPtr: 3827 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3828 3829 case TemplateArgument::Type: 3830 if (TypeSourceInfo *Expansion 3831 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3832 EllipsisLoc, 3833 NumExpansions)) 3834 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3835 Expansion); 3836 break; 3837 } 3838 3839 return TemplateArgumentLoc(); 3840 } 3841 3842 /// Build a new expression pack expansion. 3843 /// 3844 /// By default, performs semantic analysis to build a new pack expansion 3845 /// for an expression. Subclasses may override this routine to provide 3846 /// different behavior. 3847 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3848 std::optional<unsigned> NumExpansions) { 3849 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3850 } 3851 3852 /// Build a new C++1z fold-expression. 3853 /// 3854 /// By default, performs semantic analysis in order to build a new fold 3855 /// expression. 3856 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3857 SourceLocation LParenLoc, Expr *LHS, 3858 BinaryOperatorKind Operator, 3859 SourceLocation EllipsisLoc, Expr *RHS, 3860 SourceLocation RParenLoc, 3861 std::optional<unsigned> NumExpansions) { 3862 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3863 EllipsisLoc, RHS, RParenLoc, 3864 NumExpansions); 3865 } 3866 3867 /// Build an empty C++1z fold-expression with the given operator. 3868 /// 3869 /// By default, produces the fallback value for the fold-expression, or 3870 /// produce an error if there is no fallback value. 3871 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3872 BinaryOperatorKind Operator) { 3873 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3874 } 3875 3876 /// Build a new atomic operation expression. 3877 /// 3878 /// By default, performs semantic analysis to build the new expression. 3879 /// Subclasses may override this routine to provide different behavior. 3880 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3881 AtomicExpr::AtomicOp Op, 3882 SourceLocation RParenLoc) { 3883 // Use this for all of the locations, since we don't know the difference 3884 // between the call and the expr at this point. 3885 SourceRange Range{BuiltinLoc, RParenLoc}; 3886 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3887 Sema::AtomicArgumentOrder::AST); 3888 } 3889 3890 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3891 ArrayRef<Expr *> SubExprs, QualType Type) { 3892 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3893 } 3894 3895 private: 3896 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3897 QualType ObjectType, 3898 NamedDecl *FirstQualifierInScope, 3899 CXXScopeSpec &SS); 3900 3901 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3902 QualType ObjectType, 3903 NamedDecl *FirstQualifierInScope, 3904 CXXScopeSpec &SS); 3905 3906 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3907 NamedDecl *FirstQualifierInScope, 3908 CXXScopeSpec &SS); 3909 3910 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3911 DependentNameTypeLoc TL, 3912 bool DeducibleTSTContext); 3913 }; 3914 3915 template <typename Derived> 3916 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3917 if (!S) 3918 return S; 3919 3920 switch (S->getStmtClass()) { 3921 case Stmt::NoStmtClass: break; 3922 3923 // Transform individual statement nodes 3924 // Pass SDK into statements that can produce a value 3925 #define STMT(Node, Parent) \ 3926 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3927 #define VALUESTMT(Node, Parent) \ 3928 case Stmt::Node##Class: \ 3929 return getDerived().Transform##Node(cast<Node>(S), SDK); 3930 #define ABSTRACT_STMT(Node) 3931 #define EXPR(Node, Parent) 3932 #include "clang/AST/StmtNodes.inc" 3933 3934 // Transform expressions by calling TransformExpr. 3935 #define STMT(Node, Parent) 3936 #define ABSTRACT_STMT(Stmt) 3937 #define EXPR(Node, Parent) case Stmt::Node##Class: 3938 #include "clang/AST/StmtNodes.inc" 3939 { 3940 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3941 3942 if (SDK == SDK_StmtExprResult) 3943 E = getSema().ActOnStmtExprResult(E); 3944 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3945 } 3946 } 3947 3948 return S; 3949 } 3950 3951 template<typename Derived> 3952 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3953 if (!S) 3954 return S; 3955 3956 switch (S->getClauseKind()) { 3957 default: break; 3958 // Transform individual clause nodes 3959 #define GEN_CLANG_CLAUSE_CLASS 3960 #define CLAUSE_CLASS(Enum, Str, Class) \ 3961 case Enum: \ 3962 return getDerived().Transform##Class(cast<Class>(S)); 3963 #include "llvm/Frontend/OpenMP/OMP.inc" 3964 } 3965 3966 return S; 3967 } 3968 3969 3970 template<typename Derived> 3971 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3972 if (!E) 3973 return E; 3974 3975 switch (E->getStmtClass()) { 3976 case Stmt::NoStmtClass: break; 3977 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3978 #define ABSTRACT_STMT(Stmt) 3979 #define EXPR(Node, Parent) \ 3980 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3981 #include "clang/AST/StmtNodes.inc" 3982 } 3983 3984 return E; 3985 } 3986 3987 template<typename Derived> 3988 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3989 bool NotCopyInit) { 3990 // Initializers are instantiated like expressions, except that various outer 3991 // layers are stripped. 3992 if (!Init) 3993 return Init; 3994 3995 if (auto *FE = dyn_cast<FullExpr>(Init)) 3996 Init = FE->getSubExpr(); 3997 3998 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3999 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 4000 Init = OVE->getSourceExpr(); 4001 } 4002 4003 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 4004 Init = MTE->getSubExpr(); 4005 4006 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 4007 Init = Binder->getSubExpr(); 4008 4009 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 4010 Init = ICE->getSubExprAsWritten(); 4011 4012 if (CXXStdInitializerListExpr *ILE = 4013 dyn_cast<CXXStdInitializerListExpr>(Init)) 4014 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 4015 4016 // If this is copy-initialization, we only need to reconstruct 4017 // InitListExprs. Other forms of copy-initialization will be a no-op if 4018 // the initializer is already the right type. 4019 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 4020 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 4021 return getDerived().TransformExpr(Init); 4022 4023 // Revert value-initialization back to empty parens. 4024 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 4025 SourceRange Parens = VIE->getSourceRange(); 4026 return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt, 4027 Parens.getEnd()); 4028 } 4029 4030 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 4031 if (isa<ImplicitValueInitExpr>(Init)) 4032 return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt, 4033 SourceLocation()); 4034 4035 // Revert initialization by constructor back to a parenthesized or braced list 4036 // of expressions. Any other form of initializer can just be reused directly. 4037 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 4038 return getDerived().TransformExpr(Init); 4039 4040 // If the initialization implicitly converted an initializer list to a 4041 // std::initializer_list object, unwrap the std::initializer_list too. 4042 if (Construct && Construct->isStdInitListInitialization()) 4043 return TransformInitializer(Construct->getArg(0), NotCopyInit); 4044 4045 // Enter a list-init context if this was list initialization. 4046 EnterExpressionEvaluationContext Context( 4047 getSema(), EnterExpressionEvaluationContext::InitList, 4048 Construct->isListInitialization()); 4049 4050 SmallVector<Expr*, 8> NewArgs; 4051 bool ArgChanged = false; 4052 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 4053 /*IsCall*/true, NewArgs, &ArgChanged)) 4054 return ExprError(); 4055 4056 // If this was list initialization, revert to syntactic list form. 4057 if (Construct->isListInitialization()) 4058 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 4059 Construct->getEndLoc()); 4060 4061 // Build a ParenListExpr to represent anything else. 4062 SourceRange Parens = Construct->getParenOrBraceRange(); 4063 if (Parens.isInvalid()) { 4064 // This was a variable declaration's initialization for which no initializer 4065 // was specified. 4066 assert(NewArgs.empty() && 4067 "no parens or braces but have direct init with arguments?"); 4068 return ExprEmpty(); 4069 } 4070 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 4071 Parens.getEnd()); 4072 } 4073 4074 template<typename Derived> 4075 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 4076 unsigned NumInputs, 4077 bool IsCall, 4078 SmallVectorImpl<Expr *> &Outputs, 4079 bool *ArgChanged) { 4080 for (unsigned I = 0; I != NumInputs; ++I) { 4081 // If requested, drop call arguments that need to be dropped. 4082 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 4083 if (ArgChanged) 4084 *ArgChanged = true; 4085 4086 break; 4087 } 4088 4089 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 4090 Expr *Pattern = Expansion->getPattern(); 4091 4092 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4093 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4094 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4095 4096 // Determine whether the set of unexpanded parameter packs can and should 4097 // be expanded. 4098 bool Expand = true; 4099 bool RetainExpansion = false; 4100 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 4101 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4102 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 4103 Pattern->getSourceRange(), 4104 Unexpanded, 4105 Expand, RetainExpansion, 4106 NumExpansions)) 4107 return true; 4108 4109 if (!Expand) { 4110 // The transform has determined that we should perform a simple 4111 // transformation on the pack expansion, producing another pack 4112 // expansion. 4113 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4114 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 4115 if (OutPattern.isInvalid()) 4116 return true; 4117 4118 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4119 Expansion->getEllipsisLoc(), 4120 NumExpansions); 4121 if (Out.isInvalid()) 4122 return true; 4123 4124 if (ArgChanged) 4125 *ArgChanged = true; 4126 Outputs.push_back(Out.get()); 4127 continue; 4128 } 4129 4130 // Record right away that the argument was changed. This needs 4131 // to happen even if the array expands to nothing. 4132 if (ArgChanged) *ArgChanged = true; 4133 4134 // The transform has determined that we should perform an elementwise 4135 // expansion of the pattern. Do so. 4136 for (unsigned I = 0; I != *NumExpansions; ++I) { 4137 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4138 ExprResult Out = getDerived().TransformExpr(Pattern); 4139 if (Out.isInvalid()) 4140 return true; 4141 4142 if (Out.get()->containsUnexpandedParameterPack()) { 4143 Out = getDerived().RebuildPackExpansion( 4144 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4145 if (Out.isInvalid()) 4146 return true; 4147 } 4148 4149 Outputs.push_back(Out.get()); 4150 } 4151 4152 // If we're supposed to retain a pack expansion, do so by temporarily 4153 // forgetting the partially-substituted parameter pack. 4154 if (RetainExpansion) { 4155 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4156 4157 ExprResult Out = getDerived().TransformExpr(Pattern); 4158 if (Out.isInvalid()) 4159 return true; 4160 4161 Out = getDerived().RebuildPackExpansion( 4162 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4163 if (Out.isInvalid()) 4164 return true; 4165 4166 Outputs.push_back(Out.get()); 4167 } 4168 4169 continue; 4170 } 4171 4172 ExprResult Result = 4173 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4174 : getDerived().TransformExpr(Inputs[I]); 4175 if (Result.isInvalid()) 4176 return true; 4177 4178 if (Result.get() != Inputs[I] && ArgChanged) 4179 *ArgChanged = true; 4180 4181 Outputs.push_back(Result.get()); 4182 } 4183 4184 return false; 4185 } 4186 4187 template <typename Derived> 4188 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4189 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4190 if (Var) { 4191 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4192 getDerived().TransformDefinition(Var->getLocation(), Var)); 4193 4194 if (!ConditionVar) 4195 return Sema::ConditionError(); 4196 4197 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4198 } 4199 4200 if (Expr) { 4201 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4202 4203 if (CondExpr.isInvalid()) 4204 return Sema::ConditionError(); 4205 4206 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4207 /*MissingOK=*/true); 4208 } 4209 4210 return Sema::ConditionResult(); 4211 } 4212 4213 template <typename Derived> 4214 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4215 NestedNameSpecifierLoc NNS, QualType ObjectType, 4216 NamedDecl *FirstQualifierInScope) { 4217 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4218 4219 auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) { 4220 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4221 Qualifier = Qualifier.getPrefix()) 4222 Qualifiers.push_back(Qualifier); 4223 }; 4224 insertNNS(NNS); 4225 4226 CXXScopeSpec SS; 4227 while (!Qualifiers.empty()) { 4228 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4229 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4230 4231 switch (QNNS->getKind()) { 4232 case NestedNameSpecifier::Identifier: { 4233 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4234 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4235 ObjectType); 4236 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4237 SS, FirstQualifierInScope, false)) 4238 return NestedNameSpecifierLoc(); 4239 break; 4240 } 4241 4242 case NestedNameSpecifier::Namespace: { 4243 NamespaceDecl *NS = 4244 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4245 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4246 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4247 break; 4248 } 4249 4250 case NestedNameSpecifier::NamespaceAlias: { 4251 NamespaceAliasDecl *Alias = 4252 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4253 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4254 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4255 Q.getLocalEndLoc()); 4256 break; 4257 } 4258 4259 case NestedNameSpecifier::Global: 4260 // There is no meaningful transformation that one could perform on the 4261 // global scope. 4262 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4263 break; 4264 4265 case NestedNameSpecifier::Super: { 4266 CXXRecordDecl *RD = 4267 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4268 SourceLocation(), QNNS->getAsRecordDecl())); 4269 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4270 break; 4271 } 4272 4273 case NestedNameSpecifier::TypeSpecWithTemplate: 4274 case NestedNameSpecifier::TypeSpec: { 4275 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4276 FirstQualifierInScope, SS); 4277 4278 if (!TL) 4279 return NestedNameSpecifierLoc(); 4280 4281 QualType T = TL.getType(); 4282 if (T->isDependentType() || T->isRecordType() || 4283 (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) { 4284 if (T->isEnumeralType()) 4285 SemaRef.Diag(TL.getBeginLoc(), 4286 diag::warn_cxx98_compat_enum_nested_name_spec); 4287 4288 if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) { 4289 SS.Adopt(ETL.getQualifierLoc()); 4290 TL = ETL.getNamedTypeLoc(); 4291 } 4292 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4293 Q.getLocalEndLoc()); 4294 break; 4295 } 4296 // If the nested-name-specifier is an invalid type def, don't emit an 4297 // error because a previous error should have already been emitted. 4298 TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>(); 4299 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4300 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4301 << T << SS.getRange(); 4302 } 4303 return NestedNameSpecifierLoc(); 4304 } 4305 } 4306 4307 // The qualifier-in-scope and object type only apply to the leftmost entity. 4308 FirstQualifierInScope = nullptr; 4309 ObjectType = QualType(); 4310 } 4311 4312 // Don't rebuild the nested-name-specifier if we don't have to. 4313 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4314 !getDerived().AlwaysRebuild()) 4315 return NNS; 4316 4317 // If we can re-use the source-location data from the original 4318 // nested-name-specifier, do so. 4319 if (SS.location_size() == NNS.getDataLength() && 4320 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4321 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4322 4323 // Allocate new nested-name-specifier location information. 4324 return SS.getWithLocInContext(SemaRef.Context); 4325 } 4326 4327 template<typename Derived> 4328 DeclarationNameInfo 4329 TreeTransform<Derived> 4330 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4331 DeclarationName Name = NameInfo.getName(); 4332 if (!Name) 4333 return DeclarationNameInfo(); 4334 4335 switch (Name.getNameKind()) { 4336 case DeclarationName::Identifier: 4337 case DeclarationName::ObjCZeroArgSelector: 4338 case DeclarationName::ObjCOneArgSelector: 4339 case DeclarationName::ObjCMultiArgSelector: 4340 case DeclarationName::CXXOperatorName: 4341 case DeclarationName::CXXLiteralOperatorName: 4342 case DeclarationName::CXXUsingDirective: 4343 return NameInfo; 4344 4345 case DeclarationName::CXXDeductionGuideName: { 4346 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4347 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4348 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4349 if (!NewTemplate) 4350 return DeclarationNameInfo(); 4351 4352 DeclarationNameInfo NewNameInfo(NameInfo); 4353 NewNameInfo.setName( 4354 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4355 return NewNameInfo; 4356 } 4357 4358 case DeclarationName::CXXConstructorName: 4359 case DeclarationName::CXXDestructorName: 4360 case DeclarationName::CXXConversionFunctionName: { 4361 TypeSourceInfo *NewTInfo; 4362 CanQualType NewCanTy; 4363 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4364 NewTInfo = getDerived().TransformType(OldTInfo); 4365 if (!NewTInfo) 4366 return DeclarationNameInfo(); 4367 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4368 } 4369 else { 4370 NewTInfo = nullptr; 4371 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4372 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4373 if (NewT.isNull()) 4374 return DeclarationNameInfo(); 4375 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4376 } 4377 4378 DeclarationName NewName 4379 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4380 NewCanTy); 4381 DeclarationNameInfo NewNameInfo(NameInfo); 4382 NewNameInfo.setName(NewName); 4383 NewNameInfo.setNamedTypeInfo(NewTInfo); 4384 return NewNameInfo; 4385 } 4386 } 4387 4388 llvm_unreachable("Unknown name kind."); 4389 } 4390 4391 template<typename Derived> 4392 TemplateName 4393 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4394 TemplateName Name, 4395 SourceLocation NameLoc, 4396 QualType ObjectType, 4397 NamedDecl *FirstQualifierInScope, 4398 bool AllowInjectedClassName) { 4399 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4400 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl(); 4401 assert(Template && "qualified template name must refer to a template"); 4402 4403 TemplateDecl *TransTemplate 4404 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4405 Template)); 4406 if (!TransTemplate) 4407 return TemplateName(); 4408 4409 if (!getDerived().AlwaysRebuild() && 4410 SS.getScopeRep() == QTN->getQualifier() && 4411 TransTemplate == Template) 4412 return Name; 4413 4414 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4415 TransTemplate); 4416 } 4417 4418 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4419 if (SS.getScopeRep()) { 4420 // These apply to the scope specifier, not the template. 4421 ObjectType = QualType(); 4422 FirstQualifierInScope = nullptr; 4423 } 4424 4425 if (!getDerived().AlwaysRebuild() && 4426 SS.getScopeRep() == DTN->getQualifier() && 4427 ObjectType.isNull()) 4428 return Name; 4429 4430 // FIXME: Preserve the location of the "template" keyword. 4431 SourceLocation TemplateKWLoc = NameLoc; 4432 4433 if (DTN->isIdentifier()) { 4434 return getDerived().RebuildTemplateName(SS, 4435 TemplateKWLoc, 4436 *DTN->getIdentifier(), 4437 NameLoc, 4438 ObjectType, 4439 FirstQualifierInScope, 4440 AllowInjectedClassName); 4441 } 4442 4443 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4444 DTN->getOperator(), NameLoc, 4445 ObjectType, AllowInjectedClassName); 4446 } 4447 4448 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4449 TemplateDecl *TransTemplate 4450 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4451 Template)); 4452 if (!TransTemplate) 4453 return TemplateName(); 4454 4455 if (!getDerived().AlwaysRebuild() && 4456 TransTemplate == Template) 4457 return Name; 4458 4459 return TemplateName(TransTemplate); 4460 } 4461 4462 if (SubstTemplateTemplateParmPackStorage *SubstPack 4463 = Name.getAsSubstTemplateTemplateParmPack()) { 4464 return getDerived().RebuildTemplateName( 4465 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(), 4466 SubstPack->getIndex(), SubstPack->getFinal()); 4467 } 4468 4469 // These should be getting filtered out before they reach the AST. 4470 llvm_unreachable("overloaded function decl survived to here"); 4471 } 4472 4473 template<typename Derived> 4474 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4475 const TemplateArgument &Arg, 4476 TemplateArgumentLoc &Output) { 4477 Output = getSema().getTrivialTemplateArgumentLoc( 4478 Arg, QualType(), getDerived().getBaseLocation()); 4479 } 4480 4481 template <typename Derived> 4482 bool TreeTransform<Derived>::TransformTemplateArgument( 4483 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4484 bool Uneval) { 4485 const TemplateArgument &Arg = Input.getArgument(); 4486 switch (Arg.getKind()) { 4487 case TemplateArgument::Null: 4488 case TemplateArgument::Pack: 4489 llvm_unreachable("Unexpected TemplateArgument"); 4490 4491 case TemplateArgument::Integral: 4492 case TemplateArgument::NullPtr: 4493 case TemplateArgument::Declaration: { 4494 // Transform a resolved template argument straight to a resolved template 4495 // argument. We get here when substituting into an already-substituted 4496 // template type argument during concept satisfaction checking. 4497 QualType T = Arg.getNonTypeTemplateArgumentType(); 4498 QualType NewT = getDerived().TransformType(T); 4499 if (NewT.isNull()) 4500 return true; 4501 4502 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4503 ? Arg.getAsDecl() 4504 : nullptr; 4505 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4506 getDerived().getBaseLocation(), D)) 4507 : nullptr; 4508 if (D && !NewD) 4509 return true; 4510 4511 if (NewT == T && D == NewD) 4512 Output = Input; 4513 else if (Arg.getKind() == TemplateArgument::Integral) 4514 Output = TemplateArgumentLoc( 4515 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4516 TemplateArgumentLocInfo()); 4517 else if (Arg.getKind() == TemplateArgument::NullPtr) 4518 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4519 TemplateArgumentLocInfo()); 4520 else 4521 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4522 TemplateArgumentLocInfo()); 4523 4524 return false; 4525 } 4526 4527 case TemplateArgument::Type: { 4528 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4529 if (!DI) 4530 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4531 4532 DI = getDerived().TransformType(DI); 4533 if (!DI) 4534 return true; 4535 4536 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4537 return false; 4538 } 4539 4540 case TemplateArgument::Template: { 4541 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4542 if (QualifierLoc) { 4543 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4544 if (!QualifierLoc) 4545 return true; 4546 } 4547 4548 CXXScopeSpec SS; 4549 SS.Adopt(QualifierLoc); 4550 TemplateName Template = getDerived().TransformTemplateName( 4551 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4552 if (Template.isNull()) 4553 return true; 4554 4555 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4556 QualifierLoc, Input.getTemplateNameLoc()); 4557 return false; 4558 } 4559 4560 case TemplateArgument::TemplateExpansion: 4561 llvm_unreachable("Caller should expand pack expansions"); 4562 4563 case TemplateArgument::Expression: { 4564 // Template argument expressions are constant expressions. 4565 EnterExpressionEvaluationContext Unevaluated( 4566 getSema(), 4567 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4568 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4569 Sema::ReuseLambdaContextDecl, /*ExprContext=*/ 4570 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4571 4572 Expr *InputExpr = Input.getSourceExpression(); 4573 if (!InputExpr) 4574 InputExpr = Input.getArgument().getAsExpr(); 4575 4576 ExprResult E = getDerived().TransformExpr(InputExpr); 4577 E = SemaRef.ActOnConstantExpression(E); 4578 if (E.isInvalid()) 4579 return true; 4580 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4581 return false; 4582 } 4583 } 4584 4585 // Work around bogus GCC warning 4586 return true; 4587 } 4588 4589 /// Iterator adaptor that invents template argument location information 4590 /// for each of the template arguments in its underlying iterator. 4591 template<typename Derived, typename InputIterator> 4592 class TemplateArgumentLocInventIterator { 4593 TreeTransform<Derived> &Self; 4594 InputIterator Iter; 4595 4596 public: 4597 typedef TemplateArgumentLoc value_type; 4598 typedef TemplateArgumentLoc reference; 4599 typedef typename std::iterator_traits<InputIterator>::difference_type 4600 difference_type; 4601 typedef std::input_iterator_tag iterator_category; 4602 4603 class pointer { 4604 TemplateArgumentLoc Arg; 4605 4606 public: 4607 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4608 4609 const TemplateArgumentLoc *operator->() const { return &Arg; } 4610 }; 4611 4612 TemplateArgumentLocInventIterator() { } 4613 4614 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4615 InputIterator Iter) 4616 : Self(Self), Iter(Iter) { } 4617 4618 TemplateArgumentLocInventIterator &operator++() { 4619 ++Iter; 4620 return *this; 4621 } 4622 4623 TemplateArgumentLocInventIterator operator++(int) { 4624 TemplateArgumentLocInventIterator Old(*this); 4625 ++(*this); 4626 return Old; 4627 } 4628 4629 reference operator*() const { 4630 TemplateArgumentLoc Result; 4631 Self.InventTemplateArgumentLoc(*Iter, Result); 4632 return Result; 4633 } 4634 4635 pointer operator->() const { return pointer(**this); } 4636 4637 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4638 const TemplateArgumentLocInventIterator &Y) { 4639 return X.Iter == Y.Iter; 4640 } 4641 4642 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4643 const TemplateArgumentLocInventIterator &Y) { 4644 return X.Iter != Y.Iter; 4645 } 4646 }; 4647 4648 template<typename Derived> 4649 template<typename InputIterator> 4650 bool TreeTransform<Derived>::TransformTemplateArguments( 4651 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4652 bool Uneval) { 4653 for (; First != Last; ++First) { 4654 TemplateArgumentLoc Out; 4655 TemplateArgumentLoc In = *First; 4656 4657 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4658 // Unpack argument packs, which we translate them into separate 4659 // arguments. 4660 // FIXME: We could do much better if we could guarantee that the 4661 // TemplateArgumentLocInfo for the pack expansion would be usable for 4662 // all of the template arguments in the argument pack. 4663 typedef TemplateArgumentLocInventIterator<Derived, 4664 TemplateArgument::pack_iterator> 4665 PackLocIterator; 4666 if (TransformTemplateArguments(PackLocIterator(*this, 4667 In.getArgument().pack_begin()), 4668 PackLocIterator(*this, 4669 In.getArgument().pack_end()), 4670 Outputs, Uneval)) 4671 return true; 4672 4673 continue; 4674 } 4675 4676 if (In.getArgument().isPackExpansion()) { 4677 // We have a pack expansion, for which we will be substituting into 4678 // the pattern. 4679 SourceLocation Ellipsis; 4680 std::optional<unsigned> OrigNumExpansions; 4681 TemplateArgumentLoc Pattern 4682 = getSema().getTemplateArgumentPackExpansionPattern( 4683 In, Ellipsis, OrigNumExpansions); 4684 4685 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4686 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4687 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4688 4689 // Determine whether the set of unexpanded parameter packs can and should 4690 // be expanded. 4691 bool Expand = true; 4692 bool RetainExpansion = false; 4693 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4694 if (getDerived().TryExpandParameterPacks(Ellipsis, 4695 Pattern.getSourceRange(), 4696 Unexpanded, 4697 Expand, 4698 RetainExpansion, 4699 NumExpansions)) 4700 return true; 4701 4702 if (!Expand) { 4703 // The transform has determined that we should perform a simple 4704 // transformation on the pack expansion, producing another pack 4705 // expansion. 4706 TemplateArgumentLoc OutPattern; 4707 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4708 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4709 return true; 4710 4711 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4712 NumExpansions); 4713 if (Out.getArgument().isNull()) 4714 return true; 4715 4716 Outputs.addArgument(Out); 4717 continue; 4718 } 4719 4720 // The transform has determined that we should perform an elementwise 4721 // expansion of the pattern. Do so. 4722 for (unsigned I = 0; I != *NumExpansions; ++I) { 4723 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4724 4725 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4726 return true; 4727 4728 if (Out.getArgument().containsUnexpandedParameterPack()) { 4729 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4730 OrigNumExpansions); 4731 if (Out.getArgument().isNull()) 4732 return true; 4733 } 4734 4735 Outputs.addArgument(Out); 4736 } 4737 4738 // If we're supposed to retain a pack expansion, do so by temporarily 4739 // forgetting the partially-substituted parameter pack. 4740 if (RetainExpansion) { 4741 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4742 4743 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4744 return true; 4745 4746 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4747 OrigNumExpansions); 4748 if (Out.getArgument().isNull()) 4749 return true; 4750 4751 Outputs.addArgument(Out); 4752 } 4753 4754 continue; 4755 } 4756 4757 // The simple case: 4758 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4759 return true; 4760 4761 Outputs.addArgument(Out); 4762 } 4763 4764 return false; 4765 4766 } 4767 4768 //===----------------------------------------------------------------------===// 4769 // Type transformation 4770 //===----------------------------------------------------------------------===// 4771 4772 template<typename Derived> 4773 QualType TreeTransform<Derived>::TransformType(QualType T) { 4774 if (getDerived().AlreadyTransformed(T)) 4775 return T; 4776 4777 // Temporary workaround. All of these transformations should 4778 // eventually turn into transformations on TypeLocs. 4779 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4780 getDerived().getBaseLocation()); 4781 4782 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4783 4784 if (!NewDI) 4785 return QualType(); 4786 4787 return NewDI->getType(); 4788 } 4789 4790 template<typename Derived> 4791 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4792 // Refine the base location to the type's location. 4793 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4794 getDerived().getBaseEntity()); 4795 if (getDerived().AlreadyTransformed(DI->getType())) 4796 return DI; 4797 4798 TypeLocBuilder TLB; 4799 4800 TypeLoc TL = DI->getTypeLoc(); 4801 TLB.reserve(TL.getFullDataSize()); 4802 4803 QualType Result = getDerived().TransformType(TLB, TL); 4804 if (Result.isNull()) 4805 return nullptr; 4806 4807 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4808 } 4809 4810 template<typename Derived> 4811 QualType 4812 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4813 switch (T.getTypeLocClass()) { 4814 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4815 #define TYPELOC(CLASS, PARENT) \ 4816 case TypeLoc::CLASS: \ 4817 return getDerived().Transform##CLASS##Type(TLB, \ 4818 T.castAs<CLASS##TypeLoc>()); 4819 #include "clang/AST/TypeLocNodes.def" 4820 } 4821 4822 llvm_unreachable("unhandled type loc!"); 4823 } 4824 4825 template<typename Derived> 4826 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4827 if (!isa<DependentNameType>(T)) 4828 return TransformType(T); 4829 4830 if (getDerived().AlreadyTransformed(T)) 4831 return T; 4832 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4833 getDerived().getBaseLocation()); 4834 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4835 return NewDI ? NewDI->getType() : QualType(); 4836 } 4837 4838 template<typename Derived> 4839 TypeSourceInfo * 4840 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4841 if (!isa<DependentNameType>(DI->getType())) 4842 return TransformType(DI); 4843 4844 // Refine the base location to the type's location. 4845 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4846 getDerived().getBaseEntity()); 4847 if (getDerived().AlreadyTransformed(DI->getType())) 4848 return DI; 4849 4850 TypeLocBuilder TLB; 4851 4852 TypeLoc TL = DI->getTypeLoc(); 4853 TLB.reserve(TL.getFullDataSize()); 4854 4855 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4856 if (QTL) 4857 TL = QTL.getUnqualifiedLoc(); 4858 4859 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4860 4861 QualType Result = getDerived().TransformDependentNameType( 4862 TLB, DNTL, /*DeducedTSTContext*/true); 4863 if (Result.isNull()) 4864 return nullptr; 4865 4866 if (QTL) { 4867 Result = getDerived().RebuildQualifiedType(Result, QTL); 4868 if (Result.isNull()) 4869 return nullptr; 4870 TLB.TypeWasModifiedSafely(Result); 4871 } 4872 4873 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4874 } 4875 4876 template<typename Derived> 4877 QualType 4878 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4879 QualifiedTypeLoc T) { 4880 QualType Result; 4881 TypeLoc UnqualTL = T.getUnqualifiedLoc(); 4882 auto SuppressObjCLifetime = 4883 T.getType().getLocalQualifiers().hasObjCLifetime(); 4884 if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) { 4885 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP, 4886 SuppressObjCLifetime); 4887 } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) { 4888 Result = getDerived().TransformSubstTemplateTypeParmPackType( 4889 TLB, STTP, SuppressObjCLifetime); 4890 } else { 4891 Result = getDerived().TransformType(TLB, UnqualTL); 4892 } 4893 4894 if (Result.isNull()) 4895 return QualType(); 4896 4897 Result = getDerived().RebuildQualifiedType(Result, T); 4898 4899 if (Result.isNull()) 4900 return QualType(); 4901 4902 // RebuildQualifiedType might have updated the type, but not in a way 4903 // that invalidates the TypeLoc. (There's no location information for 4904 // qualifiers.) 4905 TLB.TypeWasModifiedSafely(Result); 4906 4907 return Result; 4908 } 4909 4910 template <typename Derived> 4911 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4912 QualifiedTypeLoc TL) { 4913 4914 SourceLocation Loc = TL.getBeginLoc(); 4915 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4916 4917 if ((T.getAddressSpace() != LangAS::Default && 4918 Quals.getAddressSpace() != LangAS::Default) && 4919 T.getAddressSpace() != Quals.getAddressSpace()) { 4920 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4921 << TL.getType() << T; 4922 return QualType(); 4923 } 4924 4925 // C++ [dcl.fct]p7: 4926 // [When] adding cv-qualifications on top of the function type [...] the 4927 // cv-qualifiers are ignored. 4928 if (T->isFunctionType()) { 4929 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4930 Quals.getAddressSpace()); 4931 return T; 4932 } 4933 4934 // C++ [dcl.ref]p1: 4935 // when the cv-qualifiers are introduced through the use of a typedef-name 4936 // or decltype-specifier [...] the cv-qualifiers are ignored. 4937 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4938 // applied to a reference type. 4939 if (T->isReferenceType()) { 4940 // The only qualifier that applies to a reference type is restrict. 4941 if (!Quals.hasRestrict()) 4942 return T; 4943 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4944 } 4945 4946 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4947 // resulting type. 4948 if (Quals.hasObjCLifetime()) { 4949 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4950 Quals.removeObjCLifetime(); 4951 else if (T.getObjCLifetime()) { 4952 // Objective-C ARC: 4953 // A lifetime qualifier applied to a substituted template parameter 4954 // overrides the lifetime qualifier from the template argument. 4955 const AutoType *AutoTy; 4956 if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4957 // 'auto' types behave the same way as template parameters. 4958 QualType Deduced = AutoTy->getDeducedType(); 4959 Qualifiers Qs = Deduced.getQualifiers(); 4960 Qs.removeObjCLifetime(); 4961 Deduced = 4962 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4963 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4964 AutoTy->isDependentType(), 4965 /*isPack=*/false, 4966 AutoTy->getTypeConstraintConcept(), 4967 AutoTy->getTypeConstraintArguments()); 4968 } else { 4969 // Otherwise, complain about the addition of a qualifier to an 4970 // already-qualified type. 4971 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4972 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4973 Quals.removeObjCLifetime(); 4974 } 4975 } 4976 } 4977 4978 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4979 } 4980 4981 template<typename Derived> 4982 TypeLoc 4983 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4984 QualType ObjectType, 4985 NamedDecl *UnqualLookup, 4986 CXXScopeSpec &SS) { 4987 if (getDerived().AlreadyTransformed(TL.getType())) 4988 return TL; 4989 4990 TypeSourceInfo *TSI = 4991 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4992 if (TSI) 4993 return TSI->getTypeLoc(); 4994 return TypeLoc(); 4995 } 4996 4997 template<typename Derived> 4998 TypeSourceInfo * 4999 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 5000 QualType ObjectType, 5001 NamedDecl *UnqualLookup, 5002 CXXScopeSpec &SS) { 5003 if (getDerived().AlreadyTransformed(TSInfo->getType())) 5004 return TSInfo; 5005 5006 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 5007 UnqualLookup, SS); 5008 } 5009 5010 template <typename Derived> 5011 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 5012 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 5013 CXXScopeSpec &SS) { 5014 QualType T = TL.getType(); 5015 assert(!getDerived().AlreadyTransformed(T)); 5016 5017 TypeLocBuilder TLB; 5018 QualType Result; 5019 5020 if (isa<TemplateSpecializationType>(T)) { 5021 TemplateSpecializationTypeLoc SpecTL = 5022 TL.castAs<TemplateSpecializationTypeLoc>(); 5023 5024 TemplateName Template = getDerived().TransformTemplateName( 5025 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 5026 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 5027 if (Template.isNull()) 5028 return nullptr; 5029 5030 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 5031 Template); 5032 } else if (isa<DependentTemplateSpecializationType>(T)) { 5033 DependentTemplateSpecializationTypeLoc SpecTL = 5034 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 5035 5036 TemplateName Template 5037 = getDerived().RebuildTemplateName(SS, 5038 SpecTL.getTemplateKeywordLoc(), 5039 *SpecTL.getTypePtr()->getIdentifier(), 5040 SpecTL.getTemplateNameLoc(), 5041 ObjectType, UnqualLookup, 5042 /*AllowInjectedClassName*/true); 5043 if (Template.isNull()) 5044 return nullptr; 5045 5046 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 5047 SpecTL, 5048 Template, 5049 SS); 5050 } else { 5051 // Nothing special needs to be done for these. 5052 Result = getDerived().TransformType(TLB, TL); 5053 } 5054 5055 if (Result.isNull()) 5056 return nullptr; 5057 5058 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 5059 } 5060 5061 template <class TyLoc> static inline 5062 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 5063 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 5064 NewT.setNameLoc(T.getNameLoc()); 5065 return T.getType(); 5066 } 5067 5068 template<typename Derived> 5069 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 5070 BuiltinTypeLoc T) { 5071 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 5072 NewT.setBuiltinLoc(T.getBuiltinLoc()); 5073 if (T.needsExtraLocalData()) 5074 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 5075 return T.getType(); 5076 } 5077 5078 template<typename Derived> 5079 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 5080 ComplexTypeLoc T) { 5081 // FIXME: recurse? 5082 return TransformTypeSpecType(TLB, T); 5083 } 5084 5085 template <typename Derived> 5086 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 5087 AdjustedTypeLoc TL) { 5088 // Adjustments applied during transformation are handled elsewhere. 5089 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 5090 } 5091 5092 template<typename Derived> 5093 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 5094 DecayedTypeLoc TL) { 5095 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 5096 if (OriginalType.isNull()) 5097 return QualType(); 5098 5099 QualType Result = TL.getType(); 5100 if (getDerived().AlwaysRebuild() || 5101 OriginalType != TL.getOriginalLoc().getType()) 5102 Result = SemaRef.Context.getDecayedType(OriginalType); 5103 TLB.push<DecayedTypeLoc>(Result); 5104 // Nothing to set for DecayedTypeLoc. 5105 return Result; 5106 } 5107 5108 template<typename Derived> 5109 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 5110 PointerTypeLoc TL) { 5111 QualType PointeeType 5112 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5113 if (PointeeType.isNull()) 5114 return QualType(); 5115 5116 QualType Result = TL.getType(); 5117 if (PointeeType->getAs<ObjCObjectType>()) { 5118 // A dependent pointer type 'T *' has is being transformed such 5119 // that an Objective-C class type is being replaced for 'T'. The 5120 // resulting pointer type is an ObjCObjectPointerType, not a 5121 // PointerType. 5122 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5123 5124 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5125 NewT.setStarLoc(TL.getStarLoc()); 5126 return Result; 5127 } 5128 5129 if (getDerived().AlwaysRebuild() || 5130 PointeeType != TL.getPointeeLoc().getType()) { 5131 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5132 if (Result.isNull()) 5133 return QualType(); 5134 } 5135 5136 // Objective-C ARC can add lifetime qualifiers to the type that we're 5137 // pointing to. 5138 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5139 5140 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5141 NewT.setSigilLoc(TL.getSigilLoc()); 5142 return Result; 5143 } 5144 5145 template<typename Derived> 5146 QualType 5147 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5148 BlockPointerTypeLoc TL) { 5149 QualType PointeeType 5150 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5151 if (PointeeType.isNull()) 5152 return QualType(); 5153 5154 QualType Result = TL.getType(); 5155 if (getDerived().AlwaysRebuild() || 5156 PointeeType != TL.getPointeeLoc().getType()) { 5157 Result = getDerived().RebuildBlockPointerType(PointeeType, 5158 TL.getSigilLoc()); 5159 if (Result.isNull()) 5160 return QualType(); 5161 } 5162 5163 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5164 NewT.setSigilLoc(TL.getSigilLoc()); 5165 return Result; 5166 } 5167 5168 /// Transforms a reference type. Note that somewhat paradoxically we 5169 /// don't care whether the type itself is an l-value type or an r-value 5170 /// type; we only care if the type was *written* as an l-value type 5171 /// or an r-value type. 5172 template<typename Derived> 5173 QualType 5174 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5175 ReferenceTypeLoc TL) { 5176 const ReferenceType *T = TL.getTypePtr(); 5177 5178 // Note that this works with the pointee-as-written. 5179 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5180 if (PointeeType.isNull()) 5181 return QualType(); 5182 5183 QualType Result = TL.getType(); 5184 if (getDerived().AlwaysRebuild() || 5185 PointeeType != T->getPointeeTypeAsWritten()) { 5186 Result = getDerived().RebuildReferenceType(PointeeType, 5187 T->isSpelledAsLValue(), 5188 TL.getSigilLoc()); 5189 if (Result.isNull()) 5190 return QualType(); 5191 } 5192 5193 // Objective-C ARC can add lifetime qualifiers to the type that we're 5194 // referring to. 5195 TLB.TypeWasModifiedSafely( 5196 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5197 5198 // r-value references can be rebuilt as l-value references. 5199 ReferenceTypeLoc NewTL; 5200 if (isa<LValueReferenceType>(Result)) 5201 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5202 else 5203 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5204 NewTL.setSigilLoc(TL.getSigilLoc()); 5205 5206 return Result; 5207 } 5208 5209 template<typename Derived> 5210 QualType 5211 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5212 LValueReferenceTypeLoc TL) { 5213 return TransformReferenceType(TLB, TL); 5214 } 5215 5216 template<typename Derived> 5217 QualType 5218 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5219 RValueReferenceTypeLoc TL) { 5220 return TransformReferenceType(TLB, TL); 5221 } 5222 5223 template<typename Derived> 5224 QualType 5225 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5226 MemberPointerTypeLoc TL) { 5227 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5228 if (PointeeType.isNull()) 5229 return QualType(); 5230 5231 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5232 TypeSourceInfo *NewClsTInfo = nullptr; 5233 if (OldClsTInfo) { 5234 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5235 if (!NewClsTInfo) 5236 return QualType(); 5237 } 5238 5239 const MemberPointerType *T = TL.getTypePtr(); 5240 QualType OldClsType = QualType(T->getClass(), 0); 5241 QualType NewClsType; 5242 if (NewClsTInfo) 5243 NewClsType = NewClsTInfo->getType(); 5244 else { 5245 NewClsType = getDerived().TransformType(OldClsType); 5246 if (NewClsType.isNull()) 5247 return QualType(); 5248 } 5249 5250 QualType Result = TL.getType(); 5251 if (getDerived().AlwaysRebuild() || 5252 PointeeType != T->getPointeeType() || 5253 NewClsType != OldClsType) { 5254 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5255 TL.getStarLoc()); 5256 if (Result.isNull()) 5257 return QualType(); 5258 } 5259 5260 // If we had to adjust the pointee type when building a member pointer, make 5261 // sure to push TypeLoc info for it. 5262 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5263 if (MPT && PointeeType != MPT->getPointeeType()) { 5264 assert(isa<AdjustedType>(MPT->getPointeeType())); 5265 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5266 } 5267 5268 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5269 NewTL.setSigilLoc(TL.getSigilLoc()); 5270 NewTL.setClassTInfo(NewClsTInfo); 5271 5272 return Result; 5273 } 5274 5275 template<typename Derived> 5276 QualType 5277 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5278 ConstantArrayTypeLoc TL) { 5279 const ConstantArrayType *T = TL.getTypePtr(); 5280 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5281 if (ElementType.isNull()) 5282 return QualType(); 5283 5284 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5285 Expr *OldSize = TL.getSizeExpr(); 5286 if (!OldSize) 5287 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5288 Expr *NewSize = nullptr; 5289 if (OldSize) { 5290 EnterExpressionEvaluationContext Unevaluated( 5291 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5292 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5293 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5294 } 5295 5296 QualType Result = TL.getType(); 5297 if (getDerived().AlwaysRebuild() || 5298 ElementType != T->getElementType() || 5299 (T->getSizeExpr() && NewSize != OldSize)) { 5300 Result = getDerived().RebuildConstantArrayType(ElementType, 5301 T->getSizeModifier(), 5302 T->getSize(), NewSize, 5303 T->getIndexTypeCVRQualifiers(), 5304 TL.getBracketsRange()); 5305 if (Result.isNull()) 5306 return QualType(); 5307 } 5308 5309 // We might have either a ConstantArrayType or a VariableArrayType now: 5310 // a ConstantArrayType is allowed to have an element type which is a 5311 // VariableArrayType if the type is dependent. Fortunately, all array 5312 // types have the same location layout. 5313 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5314 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5315 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5316 NewTL.setSizeExpr(NewSize); 5317 5318 return Result; 5319 } 5320 5321 template<typename Derived> 5322 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5323 TypeLocBuilder &TLB, 5324 IncompleteArrayTypeLoc TL) { 5325 const IncompleteArrayType *T = TL.getTypePtr(); 5326 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5327 if (ElementType.isNull()) 5328 return QualType(); 5329 5330 QualType Result = TL.getType(); 5331 if (getDerived().AlwaysRebuild() || 5332 ElementType != T->getElementType()) { 5333 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5334 T->getSizeModifier(), 5335 T->getIndexTypeCVRQualifiers(), 5336 TL.getBracketsRange()); 5337 if (Result.isNull()) 5338 return QualType(); 5339 } 5340 5341 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5342 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5343 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5344 NewTL.setSizeExpr(nullptr); 5345 5346 return Result; 5347 } 5348 5349 template<typename Derived> 5350 QualType 5351 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5352 VariableArrayTypeLoc TL) { 5353 const VariableArrayType *T = TL.getTypePtr(); 5354 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5355 if (ElementType.isNull()) 5356 return QualType(); 5357 5358 ExprResult SizeResult; 5359 { 5360 EnterExpressionEvaluationContext Context( 5361 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5362 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5363 } 5364 if (SizeResult.isInvalid()) 5365 return QualType(); 5366 SizeResult = 5367 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5368 if (SizeResult.isInvalid()) 5369 return QualType(); 5370 5371 Expr *Size = SizeResult.get(); 5372 5373 QualType Result = TL.getType(); 5374 if (getDerived().AlwaysRebuild() || 5375 ElementType != T->getElementType() || 5376 Size != T->getSizeExpr()) { 5377 Result = getDerived().RebuildVariableArrayType(ElementType, 5378 T->getSizeModifier(), 5379 Size, 5380 T->getIndexTypeCVRQualifiers(), 5381 TL.getBracketsRange()); 5382 if (Result.isNull()) 5383 return QualType(); 5384 } 5385 5386 // We might have constant size array now, but fortunately it has the same 5387 // location layout. 5388 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5389 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5390 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5391 NewTL.setSizeExpr(Size); 5392 5393 return Result; 5394 } 5395 5396 template<typename Derived> 5397 QualType 5398 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5399 DependentSizedArrayTypeLoc TL) { 5400 const DependentSizedArrayType *T = TL.getTypePtr(); 5401 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5402 if (ElementType.isNull()) 5403 return QualType(); 5404 5405 // Array bounds are constant expressions. 5406 EnterExpressionEvaluationContext Unevaluated( 5407 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5408 5409 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5410 Expr *origSize = TL.getSizeExpr(); 5411 if (!origSize) origSize = T->getSizeExpr(); 5412 5413 ExprResult sizeResult 5414 = getDerived().TransformExpr(origSize); 5415 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5416 if (sizeResult.isInvalid()) 5417 return QualType(); 5418 5419 Expr *size = sizeResult.get(); 5420 5421 QualType Result = TL.getType(); 5422 if (getDerived().AlwaysRebuild() || 5423 ElementType != T->getElementType() || 5424 size != origSize) { 5425 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5426 T->getSizeModifier(), 5427 size, 5428 T->getIndexTypeCVRQualifiers(), 5429 TL.getBracketsRange()); 5430 if (Result.isNull()) 5431 return QualType(); 5432 } 5433 5434 // We might have any sort of array type now, but fortunately they 5435 // all have the same location layout. 5436 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5437 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5438 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5439 NewTL.setSizeExpr(size); 5440 5441 return Result; 5442 } 5443 5444 template <typename Derived> 5445 QualType TreeTransform<Derived>::TransformDependentVectorType( 5446 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5447 const DependentVectorType *T = TL.getTypePtr(); 5448 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5449 if (ElementType.isNull()) 5450 return QualType(); 5451 5452 EnterExpressionEvaluationContext Unevaluated( 5453 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5454 5455 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5456 Size = SemaRef.ActOnConstantExpression(Size); 5457 if (Size.isInvalid()) 5458 return QualType(); 5459 5460 QualType Result = TL.getType(); 5461 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5462 Size.get() != T->getSizeExpr()) { 5463 Result = getDerived().RebuildDependentVectorType( 5464 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5465 if (Result.isNull()) 5466 return QualType(); 5467 } 5468 5469 // Result might be dependent or not. 5470 if (isa<DependentVectorType>(Result)) { 5471 DependentVectorTypeLoc NewTL = 5472 TLB.push<DependentVectorTypeLoc>(Result); 5473 NewTL.setNameLoc(TL.getNameLoc()); 5474 } else { 5475 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5476 NewTL.setNameLoc(TL.getNameLoc()); 5477 } 5478 5479 return Result; 5480 } 5481 5482 template<typename Derived> 5483 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5484 TypeLocBuilder &TLB, 5485 DependentSizedExtVectorTypeLoc TL) { 5486 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5487 5488 // FIXME: ext vector locs should be nested 5489 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5490 if (ElementType.isNull()) 5491 return QualType(); 5492 5493 // Vector sizes are constant expressions. 5494 EnterExpressionEvaluationContext Unevaluated( 5495 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5496 5497 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5498 Size = SemaRef.ActOnConstantExpression(Size); 5499 if (Size.isInvalid()) 5500 return QualType(); 5501 5502 QualType Result = TL.getType(); 5503 if (getDerived().AlwaysRebuild() || 5504 ElementType != T->getElementType() || 5505 Size.get() != T->getSizeExpr()) { 5506 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5507 Size.get(), 5508 T->getAttributeLoc()); 5509 if (Result.isNull()) 5510 return QualType(); 5511 } 5512 5513 // Result might be dependent or not. 5514 if (isa<DependentSizedExtVectorType>(Result)) { 5515 DependentSizedExtVectorTypeLoc NewTL 5516 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5517 NewTL.setNameLoc(TL.getNameLoc()); 5518 } else { 5519 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5520 NewTL.setNameLoc(TL.getNameLoc()); 5521 } 5522 5523 return Result; 5524 } 5525 5526 template <typename Derived> 5527 QualType 5528 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5529 ConstantMatrixTypeLoc TL) { 5530 const ConstantMatrixType *T = TL.getTypePtr(); 5531 QualType ElementType = getDerived().TransformType(T->getElementType()); 5532 if (ElementType.isNull()) 5533 return QualType(); 5534 5535 QualType Result = TL.getType(); 5536 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5537 Result = getDerived().RebuildConstantMatrixType( 5538 ElementType, T->getNumRows(), T->getNumColumns()); 5539 if (Result.isNull()) 5540 return QualType(); 5541 } 5542 5543 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5544 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5545 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5546 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5547 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5548 5549 return Result; 5550 } 5551 5552 template <typename Derived> 5553 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5554 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5555 const DependentSizedMatrixType *T = TL.getTypePtr(); 5556 5557 QualType ElementType = getDerived().TransformType(T->getElementType()); 5558 if (ElementType.isNull()) { 5559 return QualType(); 5560 } 5561 5562 // Matrix dimensions are constant expressions. 5563 EnterExpressionEvaluationContext Unevaluated( 5564 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5565 5566 Expr *origRows = TL.getAttrRowOperand(); 5567 if (!origRows) 5568 origRows = T->getRowExpr(); 5569 Expr *origColumns = TL.getAttrColumnOperand(); 5570 if (!origColumns) 5571 origColumns = T->getColumnExpr(); 5572 5573 ExprResult rowResult = getDerived().TransformExpr(origRows); 5574 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5575 if (rowResult.isInvalid()) 5576 return QualType(); 5577 5578 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5579 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5580 if (columnResult.isInvalid()) 5581 return QualType(); 5582 5583 Expr *rows = rowResult.get(); 5584 Expr *columns = columnResult.get(); 5585 5586 QualType Result = TL.getType(); 5587 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5588 rows != origRows || columns != origColumns) { 5589 Result = getDerived().RebuildDependentSizedMatrixType( 5590 ElementType, rows, columns, T->getAttributeLoc()); 5591 5592 if (Result.isNull()) 5593 return QualType(); 5594 } 5595 5596 // We might have any sort of matrix type now, but fortunately they 5597 // all have the same location layout. 5598 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5599 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5600 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5601 NewTL.setAttrRowOperand(rows); 5602 NewTL.setAttrColumnOperand(columns); 5603 return Result; 5604 } 5605 5606 template <typename Derived> 5607 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5608 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5609 const DependentAddressSpaceType *T = TL.getTypePtr(); 5610 5611 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5612 5613 if (pointeeType.isNull()) 5614 return QualType(); 5615 5616 // Address spaces are constant expressions. 5617 EnterExpressionEvaluationContext Unevaluated( 5618 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5619 5620 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5621 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5622 if (AddrSpace.isInvalid()) 5623 return QualType(); 5624 5625 QualType Result = TL.getType(); 5626 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5627 AddrSpace.get() != T->getAddrSpaceExpr()) { 5628 Result = getDerived().RebuildDependentAddressSpaceType( 5629 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5630 if (Result.isNull()) 5631 return QualType(); 5632 } 5633 5634 // Result might be dependent or not. 5635 if (isa<DependentAddressSpaceType>(Result)) { 5636 DependentAddressSpaceTypeLoc NewTL = 5637 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5638 5639 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5640 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5641 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5642 5643 } else { 5644 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5645 Result, getDerived().getBaseLocation()); 5646 TransformType(TLB, DI->getTypeLoc()); 5647 } 5648 5649 return Result; 5650 } 5651 5652 template <typename Derived> 5653 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5654 VectorTypeLoc TL) { 5655 const VectorType *T = TL.getTypePtr(); 5656 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5657 if (ElementType.isNull()) 5658 return QualType(); 5659 5660 QualType Result = TL.getType(); 5661 if (getDerived().AlwaysRebuild() || 5662 ElementType != T->getElementType()) { 5663 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5664 T->getVectorKind()); 5665 if (Result.isNull()) 5666 return QualType(); 5667 } 5668 5669 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5670 NewTL.setNameLoc(TL.getNameLoc()); 5671 5672 return Result; 5673 } 5674 5675 template<typename Derived> 5676 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5677 ExtVectorTypeLoc TL) { 5678 const VectorType *T = TL.getTypePtr(); 5679 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5680 if (ElementType.isNull()) 5681 return QualType(); 5682 5683 QualType Result = TL.getType(); 5684 if (getDerived().AlwaysRebuild() || 5685 ElementType != T->getElementType()) { 5686 Result = getDerived().RebuildExtVectorType(ElementType, 5687 T->getNumElements(), 5688 /*FIXME*/ SourceLocation()); 5689 if (Result.isNull()) 5690 return QualType(); 5691 } 5692 5693 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5694 NewTL.setNameLoc(TL.getNameLoc()); 5695 5696 return Result; 5697 } 5698 5699 template <typename Derived> 5700 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5701 ParmVarDecl *OldParm, int indexAdjustment, 5702 std::optional<unsigned> NumExpansions, bool ExpectParameterPack) { 5703 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5704 TypeSourceInfo *NewDI = nullptr; 5705 5706 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5707 // If we're substituting into a pack expansion type and we know the 5708 // length we want to expand to, just substitute for the pattern. 5709 TypeLoc OldTL = OldDI->getTypeLoc(); 5710 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5711 5712 TypeLocBuilder TLB; 5713 TypeLoc NewTL = OldDI->getTypeLoc(); 5714 TLB.reserve(NewTL.getFullDataSize()); 5715 5716 QualType Result = getDerived().TransformType(TLB, 5717 OldExpansionTL.getPatternLoc()); 5718 if (Result.isNull()) 5719 return nullptr; 5720 5721 Result = RebuildPackExpansionType(Result, 5722 OldExpansionTL.getPatternLoc().getSourceRange(), 5723 OldExpansionTL.getEllipsisLoc(), 5724 NumExpansions); 5725 if (Result.isNull()) 5726 return nullptr; 5727 5728 PackExpansionTypeLoc NewExpansionTL 5729 = TLB.push<PackExpansionTypeLoc>(Result); 5730 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5731 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5732 } else 5733 NewDI = getDerived().TransformType(OldDI); 5734 if (!NewDI) 5735 return nullptr; 5736 5737 if (NewDI == OldDI && indexAdjustment == 0) 5738 return OldParm; 5739 5740 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5741 OldParm->getDeclContext(), 5742 OldParm->getInnerLocStart(), 5743 OldParm->getLocation(), 5744 OldParm->getIdentifier(), 5745 NewDI->getType(), 5746 NewDI, 5747 OldParm->getStorageClass(), 5748 /* DefArg */ nullptr); 5749 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5750 OldParm->getFunctionScopeIndex() + indexAdjustment); 5751 transformedLocalDecl(OldParm, {newParm}); 5752 return newParm; 5753 } 5754 5755 template <typename Derived> 5756 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5757 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5758 const QualType *ParamTypes, 5759 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5760 SmallVectorImpl<QualType> &OutParamTypes, 5761 SmallVectorImpl<ParmVarDecl *> *PVars, 5762 Sema::ExtParameterInfoBuilder &PInfos, 5763 unsigned *LastParamTransformed) { 5764 int indexAdjustment = 0; 5765 5766 unsigned NumParams = Params.size(); 5767 for (unsigned i = 0; i != NumParams; ++i) { 5768 if (LastParamTransformed) 5769 *LastParamTransformed = i; 5770 if (ParmVarDecl *OldParm = Params[i]) { 5771 assert(OldParm->getFunctionScopeIndex() == i); 5772 5773 std::optional<unsigned> NumExpansions; 5774 ParmVarDecl *NewParm = nullptr; 5775 if (OldParm->isParameterPack()) { 5776 // We have a function parameter pack that may need to be expanded. 5777 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5778 5779 // Find the parameter packs that could be expanded. 5780 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5781 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5782 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5783 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5784 5785 // Determine whether we should expand the parameter packs. 5786 bool ShouldExpand = false; 5787 bool RetainExpansion = false; 5788 std::optional<unsigned> OrigNumExpansions; 5789 if (Unexpanded.size() > 0) { 5790 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5791 NumExpansions = OrigNumExpansions; 5792 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5793 Pattern.getSourceRange(), 5794 Unexpanded, 5795 ShouldExpand, 5796 RetainExpansion, 5797 NumExpansions)) { 5798 return true; 5799 } 5800 } else { 5801 #ifndef NDEBUG 5802 const AutoType *AT = 5803 Pattern.getType().getTypePtr()->getContainedAutoType(); 5804 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5805 "Could not find parameter packs or undeduced auto type!"); 5806 #endif 5807 } 5808 5809 if (ShouldExpand) { 5810 // Expand the function parameter pack into multiple, separate 5811 // parameters. 5812 getDerived().ExpandingFunctionParameterPack(OldParm); 5813 for (unsigned I = 0; I != *NumExpansions; ++I) { 5814 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5815 ParmVarDecl *NewParm 5816 = getDerived().TransformFunctionTypeParam(OldParm, 5817 indexAdjustment++, 5818 OrigNumExpansions, 5819 /*ExpectParameterPack=*/false); 5820 if (!NewParm) 5821 return true; 5822 5823 if (ParamInfos) 5824 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5825 OutParamTypes.push_back(NewParm->getType()); 5826 if (PVars) 5827 PVars->push_back(NewParm); 5828 } 5829 5830 // If we're supposed to retain a pack expansion, do so by temporarily 5831 // forgetting the partially-substituted parameter pack. 5832 if (RetainExpansion) { 5833 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5834 ParmVarDecl *NewParm 5835 = getDerived().TransformFunctionTypeParam(OldParm, 5836 indexAdjustment++, 5837 OrigNumExpansions, 5838 /*ExpectParameterPack=*/false); 5839 if (!NewParm) 5840 return true; 5841 5842 if (ParamInfos) 5843 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5844 OutParamTypes.push_back(NewParm->getType()); 5845 if (PVars) 5846 PVars->push_back(NewParm); 5847 } 5848 5849 // The next parameter should have the same adjustment as the 5850 // last thing we pushed, but we post-incremented indexAdjustment 5851 // on every push. Also, if we push nothing, the adjustment should 5852 // go down by one. 5853 indexAdjustment--; 5854 5855 // We're done with the pack expansion. 5856 continue; 5857 } 5858 5859 // We'll substitute the parameter now without expanding the pack 5860 // expansion. 5861 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5862 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5863 indexAdjustment, 5864 NumExpansions, 5865 /*ExpectParameterPack=*/true); 5866 assert(NewParm->isParameterPack() && 5867 "Parameter pack no longer a parameter pack after " 5868 "transformation."); 5869 } else { 5870 NewParm = getDerived().TransformFunctionTypeParam( 5871 OldParm, indexAdjustment, std::nullopt, 5872 /*ExpectParameterPack=*/false); 5873 } 5874 5875 if (!NewParm) 5876 return true; 5877 5878 if (ParamInfos) 5879 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5880 OutParamTypes.push_back(NewParm->getType()); 5881 if (PVars) 5882 PVars->push_back(NewParm); 5883 continue; 5884 } 5885 5886 // Deal with the possibility that we don't have a parameter 5887 // declaration for this parameter. 5888 assert(ParamTypes); 5889 QualType OldType = ParamTypes[i]; 5890 bool IsPackExpansion = false; 5891 std::optional<unsigned> NumExpansions; 5892 QualType NewType; 5893 if (const PackExpansionType *Expansion 5894 = dyn_cast<PackExpansionType>(OldType)) { 5895 // We have a function parameter pack that may need to be expanded. 5896 QualType Pattern = Expansion->getPattern(); 5897 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5898 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5899 5900 // Determine whether we should expand the parameter packs. 5901 bool ShouldExpand = false; 5902 bool RetainExpansion = false; 5903 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5904 Unexpanded, 5905 ShouldExpand, 5906 RetainExpansion, 5907 NumExpansions)) { 5908 return true; 5909 } 5910 5911 if (ShouldExpand) { 5912 // Expand the function parameter pack into multiple, separate 5913 // parameters. 5914 for (unsigned I = 0; I != *NumExpansions; ++I) { 5915 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5916 QualType NewType = getDerived().TransformType(Pattern); 5917 if (NewType.isNull()) 5918 return true; 5919 5920 if (NewType->containsUnexpandedParameterPack()) { 5921 NewType = getSema().getASTContext().getPackExpansionType( 5922 NewType, std::nullopt); 5923 5924 if (NewType.isNull()) 5925 return true; 5926 } 5927 5928 if (ParamInfos) 5929 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5930 OutParamTypes.push_back(NewType); 5931 if (PVars) 5932 PVars->push_back(nullptr); 5933 } 5934 5935 // We're done with the pack expansion. 5936 continue; 5937 } 5938 5939 // If we're supposed to retain a pack expansion, do so by temporarily 5940 // forgetting the partially-substituted parameter pack. 5941 if (RetainExpansion) { 5942 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5943 QualType NewType = getDerived().TransformType(Pattern); 5944 if (NewType.isNull()) 5945 return true; 5946 5947 if (ParamInfos) 5948 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5949 OutParamTypes.push_back(NewType); 5950 if (PVars) 5951 PVars->push_back(nullptr); 5952 } 5953 5954 // We'll substitute the parameter now without expanding the pack 5955 // expansion. 5956 OldType = Expansion->getPattern(); 5957 IsPackExpansion = true; 5958 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5959 NewType = getDerived().TransformType(OldType); 5960 } else { 5961 NewType = getDerived().TransformType(OldType); 5962 } 5963 5964 if (NewType.isNull()) 5965 return true; 5966 5967 if (IsPackExpansion) 5968 NewType = getSema().Context.getPackExpansionType(NewType, 5969 NumExpansions); 5970 5971 if (ParamInfos) 5972 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5973 OutParamTypes.push_back(NewType); 5974 if (PVars) 5975 PVars->push_back(nullptr); 5976 } 5977 5978 #ifndef NDEBUG 5979 if (PVars) { 5980 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5981 if (ParmVarDecl *parm = (*PVars)[i]) 5982 assert(parm->getFunctionScopeIndex() == i); 5983 } 5984 #endif 5985 5986 return false; 5987 } 5988 5989 template<typename Derived> 5990 QualType 5991 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5992 FunctionProtoTypeLoc TL) { 5993 SmallVector<QualType, 4> ExceptionStorage; 5994 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5995 return getDerived().TransformFunctionProtoType( 5996 TLB, TL, nullptr, Qualifiers(), 5997 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5998 return This->getDerived().TransformExceptionSpec( 5999 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 6000 }); 6001 } 6002 6003 template<typename Derived> template<typename Fn> 6004 QualType TreeTransform<Derived>::TransformFunctionProtoType( 6005 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 6006 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 6007 6008 // Transform the parameters and return type. 6009 // 6010 // We are required to instantiate the params and return type in source order. 6011 // When the function has a trailing return type, we instantiate the 6012 // parameters before the return type, since the return type can then refer 6013 // to the parameters themselves (via decltype, sizeof, etc.). 6014 // 6015 SmallVector<QualType, 4> ParamTypes; 6016 SmallVector<ParmVarDecl*, 4> ParamDecls; 6017 Sema::ExtParameterInfoBuilder ExtParamInfos; 6018 const FunctionProtoType *T = TL.getTypePtr(); 6019 6020 QualType ResultType; 6021 6022 if (T->hasTrailingReturn()) { 6023 if (getDerived().TransformFunctionTypeParams( 6024 TL.getBeginLoc(), TL.getParams(), 6025 TL.getTypePtr()->param_type_begin(), 6026 T->getExtParameterInfosOrNull(), 6027 ParamTypes, &ParamDecls, ExtParamInfos)) 6028 return QualType(); 6029 6030 { 6031 // C++11 [expr.prim.general]p3: 6032 // If a declaration declares a member function or member function 6033 // template of a class X, the expression this is a prvalue of type 6034 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 6035 // and the end of the function-definition, member-declarator, or 6036 // declarator. 6037 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 6038 6039 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6040 if (ResultType.isNull()) 6041 return QualType(); 6042 } 6043 } 6044 else { 6045 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6046 if (ResultType.isNull()) 6047 return QualType(); 6048 6049 if (getDerived().TransformFunctionTypeParams( 6050 TL.getBeginLoc(), TL.getParams(), 6051 TL.getTypePtr()->param_type_begin(), 6052 T->getExtParameterInfosOrNull(), 6053 ParamTypes, &ParamDecls, ExtParamInfos)) 6054 return QualType(); 6055 } 6056 6057 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 6058 6059 bool EPIChanged = false; 6060 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 6061 return QualType(); 6062 6063 // Handle extended parameter information. 6064 if (auto NewExtParamInfos = 6065 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 6066 if (!EPI.ExtParameterInfos || 6067 llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) != 6068 llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) { 6069 EPIChanged = true; 6070 } 6071 EPI.ExtParameterInfos = NewExtParamInfos; 6072 } else if (EPI.ExtParameterInfos) { 6073 EPIChanged = true; 6074 EPI.ExtParameterInfos = nullptr; 6075 } 6076 6077 QualType Result = TL.getType(); 6078 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 6079 T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) { 6080 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 6081 if (Result.isNull()) 6082 return QualType(); 6083 } 6084 6085 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 6086 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6087 NewTL.setLParenLoc(TL.getLParenLoc()); 6088 NewTL.setRParenLoc(TL.getRParenLoc()); 6089 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 6090 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6091 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 6092 NewTL.setParam(i, ParamDecls[i]); 6093 6094 return Result; 6095 } 6096 6097 template<typename Derived> 6098 bool TreeTransform<Derived>::TransformExceptionSpec( 6099 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 6100 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 6101 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 6102 6103 // Instantiate a dynamic noexcept expression, if any. 6104 if (isComputedNoexcept(ESI.Type)) { 6105 EnterExpressionEvaluationContext Unevaluated( 6106 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 6107 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 6108 if (NoexceptExpr.isInvalid()) 6109 return true; 6110 6111 ExceptionSpecificationType EST = ESI.Type; 6112 NoexceptExpr = 6113 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 6114 if (NoexceptExpr.isInvalid()) 6115 return true; 6116 6117 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 6118 Changed = true; 6119 ESI.NoexceptExpr = NoexceptExpr.get(); 6120 ESI.Type = EST; 6121 } 6122 6123 if (ESI.Type != EST_Dynamic) 6124 return false; 6125 6126 // Instantiate a dynamic exception specification's type. 6127 for (QualType T : ESI.Exceptions) { 6128 if (const PackExpansionType *PackExpansion = 6129 T->getAs<PackExpansionType>()) { 6130 Changed = true; 6131 6132 // We have a pack expansion. Instantiate it. 6133 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6134 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6135 Unexpanded); 6136 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6137 6138 // Determine whether the set of unexpanded parameter packs can and 6139 // should 6140 // be expanded. 6141 bool Expand = false; 6142 bool RetainExpansion = false; 6143 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6144 // FIXME: Track the location of the ellipsis (and track source location 6145 // information for the types in the exception specification in general). 6146 if (getDerived().TryExpandParameterPacks( 6147 Loc, SourceRange(), Unexpanded, Expand, 6148 RetainExpansion, NumExpansions)) 6149 return true; 6150 6151 if (!Expand) { 6152 // We can't expand this pack expansion into separate arguments yet; 6153 // just substitute into the pattern and create a new pack expansion 6154 // type. 6155 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6156 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6157 if (U.isNull()) 6158 return true; 6159 6160 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6161 Exceptions.push_back(U); 6162 continue; 6163 } 6164 6165 // Substitute into the pack expansion pattern for each slice of the 6166 // pack. 6167 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6168 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6169 6170 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6171 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6172 return true; 6173 6174 Exceptions.push_back(U); 6175 } 6176 } else { 6177 QualType U = getDerived().TransformType(T); 6178 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6179 return true; 6180 if (T != U) 6181 Changed = true; 6182 6183 Exceptions.push_back(U); 6184 } 6185 } 6186 6187 ESI.Exceptions = Exceptions; 6188 if (ESI.Exceptions.empty()) 6189 ESI.Type = EST_DynamicNone; 6190 return false; 6191 } 6192 6193 template<typename Derived> 6194 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6195 TypeLocBuilder &TLB, 6196 FunctionNoProtoTypeLoc TL) { 6197 const FunctionNoProtoType *T = TL.getTypePtr(); 6198 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6199 if (ResultType.isNull()) 6200 return QualType(); 6201 6202 QualType Result = TL.getType(); 6203 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6204 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6205 6206 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6207 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6208 NewTL.setLParenLoc(TL.getLParenLoc()); 6209 NewTL.setRParenLoc(TL.getRParenLoc()); 6210 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6211 6212 return Result; 6213 } 6214 6215 template <typename Derived> 6216 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6217 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6218 const UnresolvedUsingType *T = TL.getTypePtr(); 6219 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6220 if (!D) 6221 return QualType(); 6222 6223 QualType Result = TL.getType(); 6224 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6225 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6226 if (Result.isNull()) 6227 return QualType(); 6228 } 6229 6230 // We might get an arbitrary type spec type back. We should at 6231 // least always get a type spec type, though. 6232 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6233 NewTL.setNameLoc(TL.getNameLoc()); 6234 6235 return Result; 6236 } 6237 6238 template <typename Derived> 6239 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6240 UsingTypeLoc TL) { 6241 const UsingType *T = TL.getTypePtr(); 6242 6243 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6244 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6245 if (!Found) 6246 return QualType(); 6247 6248 QualType Underlying = getDerived().TransformType(T->desugar()); 6249 if (Underlying.isNull()) 6250 return QualType(); 6251 6252 QualType Result = TL.getType(); 6253 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6254 Underlying != T->getUnderlyingType()) { 6255 Result = getDerived().RebuildUsingType(Found, Underlying); 6256 if (Result.isNull()) 6257 return QualType(); 6258 } 6259 6260 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6261 return Result; 6262 } 6263 6264 template<typename Derived> 6265 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6266 TypedefTypeLoc TL) { 6267 const TypedefType *T = TL.getTypePtr(); 6268 TypedefNameDecl *Typedef 6269 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6270 T->getDecl())); 6271 if (!Typedef) 6272 return QualType(); 6273 6274 QualType Result = TL.getType(); 6275 if (getDerived().AlwaysRebuild() || 6276 Typedef != T->getDecl()) { 6277 Result = getDerived().RebuildTypedefType(Typedef); 6278 if (Result.isNull()) 6279 return QualType(); 6280 } 6281 6282 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6283 NewTL.setNameLoc(TL.getNameLoc()); 6284 6285 return Result; 6286 } 6287 6288 template<typename Derived> 6289 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6290 TypeOfExprTypeLoc TL) { 6291 // typeof expressions are not potentially evaluated contexts 6292 EnterExpressionEvaluationContext Unevaluated( 6293 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6294 Sema::ReuseLambdaContextDecl); 6295 6296 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6297 if (E.isInvalid()) 6298 return QualType(); 6299 6300 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6301 if (E.isInvalid()) 6302 return QualType(); 6303 6304 QualType Result = TL.getType(); 6305 TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind(); 6306 if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) { 6307 Result = 6308 getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind); 6309 if (Result.isNull()) 6310 return QualType(); 6311 } 6312 6313 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6314 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6315 NewTL.setLParenLoc(TL.getLParenLoc()); 6316 NewTL.setRParenLoc(TL.getRParenLoc()); 6317 6318 return Result; 6319 } 6320 6321 template<typename Derived> 6322 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6323 TypeOfTypeLoc TL) { 6324 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo(); 6325 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6326 if (!New_Under_TI) 6327 return QualType(); 6328 6329 QualType Result = TL.getType(); 6330 TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind(); 6331 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6332 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind); 6333 if (Result.isNull()) 6334 return QualType(); 6335 } 6336 6337 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6338 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6339 NewTL.setLParenLoc(TL.getLParenLoc()); 6340 NewTL.setRParenLoc(TL.getRParenLoc()); 6341 NewTL.setUnmodifiedTInfo(New_Under_TI); 6342 6343 return Result; 6344 } 6345 6346 template<typename Derived> 6347 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6348 DecltypeTypeLoc TL) { 6349 const DecltypeType *T = TL.getTypePtr(); 6350 6351 // decltype expressions are not potentially evaluated contexts 6352 EnterExpressionEvaluationContext Unevaluated( 6353 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6354 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6355 6356 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6357 if (E.isInvalid()) 6358 return QualType(); 6359 6360 E = getSema().ActOnDecltypeExpression(E.get()); 6361 if (E.isInvalid()) 6362 return QualType(); 6363 6364 QualType Result = TL.getType(); 6365 if (getDerived().AlwaysRebuild() || 6366 E.get() != T->getUnderlyingExpr()) { 6367 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6368 if (Result.isNull()) 6369 return QualType(); 6370 } 6371 else E.get(); 6372 6373 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6374 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6375 NewTL.setRParenLoc(TL.getRParenLoc()); 6376 return Result; 6377 } 6378 6379 template<typename Derived> 6380 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6381 TypeLocBuilder &TLB, 6382 UnaryTransformTypeLoc TL) { 6383 QualType Result = TL.getType(); 6384 if (Result->isDependentType()) { 6385 const UnaryTransformType *T = TL.getTypePtr(); 6386 QualType NewBase = 6387 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6388 Result = getDerived().RebuildUnaryTransformType(NewBase, 6389 T->getUTTKind(), 6390 TL.getKWLoc()); 6391 if (Result.isNull()) 6392 return QualType(); 6393 } 6394 6395 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6396 NewTL.setKWLoc(TL.getKWLoc()); 6397 NewTL.setParensRange(TL.getParensRange()); 6398 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6399 return Result; 6400 } 6401 6402 template<typename Derived> 6403 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6404 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6405 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6406 6407 CXXScopeSpec SS; 6408 TemplateName TemplateName = getDerived().TransformTemplateName( 6409 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6410 if (TemplateName.isNull()) 6411 return QualType(); 6412 6413 QualType OldDeduced = T->getDeducedType(); 6414 QualType NewDeduced; 6415 if (!OldDeduced.isNull()) { 6416 NewDeduced = getDerived().TransformType(OldDeduced); 6417 if (NewDeduced.isNull()) 6418 return QualType(); 6419 } 6420 6421 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6422 TemplateName, NewDeduced); 6423 if (Result.isNull()) 6424 return QualType(); 6425 6426 DeducedTemplateSpecializationTypeLoc NewTL = 6427 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6428 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6429 6430 return Result; 6431 } 6432 6433 template<typename Derived> 6434 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6435 RecordTypeLoc TL) { 6436 const RecordType *T = TL.getTypePtr(); 6437 RecordDecl *Record 6438 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6439 T->getDecl())); 6440 if (!Record) 6441 return QualType(); 6442 6443 QualType Result = TL.getType(); 6444 if (getDerived().AlwaysRebuild() || 6445 Record != T->getDecl()) { 6446 Result = getDerived().RebuildRecordType(Record); 6447 if (Result.isNull()) 6448 return QualType(); 6449 } 6450 6451 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6452 NewTL.setNameLoc(TL.getNameLoc()); 6453 6454 return Result; 6455 } 6456 6457 template<typename Derived> 6458 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6459 EnumTypeLoc TL) { 6460 const EnumType *T = TL.getTypePtr(); 6461 EnumDecl *Enum 6462 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6463 T->getDecl())); 6464 if (!Enum) 6465 return QualType(); 6466 6467 QualType Result = TL.getType(); 6468 if (getDerived().AlwaysRebuild() || 6469 Enum != T->getDecl()) { 6470 Result = getDerived().RebuildEnumType(Enum); 6471 if (Result.isNull()) 6472 return QualType(); 6473 } 6474 6475 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6476 NewTL.setNameLoc(TL.getNameLoc()); 6477 6478 return Result; 6479 } 6480 6481 template<typename Derived> 6482 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6483 TypeLocBuilder &TLB, 6484 InjectedClassNameTypeLoc TL) { 6485 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6486 TL.getTypePtr()->getDecl()); 6487 if (!D) return QualType(); 6488 6489 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6490 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6491 return T; 6492 } 6493 6494 template<typename Derived> 6495 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6496 TypeLocBuilder &TLB, 6497 TemplateTypeParmTypeLoc TL) { 6498 return getDerived().TransformTemplateTypeParmType( 6499 TLB, TL, 6500 /*SuppressObjCLifetime=*/false); 6501 } 6502 6503 template <typename Derived> 6504 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6505 TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) { 6506 return TransformTypeSpecType(TLB, TL); 6507 } 6508 6509 template<typename Derived> 6510 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6511 TypeLocBuilder &TLB, 6512 SubstTemplateTypeParmTypeLoc TL) { 6513 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6514 6515 Decl *NewReplaced = 6516 getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl()); 6517 6518 // Substitute into the replacement type, which itself might involve something 6519 // that needs to be transformed. This only tends to occur with default 6520 // template arguments of template template parameters. 6521 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6522 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6523 if (Replacement.isNull()) 6524 return QualType(); 6525 6526 QualType Result = SemaRef.Context.getSubstTemplateTypeParmType( 6527 Replacement, NewReplaced, T->getIndex(), T->getPackIndex()); 6528 6529 // Propagate type-source information. 6530 SubstTemplateTypeParmTypeLoc NewTL 6531 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6532 NewTL.setNameLoc(TL.getNameLoc()); 6533 return Result; 6534 6535 } 6536 6537 template<typename Derived> 6538 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6539 TypeLocBuilder &TLB, 6540 SubstTemplateTypeParmPackTypeLoc TL) { 6541 return getDerived().TransformSubstTemplateTypeParmPackType( 6542 TLB, TL, /*SuppressObjCLifetime=*/false); 6543 } 6544 6545 template <typename Derived> 6546 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6547 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) { 6548 return TransformTypeSpecType(TLB, TL); 6549 } 6550 6551 template<typename Derived> 6552 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6553 TypeLocBuilder &TLB, 6554 TemplateSpecializationTypeLoc TL) { 6555 const TemplateSpecializationType *T = TL.getTypePtr(); 6556 6557 // The nested-name-specifier never matters in a TemplateSpecializationType, 6558 // because we can't have a dependent nested-name-specifier anyway. 6559 CXXScopeSpec SS; 6560 TemplateName Template 6561 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6562 TL.getTemplateNameLoc()); 6563 if (Template.isNull()) 6564 return QualType(); 6565 6566 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6567 } 6568 6569 template<typename Derived> 6570 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6571 AtomicTypeLoc TL) { 6572 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6573 if (ValueType.isNull()) 6574 return QualType(); 6575 6576 QualType Result = TL.getType(); 6577 if (getDerived().AlwaysRebuild() || 6578 ValueType != TL.getValueLoc().getType()) { 6579 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6580 if (Result.isNull()) 6581 return QualType(); 6582 } 6583 6584 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6585 NewTL.setKWLoc(TL.getKWLoc()); 6586 NewTL.setLParenLoc(TL.getLParenLoc()); 6587 NewTL.setRParenLoc(TL.getRParenLoc()); 6588 6589 return Result; 6590 } 6591 6592 template <typename Derived> 6593 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6594 PipeTypeLoc TL) { 6595 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6596 if (ValueType.isNull()) 6597 return QualType(); 6598 6599 QualType Result = TL.getType(); 6600 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6601 const PipeType *PT = Result->castAs<PipeType>(); 6602 bool isReadPipe = PT->isReadOnly(); 6603 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6604 if (Result.isNull()) 6605 return QualType(); 6606 } 6607 6608 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6609 NewTL.setKWLoc(TL.getKWLoc()); 6610 6611 return Result; 6612 } 6613 6614 template <typename Derived> 6615 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6616 BitIntTypeLoc TL) { 6617 const BitIntType *EIT = TL.getTypePtr(); 6618 QualType Result = TL.getType(); 6619 6620 if (getDerived().AlwaysRebuild()) { 6621 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6622 EIT->getNumBits(), TL.getNameLoc()); 6623 if (Result.isNull()) 6624 return QualType(); 6625 } 6626 6627 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6628 NewTL.setNameLoc(TL.getNameLoc()); 6629 return Result; 6630 } 6631 6632 template <typename Derived> 6633 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6634 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6635 const DependentBitIntType *EIT = TL.getTypePtr(); 6636 6637 EnterExpressionEvaluationContext Unevaluated( 6638 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6639 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6640 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6641 6642 if (BitsExpr.isInvalid()) 6643 return QualType(); 6644 6645 QualType Result = TL.getType(); 6646 6647 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6648 Result = getDerived().RebuildDependentBitIntType( 6649 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6650 6651 if (Result.isNull()) 6652 return QualType(); 6653 } 6654 6655 if (isa<DependentBitIntType>(Result)) { 6656 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6657 NewTL.setNameLoc(TL.getNameLoc()); 6658 } else { 6659 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6660 NewTL.setNameLoc(TL.getNameLoc()); 6661 } 6662 return Result; 6663 } 6664 6665 /// Simple iterator that traverses the template arguments in a 6666 /// container that provides a \c getArgLoc() member function. 6667 /// 6668 /// This iterator is intended to be used with the iterator form of 6669 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6670 template<typename ArgLocContainer> 6671 class TemplateArgumentLocContainerIterator { 6672 ArgLocContainer *Container; 6673 unsigned Index; 6674 6675 public: 6676 typedef TemplateArgumentLoc value_type; 6677 typedef TemplateArgumentLoc reference; 6678 typedef int difference_type; 6679 typedef std::input_iterator_tag iterator_category; 6680 6681 class pointer { 6682 TemplateArgumentLoc Arg; 6683 6684 public: 6685 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6686 6687 const TemplateArgumentLoc *operator->() const { 6688 return &Arg; 6689 } 6690 }; 6691 6692 6693 TemplateArgumentLocContainerIterator() {} 6694 6695 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6696 unsigned Index) 6697 : Container(&Container), Index(Index) { } 6698 6699 TemplateArgumentLocContainerIterator &operator++() { 6700 ++Index; 6701 return *this; 6702 } 6703 6704 TemplateArgumentLocContainerIterator operator++(int) { 6705 TemplateArgumentLocContainerIterator Old(*this); 6706 ++(*this); 6707 return Old; 6708 } 6709 6710 TemplateArgumentLoc operator*() const { 6711 return Container->getArgLoc(Index); 6712 } 6713 6714 pointer operator->() const { 6715 return pointer(Container->getArgLoc(Index)); 6716 } 6717 6718 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6719 const TemplateArgumentLocContainerIterator &Y) { 6720 return X.Container == Y.Container && X.Index == Y.Index; 6721 } 6722 6723 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6724 const TemplateArgumentLocContainerIterator &Y) { 6725 return !(X == Y); 6726 } 6727 }; 6728 6729 template<typename Derived> 6730 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6731 AutoTypeLoc TL) { 6732 const AutoType *T = TL.getTypePtr(); 6733 QualType OldDeduced = T->getDeducedType(); 6734 QualType NewDeduced; 6735 if (!OldDeduced.isNull()) { 6736 NewDeduced = getDerived().TransformType(OldDeduced); 6737 if (NewDeduced.isNull()) 6738 return QualType(); 6739 } 6740 6741 ConceptDecl *NewCD = nullptr; 6742 TemplateArgumentListInfo NewTemplateArgs; 6743 NestedNameSpecifierLoc NewNestedNameSpec; 6744 if (T->isConstrained()) { 6745 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6746 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6747 6748 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6749 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6750 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6751 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6752 ArgIterator(TL, 6753 TL.getNumArgs()), 6754 NewTemplateArgs)) 6755 return QualType(); 6756 6757 if (TL.getNestedNameSpecifierLoc()) { 6758 NewNestedNameSpec 6759 = getDerived().TransformNestedNameSpecifierLoc( 6760 TL.getNestedNameSpecifierLoc()); 6761 if (!NewNestedNameSpec) 6762 return QualType(); 6763 } 6764 } 6765 6766 QualType Result = TL.getType(); 6767 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6768 T->isDependentType() || T->isConstrained()) { 6769 // FIXME: Maybe don't rebuild if all template arguments are the same. 6770 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6771 NewArgList.reserve(NewTemplateArgs.size()); 6772 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6773 NewArgList.push_back(ArgLoc.getArgument()); 6774 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6775 NewArgList); 6776 if (Result.isNull()) 6777 return QualType(); 6778 } 6779 6780 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6781 NewTL.setNameLoc(TL.getNameLoc()); 6782 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6783 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6784 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6785 NewTL.setFoundDecl(TL.getFoundDecl()); 6786 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6787 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6788 NewTL.setRParenLoc(TL.getRParenLoc()); 6789 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6790 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6791 6792 return Result; 6793 } 6794 6795 template <typename Derived> 6796 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6797 TypeLocBuilder &TLB, 6798 TemplateSpecializationTypeLoc TL, 6799 TemplateName Template) { 6800 TemplateArgumentListInfo NewTemplateArgs; 6801 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6802 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6803 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6804 ArgIterator; 6805 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6806 ArgIterator(TL, TL.getNumArgs()), 6807 NewTemplateArgs)) 6808 return QualType(); 6809 6810 // FIXME: maybe don't rebuild if all the template arguments are the same. 6811 6812 QualType Result = 6813 getDerived().RebuildTemplateSpecializationType(Template, 6814 TL.getTemplateNameLoc(), 6815 NewTemplateArgs); 6816 6817 if (!Result.isNull()) { 6818 // Specializations of template template parameters are represented as 6819 // TemplateSpecializationTypes, and substitution of type alias templates 6820 // within a dependent context can transform them into 6821 // DependentTemplateSpecializationTypes. 6822 if (isa<DependentTemplateSpecializationType>(Result)) { 6823 DependentTemplateSpecializationTypeLoc NewTL 6824 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6825 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6826 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6827 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6828 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6829 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6830 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6831 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6832 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6833 return Result; 6834 } 6835 6836 TemplateSpecializationTypeLoc NewTL 6837 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6838 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6839 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6840 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6841 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6842 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6843 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6844 } 6845 6846 return Result; 6847 } 6848 6849 template <typename Derived> 6850 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6851 TypeLocBuilder &TLB, 6852 DependentTemplateSpecializationTypeLoc TL, 6853 TemplateName Template, 6854 CXXScopeSpec &SS) { 6855 TemplateArgumentListInfo NewTemplateArgs; 6856 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6857 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6858 typedef TemplateArgumentLocContainerIterator< 6859 DependentTemplateSpecializationTypeLoc> ArgIterator; 6860 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6861 ArgIterator(TL, TL.getNumArgs()), 6862 NewTemplateArgs)) 6863 return QualType(); 6864 6865 // FIXME: maybe don't rebuild if all the template arguments are the same. 6866 6867 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6868 QualType Result = getSema().Context.getDependentTemplateSpecializationType( 6869 TL.getTypePtr()->getKeyword(), DTN->getQualifier(), 6870 DTN->getIdentifier(), NewTemplateArgs.arguments()); 6871 6872 DependentTemplateSpecializationTypeLoc NewTL 6873 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6874 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6875 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6876 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6877 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6878 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6879 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6880 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6881 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6882 return Result; 6883 } 6884 6885 QualType Result 6886 = getDerived().RebuildTemplateSpecializationType(Template, 6887 TL.getTemplateNameLoc(), 6888 NewTemplateArgs); 6889 6890 if (!Result.isNull()) { 6891 /// FIXME: Wrap this in an elaborated-type-specifier? 6892 TemplateSpecializationTypeLoc NewTL 6893 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6894 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6895 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6896 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6897 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6898 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6899 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6900 } 6901 6902 return Result; 6903 } 6904 6905 template<typename Derived> 6906 QualType 6907 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6908 ElaboratedTypeLoc TL) { 6909 const ElaboratedType *T = TL.getTypePtr(); 6910 6911 NestedNameSpecifierLoc QualifierLoc; 6912 // NOTE: the qualifier in an ElaboratedType is optional. 6913 if (TL.getQualifierLoc()) { 6914 QualifierLoc 6915 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6916 if (!QualifierLoc) 6917 return QualType(); 6918 } 6919 6920 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6921 if (NamedT.isNull()) 6922 return QualType(); 6923 6924 // C++0x [dcl.type.elab]p2: 6925 // If the identifier resolves to a typedef-name or the simple-template-id 6926 // resolves to an alias template specialization, the 6927 // elaborated-type-specifier is ill-formed. 6928 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6929 if (const TemplateSpecializationType *TST = 6930 NamedT->getAs<TemplateSpecializationType>()) { 6931 TemplateName Template = TST->getTemplateName(); 6932 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6933 Template.getAsTemplateDecl())) { 6934 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6935 diag::err_tag_reference_non_tag) 6936 << TAT << Sema::NTK_TypeAliasTemplate 6937 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6938 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6939 } 6940 } 6941 } 6942 6943 QualType Result = TL.getType(); 6944 if (getDerived().AlwaysRebuild() || 6945 QualifierLoc != TL.getQualifierLoc() || 6946 NamedT != T->getNamedType()) { 6947 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6948 T->getKeyword(), 6949 QualifierLoc, NamedT); 6950 if (Result.isNull()) 6951 return QualType(); 6952 } 6953 6954 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6955 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6956 NewTL.setQualifierLoc(QualifierLoc); 6957 return Result; 6958 } 6959 6960 template<typename Derived> 6961 QualType TreeTransform<Derived>::TransformAttributedType( 6962 TypeLocBuilder &TLB, 6963 AttributedTypeLoc TL) { 6964 const AttributedType *oldType = TL.getTypePtr(); 6965 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6966 if (modifiedType.isNull()) 6967 return QualType(); 6968 6969 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6970 const Attr *oldAttr = TL.getAttr(); 6971 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6972 if (oldAttr && !newAttr) 6973 return QualType(); 6974 6975 QualType result = TL.getType(); 6976 6977 // FIXME: dependent operand expressions? 6978 if (getDerived().AlwaysRebuild() || 6979 modifiedType != oldType->getModifiedType()) { 6980 // TODO: this is really lame; we should really be rebuilding the 6981 // equivalent type from first principles. 6982 QualType equivalentType 6983 = getDerived().TransformType(oldType->getEquivalentType()); 6984 if (equivalentType.isNull()) 6985 return QualType(); 6986 6987 // Check whether we can add nullability; it is only represented as 6988 // type sugar, and therefore cannot be diagnosed in any other way. 6989 if (auto nullability = oldType->getImmediateNullability()) { 6990 if (!modifiedType->canHaveNullability()) { 6991 SemaRef.Diag(TL.getAttr()->getLocation(), 6992 diag::err_nullability_nonpointer) 6993 << DiagNullabilityKind(*nullability, false) << modifiedType; 6994 return QualType(); 6995 } 6996 } 6997 6998 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6999 modifiedType, 7000 equivalentType); 7001 } 7002 7003 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 7004 newTL.setAttr(newAttr); 7005 return result; 7006 } 7007 7008 template <typename Derived> 7009 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 7010 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 7011 // The BTFTagAttributedType is available for C only. 7012 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 7013 } 7014 7015 template<typename Derived> 7016 QualType 7017 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 7018 ParenTypeLoc TL) { 7019 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7020 if (Inner.isNull()) 7021 return QualType(); 7022 7023 QualType Result = TL.getType(); 7024 if (getDerived().AlwaysRebuild() || 7025 Inner != TL.getInnerLoc().getType()) { 7026 Result = getDerived().RebuildParenType(Inner); 7027 if (Result.isNull()) 7028 return QualType(); 7029 } 7030 7031 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 7032 NewTL.setLParenLoc(TL.getLParenLoc()); 7033 NewTL.setRParenLoc(TL.getRParenLoc()); 7034 return Result; 7035 } 7036 7037 template <typename Derived> 7038 QualType 7039 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 7040 MacroQualifiedTypeLoc TL) { 7041 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7042 if (Inner.isNull()) 7043 return QualType(); 7044 7045 QualType Result = TL.getType(); 7046 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 7047 Result = 7048 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 7049 if (Result.isNull()) 7050 return QualType(); 7051 } 7052 7053 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 7054 NewTL.setExpansionLoc(TL.getExpansionLoc()); 7055 return Result; 7056 } 7057 7058 template<typename Derived> 7059 QualType TreeTransform<Derived>::TransformDependentNameType( 7060 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 7061 return TransformDependentNameType(TLB, TL, false); 7062 } 7063 7064 template<typename Derived> 7065 QualType TreeTransform<Derived>::TransformDependentNameType( 7066 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 7067 const DependentNameType *T = TL.getTypePtr(); 7068 7069 NestedNameSpecifierLoc QualifierLoc 7070 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7071 if (!QualifierLoc) 7072 return QualType(); 7073 7074 QualType Result 7075 = getDerived().RebuildDependentNameType(T->getKeyword(), 7076 TL.getElaboratedKeywordLoc(), 7077 QualifierLoc, 7078 T->getIdentifier(), 7079 TL.getNameLoc(), 7080 DeducedTSTContext); 7081 if (Result.isNull()) 7082 return QualType(); 7083 7084 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 7085 QualType NamedT = ElabT->getNamedType(); 7086 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 7087 7088 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7089 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7090 NewTL.setQualifierLoc(QualifierLoc); 7091 } else { 7092 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 7093 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7094 NewTL.setQualifierLoc(QualifierLoc); 7095 NewTL.setNameLoc(TL.getNameLoc()); 7096 } 7097 return Result; 7098 } 7099 7100 template<typename Derived> 7101 QualType TreeTransform<Derived>:: 7102 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7103 DependentTemplateSpecializationTypeLoc TL) { 7104 NestedNameSpecifierLoc QualifierLoc; 7105 if (TL.getQualifierLoc()) { 7106 QualifierLoc 7107 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7108 if (!QualifierLoc) 7109 return QualType(); 7110 } 7111 7112 return getDerived() 7113 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 7114 } 7115 7116 template<typename Derived> 7117 QualType TreeTransform<Derived>:: 7118 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7119 DependentTemplateSpecializationTypeLoc TL, 7120 NestedNameSpecifierLoc QualifierLoc) { 7121 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 7122 7123 TemplateArgumentListInfo NewTemplateArgs; 7124 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 7125 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 7126 7127 typedef TemplateArgumentLocContainerIterator< 7128 DependentTemplateSpecializationTypeLoc> ArgIterator; 7129 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 7130 ArgIterator(TL, TL.getNumArgs()), 7131 NewTemplateArgs)) 7132 return QualType(); 7133 7134 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 7135 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 7136 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 7137 /*AllowInjectedClassName*/ false); 7138 if (Result.isNull()) 7139 return QualType(); 7140 7141 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7142 QualType NamedT = ElabT->getNamedType(); 7143 7144 // Copy information relevant to the template specialization. 7145 TemplateSpecializationTypeLoc NamedTL 7146 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7147 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7148 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7149 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7150 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7151 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7152 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7153 7154 // Copy information relevant to the elaborated type. 7155 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7156 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7157 NewTL.setQualifierLoc(QualifierLoc); 7158 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7159 DependentTemplateSpecializationTypeLoc SpecTL 7160 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7161 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7162 SpecTL.setQualifierLoc(QualifierLoc); 7163 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7164 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7165 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7166 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7167 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7168 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7169 } else { 7170 TemplateSpecializationTypeLoc SpecTL 7171 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7172 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7173 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7174 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7175 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7176 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7177 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7178 } 7179 return Result; 7180 } 7181 7182 template<typename Derived> 7183 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7184 PackExpansionTypeLoc TL) { 7185 QualType Pattern 7186 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7187 if (Pattern.isNull()) 7188 return QualType(); 7189 7190 QualType Result = TL.getType(); 7191 if (getDerived().AlwaysRebuild() || 7192 Pattern != TL.getPatternLoc().getType()) { 7193 Result = getDerived().RebuildPackExpansionType(Pattern, 7194 TL.getPatternLoc().getSourceRange(), 7195 TL.getEllipsisLoc(), 7196 TL.getTypePtr()->getNumExpansions()); 7197 if (Result.isNull()) 7198 return QualType(); 7199 } 7200 7201 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7202 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7203 return Result; 7204 } 7205 7206 template<typename Derived> 7207 QualType 7208 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7209 ObjCInterfaceTypeLoc TL) { 7210 // ObjCInterfaceType is never dependent. 7211 TLB.pushFullCopy(TL); 7212 return TL.getType(); 7213 } 7214 7215 template<typename Derived> 7216 QualType 7217 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7218 ObjCTypeParamTypeLoc TL) { 7219 const ObjCTypeParamType *T = TL.getTypePtr(); 7220 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7221 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7222 if (!OTP) 7223 return QualType(); 7224 7225 QualType Result = TL.getType(); 7226 if (getDerived().AlwaysRebuild() || 7227 OTP != T->getDecl()) { 7228 Result = getDerived().RebuildObjCTypeParamType( 7229 OTP, TL.getProtocolLAngleLoc(), 7230 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7231 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7232 if (Result.isNull()) 7233 return QualType(); 7234 } 7235 7236 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7237 if (TL.getNumProtocols()) { 7238 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7239 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7240 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7241 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7242 } 7243 return Result; 7244 } 7245 7246 template<typename Derived> 7247 QualType 7248 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7249 ObjCObjectTypeLoc TL) { 7250 // Transform base type. 7251 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7252 if (BaseType.isNull()) 7253 return QualType(); 7254 7255 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7256 7257 // Transform type arguments. 7258 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7259 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7260 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7261 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7262 QualType TypeArg = TypeArgInfo->getType(); 7263 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7264 AnyChanged = true; 7265 7266 // We have a pack expansion. Instantiate it. 7267 const auto *PackExpansion = PackExpansionLoc.getType() 7268 ->castAs<PackExpansionType>(); 7269 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7270 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7271 Unexpanded); 7272 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7273 7274 // Determine whether the set of unexpanded parameter packs can 7275 // and should be expanded. 7276 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7277 bool Expand = false; 7278 bool RetainExpansion = false; 7279 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7280 if (getDerived().TryExpandParameterPacks( 7281 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7282 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7283 return QualType(); 7284 7285 if (!Expand) { 7286 // We can't expand this pack expansion into separate arguments yet; 7287 // just substitute into the pattern and create a new pack expansion 7288 // type. 7289 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7290 7291 TypeLocBuilder TypeArgBuilder; 7292 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7293 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7294 PatternLoc); 7295 if (NewPatternType.isNull()) 7296 return QualType(); 7297 7298 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7299 NewPatternType, NumExpansions); 7300 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7301 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7302 NewTypeArgInfos.push_back( 7303 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7304 continue; 7305 } 7306 7307 // Substitute into the pack expansion pattern for each slice of the 7308 // pack. 7309 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7310 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7311 7312 TypeLocBuilder TypeArgBuilder; 7313 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7314 7315 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7316 PatternLoc); 7317 if (NewTypeArg.isNull()) 7318 return QualType(); 7319 7320 NewTypeArgInfos.push_back( 7321 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7322 } 7323 7324 continue; 7325 } 7326 7327 TypeLocBuilder TypeArgBuilder; 7328 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7329 QualType NewTypeArg = 7330 getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7331 if (NewTypeArg.isNull()) 7332 return QualType(); 7333 7334 // If nothing changed, just keep the old TypeSourceInfo. 7335 if (NewTypeArg == TypeArg) { 7336 NewTypeArgInfos.push_back(TypeArgInfo); 7337 continue; 7338 } 7339 7340 NewTypeArgInfos.push_back( 7341 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7342 AnyChanged = true; 7343 } 7344 7345 QualType Result = TL.getType(); 7346 if (getDerived().AlwaysRebuild() || AnyChanged) { 7347 // Rebuild the type. 7348 Result = getDerived().RebuildObjCObjectType( 7349 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7350 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7351 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7352 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7353 7354 if (Result.isNull()) 7355 return QualType(); 7356 } 7357 7358 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7359 NewT.setHasBaseTypeAsWritten(true); 7360 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7361 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7362 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7363 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7364 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7365 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7366 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7367 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7368 return Result; 7369 } 7370 7371 template<typename Derived> 7372 QualType 7373 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7374 ObjCObjectPointerTypeLoc TL) { 7375 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7376 if (PointeeType.isNull()) 7377 return QualType(); 7378 7379 QualType Result = TL.getType(); 7380 if (getDerived().AlwaysRebuild() || 7381 PointeeType != TL.getPointeeLoc().getType()) { 7382 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7383 TL.getStarLoc()); 7384 if (Result.isNull()) 7385 return QualType(); 7386 } 7387 7388 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7389 NewT.setStarLoc(TL.getStarLoc()); 7390 return Result; 7391 } 7392 7393 //===----------------------------------------------------------------------===// 7394 // Statement transformation 7395 //===----------------------------------------------------------------------===// 7396 template<typename Derived> 7397 StmtResult 7398 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7399 return S; 7400 } 7401 7402 template<typename Derived> 7403 StmtResult 7404 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7405 return getDerived().TransformCompoundStmt(S, false); 7406 } 7407 7408 template<typename Derived> 7409 StmtResult 7410 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7411 bool IsStmtExpr) { 7412 Sema::CompoundScopeRAII CompoundScope(getSema()); 7413 7414 const Stmt *ExprResult = S->getStmtExprResult(); 7415 bool SubStmtInvalid = false; 7416 bool SubStmtChanged = false; 7417 SmallVector<Stmt*, 8> Statements; 7418 for (auto *B : S->body()) { 7419 StmtResult Result = getDerived().TransformStmt( 7420 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7421 7422 if (Result.isInvalid()) { 7423 // Immediately fail if this was a DeclStmt, since it's very 7424 // likely that this will cause problems for future statements. 7425 if (isa<DeclStmt>(B)) 7426 return StmtError(); 7427 7428 // Otherwise, just keep processing substatements and fail later. 7429 SubStmtInvalid = true; 7430 continue; 7431 } 7432 7433 SubStmtChanged = SubStmtChanged || Result.get() != B; 7434 Statements.push_back(Result.getAs<Stmt>()); 7435 } 7436 7437 if (SubStmtInvalid) 7438 return StmtError(); 7439 7440 if (!getDerived().AlwaysRebuild() && 7441 !SubStmtChanged) 7442 return S; 7443 7444 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7445 Statements, 7446 S->getRBracLoc(), 7447 IsStmtExpr); 7448 } 7449 7450 template<typename Derived> 7451 StmtResult 7452 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7453 ExprResult LHS, RHS; 7454 { 7455 EnterExpressionEvaluationContext Unevaluated( 7456 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7457 7458 // Transform the left-hand case value. 7459 LHS = getDerived().TransformExpr(S->getLHS()); 7460 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7461 if (LHS.isInvalid()) 7462 return StmtError(); 7463 7464 // Transform the right-hand case value (for the GNU case-range extension). 7465 RHS = getDerived().TransformExpr(S->getRHS()); 7466 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7467 if (RHS.isInvalid()) 7468 return StmtError(); 7469 } 7470 7471 // Build the case statement. 7472 // Case statements are always rebuilt so that they will attached to their 7473 // transformed switch statement. 7474 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7475 LHS.get(), 7476 S->getEllipsisLoc(), 7477 RHS.get(), 7478 S->getColonLoc()); 7479 if (Case.isInvalid()) 7480 return StmtError(); 7481 7482 // Transform the statement following the case 7483 StmtResult SubStmt = 7484 getDerived().TransformStmt(S->getSubStmt()); 7485 if (SubStmt.isInvalid()) 7486 return StmtError(); 7487 7488 // Attach the body to the case statement 7489 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7490 } 7491 7492 template <typename Derived> 7493 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7494 // Transform the statement following the default case 7495 StmtResult SubStmt = 7496 getDerived().TransformStmt(S->getSubStmt()); 7497 if (SubStmt.isInvalid()) 7498 return StmtError(); 7499 7500 // Default statements are always rebuilt 7501 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7502 SubStmt.get()); 7503 } 7504 7505 template<typename Derived> 7506 StmtResult 7507 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7508 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7509 if (SubStmt.isInvalid()) 7510 return StmtError(); 7511 7512 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7513 S->getDecl()); 7514 if (!LD) 7515 return StmtError(); 7516 7517 // If we're transforming "in-place" (we're not creating new local 7518 // declarations), assume we're replacing the old label statement 7519 // and clear out the reference to it. 7520 if (LD == S->getDecl()) 7521 S->getDecl()->setStmt(nullptr); 7522 7523 // FIXME: Pass the real colon location in. 7524 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7525 cast<LabelDecl>(LD), SourceLocation(), 7526 SubStmt.get()); 7527 } 7528 7529 template <typename Derived> 7530 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7531 if (!R) 7532 return R; 7533 7534 switch (R->getKind()) { 7535 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7536 #define ATTR(X) 7537 #define PRAGMA_SPELLING_ATTR(X) \ 7538 case attr::X: \ 7539 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7540 #include "clang/Basic/AttrList.inc" 7541 default: 7542 return R; 7543 } 7544 } 7545 7546 template <typename Derived> 7547 StmtResult 7548 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7549 StmtDiscardKind SDK) { 7550 bool AttrsChanged = false; 7551 SmallVector<const Attr *, 1> Attrs; 7552 7553 // Visit attributes and keep track if any are transformed. 7554 for (const auto *I : S->getAttrs()) { 7555 const Attr *R = getDerived().TransformAttr(I); 7556 AttrsChanged |= (I != R); 7557 if (R) 7558 Attrs.push_back(R); 7559 } 7560 7561 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7562 if (SubStmt.isInvalid()) 7563 return StmtError(); 7564 7565 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7566 return S; 7567 7568 // If transforming the attributes failed for all of the attributes in the 7569 // statement, don't make an AttributedStmt without attributes. 7570 if (Attrs.empty()) 7571 return SubStmt; 7572 7573 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7574 SubStmt.get()); 7575 } 7576 7577 template<typename Derived> 7578 StmtResult 7579 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7580 // Transform the initialization statement 7581 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7582 if (Init.isInvalid()) 7583 return StmtError(); 7584 7585 Sema::ConditionResult Cond; 7586 if (!S->isConsteval()) { 7587 // Transform the condition 7588 Cond = getDerived().TransformCondition( 7589 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7590 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7591 : Sema::ConditionKind::Boolean); 7592 if (Cond.isInvalid()) 7593 return StmtError(); 7594 } 7595 7596 // If this is a constexpr if, determine which arm we should instantiate. 7597 std::optional<bool> ConstexprConditionValue; 7598 if (S->isConstexpr()) 7599 ConstexprConditionValue = Cond.getKnownValue(); 7600 7601 // Transform the "then" branch. 7602 StmtResult Then; 7603 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7604 Then = getDerived().TransformStmt(S->getThen()); 7605 if (Then.isInvalid()) 7606 return StmtError(); 7607 } else { 7608 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7609 } 7610 7611 // Transform the "else" branch. 7612 StmtResult Else; 7613 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7614 Else = getDerived().TransformStmt(S->getElse()); 7615 if (Else.isInvalid()) 7616 return StmtError(); 7617 } 7618 7619 if (!getDerived().AlwaysRebuild() && 7620 Init.get() == S->getInit() && 7621 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7622 Then.get() == S->getThen() && 7623 Else.get() == S->getElse()) 7624 return S; 7625 7626 return getDerived().RebuildIfStmt( 7627 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7628 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7629 } 7630 7631 template<typename Derived> 7632 StmtResult 7633 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7634 // Transform the initialization statement 7635 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7636 if (Init.isInvalid()) 7637 return StmtError(); 7638 7639 // Transform the condition. 7640 Sema::ConditionResult Cond = getDerived().TransformCondition( 7641 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7642 Sema::ConditionKind::Switch); 7643 if (Cond.isInvalid()) 7644 return StmtError(); 7645 7646 // Rebuild the switch statement. 7647 StmtResult Switch = 7648 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7649 Init.get(), Cond, S->getRParenLoc()); 7650 if (Switch.isInvalid()) 7651 return StmtError(); 7652 7653 // Transform the body of the switch statement. 7654 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7655 if (Body.isInvalid()) 7656 return StmtError(); 7657 7658 // Complete the switch statement. 7659 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7660 Body.get()); 7661 } 7662 7663 template<typename Derived> 7664 StmtResult 7665 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7666 // Transform the condition 7667 Sema::ConditionResult Cond = getDerived().TransformCondition( 7668 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7669 Sema::ConditionKind::Boolean); 7670 if (Cond.isInvalid()) 7671 return StmtError(); 7672 7673 // Transform the body 7674 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7675 if (Body.isInvalid()) 7676 return StmtError(); 7677 7678 if (!getDerived().AlwaysRebuild() && 7679 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7680 Body.get() == S->getBody()) 7681 return Owned(S); 7682 7683 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7684 Cond, S->getRParenLoc(), Body.get()); 7685 } 7686 7687 template<typename Derived> 7688 StmtResult 7689 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7690 // Transform the body 7691 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7692 if (Body.isInvalid()) 7693 return StmtError(); 7694 7695 // Transform the condition 7696 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7697 if (Cond.isInvalid()) 7698 return StmtError(); 7699 7700 if (!getDerived().AlwaysRebuild() && 7701 Cond.get() == S->getCond() && 7702 Body.get() == S->getBody()) 7703 return S; 7704 7705 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7706 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7707 S->getRParenLoc()); 7708 } 7709 7710 template<typename Derived> 7711 StmtResult 7712 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7713 if (getSema().getLangOpts().OpenMP) 7714 getSema().startOpenMPLoop(); 7715 7716 // Transform the initialization statement 7717 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7718 if (Init.isInvalid()) 7719 return StmtError(); 7720 7721 // In OpenMP loop region loop control variable must be captured and be 7722 // private. Perform analysis of first part (if any). 7723 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7724 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7725 7726 // Transform the condition 7727 Sema::ConditionResult Cond = getDerived().TransformCondition( 7728 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7729 Sema::ConditionKind::Boolean); 7730 if (Cond.isInvalid()) 7731 return StmtError(); 7732 7733 // Transform the increment 7734 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7735 if (Inc.isInvalid()) 7736 return StmtError(); 7737 7738 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7739 if (S->getInc() && !FullInc.get()) 7740 return StmtError(); 7741 7742 // Transform the body 7743 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7744 if (Body.isInvalid()) 7745 return StmtError(); 7746 7747 if (!getDerived().AlwaysRebuild() && 7748 Init.get() == S->getInit() && 7749 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7750 Inc.get() == S->getInc() && 7751 Body.get() == S->getBody()) 7752 return S; 7753 7754 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7755 Init.get(), Cond, FullInc, 7756 S->getRParenLoc(), Body.get()); 7757 } 7758 7759 template<typename Derived> 7760 StmtResult 7761 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7762 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7763 S->getLabel()); 7764 if (!LD) 7765 return StmtError(); 7766 7767 // Goto statements must always be rebuilt, to resolve the label. 7768 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7769 cast<LabelDecl>(LD)); 7770 } 7771 7772 template<typename Derived> 7773 StmtResult 7774 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7775 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7776 if (Target.isInvalid()) 7777 return StmtError(); 7778 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7779 7780 if (!getDerived().AlwaysRebuild() && 7781 Target.get() == S->getTarget()) 7782 return S; 7783 7784 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7785 Target.get()); 7786 } 7787 7788 template<typename Derived> 7789 StmtResult 7790 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7791 return S; 7792 } 7793 7794 template<typename Derived> 7795 StmtResult 7796 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7797 return S; 7798 } 7799 7800 template<typename Derived> 7801 StmtResult 7802 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7803 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7804 /*NotCopyInit*/false); 7805 if (Result.isInvalid()) 7806 return StmtError(); 7807 7808 // FIXME: We always rebuild the return statement because there is no way 7809 // to tell whether the return type of the function has changed. 7810 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7811 } 7812 7813 template<typename Derived> 7814 StmtResult 7815 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7816 bool DeclChanged = false; 7817 SmallVector<Decl *, 4> Decls; 7818 for (auto *D : S->decls()) { 7819 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7820 if (!Transformed) 7821 return StmtError(); 7822 7823 if (Transformed != D) 7824 DeclChanged = true; 7825 7826 Decls.push_back(Transformed); 7827 } 7828 7829 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7830 return S; 7831 7832 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7833 } 7834 7835 template<typename Derived> 7836 StmtResult 7837 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7838 7839 SmallVector<Expr*, 8> Constraints; 7840 SmallVector<Expr*, 8> Exprs; 7841 SmallVector<IdentifierInfo *, 4> Names; 7842 7843 ExprResult AsmString; 7844 SmallVector<Expr*, 8> Clobbers; 7845 7846 bool ExprsChanged = false; 7847 7848 // Go through the outputs. 7849 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7850 Names.push_back(S->getOutputIdentifier(I)); 7851 7852 // No need to transform the constraint literal. 7853 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7854 7855 // Transform the output expr. 7856 Expr *OutputExpr = S->getOutputExpr(I); 7857 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7858 if (Result.isInvalid()) 7859 return StmtError(); 7860 7861 ExprsChanged |= Result.get() != OutputExpr; 7862 7863 Exprs.push_back(Result.get()); 7864 } 7865 7866 // Go through the inputs. 7867 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7868 Names.push_back(S->getInputIdentifier(I)); 7869 7870 // No need to transform the constraint literal. 7871 Constraints.push_back(S->getInputConstraintLiteral(I)); 7872 7873 // Transform the input expr. 7874 Expr *InputExpr = S->getInputExpr(I); 7875 ExprResult Result = getDerived().TransformExpr(InputExpr); 7876 if (Result.isInvalid()) 7877 return StmtError(); 7878 7879 ExprsChanged |= Result.get() != InputExpr; 7880 7881 Exprs.push_back(Result.get()); 7882 } 7883 7884 // Go through the Labels. 7885 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7886 Names.push_back(S->getLabelIdentifier(I)); 7887 7888 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7889 if (Result.isInvalid()) 7890 return StmtError(); 7891 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7892 Exprs.push_back(Result.get()); 7893 } 7894 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7895 return S; 7896 7897 // Go through the clobbers. 7898 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7899 Clobbers.push_back(S->getClobberStringLiteral(I)); 7900 7901 // No need to transform the asm string literal. 7902 AsmString = S->getAsmString(); 7903 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7904 S->isVolatile(), S->getNumOutputs(), 7905 S->getNumInputs(), Names.data(), 7906 Constraints, Exprs, AsmString.get(), 7907 Clobbers, S->getNumLabels(), 7908 S->getRParenLoc()); 7909 } 7910 7911 template<typename Derived> 7912 StmtResult 7913 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7914 ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7915 7916 bool HadError = false, HadChange = false; 7917 7918 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7919 SmallVector<Expr*, 8> TransformedExprs; 7920 TransformedExprs.reserve(SrcExprs.size()); 7921 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7922 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7923 if (!Result.isUsable()) { 7924 HadError = true; 7925 } else { 7926 HadChange |= (Result.get() != SrcExprs[i]); 7927 TransformedExprs.push_back(Result.get()); 7928 } 7929 } 7930 7931 if (HadError) return StmtError(); 7932 if (!HadChange && !getDerived().AlwaysRebuild()) 7933 return Owned(S); 7934 7935 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7936 AsmToks, S->getAsmString(), 7937 S->getNumOutputs(), S->getNumInputs(), 7938 S->getAllConstraints(), S->getClobbers(), 7939 TransformedExprs, S->getEndLoc()); 7940 } 7941 7942 // C++ Coroutines TS 7943 7944 template<typename Derived> 7945 StmtResult 7946 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7947 auto *ScopeInfo = SemaRef.getCurFunction(); 7948 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7949 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7950 ScopeInfo->NeedsCoroutineSuspends && 7951 ScopeInfo->CoroutineSuspends.first == nullptr && 7952 ScopeInfo->CoroutineSuspends.second == nullptr && 7953 "expected clean scope info"); 7954 7955 // Set that we have (possibly-invalid) suspend points before we do anything 7956 // that may fail. 7957 ScopeInfo->setNeedsCoroutineSuspends(false); 7958 7959 // We re-build the coroutine promise object (and the coroutine parameters its 7960 // type and constructor depend on) based on the types used in our current 7961 // function. We must do so, and set it on the current FunctionScopeInfo, 7962 // before attempting to transform the other parts of the coroutine body 7963 // statement, such as the implicit suspend statements (because those 7964 // statements reference the FunctionScopeInfo::CoroutinePromise). 7965 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7966 return StmtError(); 7967 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7968 if (!Promise) 7969 return StmtError(); 7970 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7971 ScopeInfo->CoroutinePromise = Promise; 7972 7973 // Transform the implicit coroutine statements constructed using dependent 7974 // types during the previous parse: initial and final suspensions, the return 7975 // object, and others. We also transform the coroutine function's body. 7976 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7977 if (InitSuspend.isInvalid()) 7978 return StmtError(); 7979 StmtResult FinalSuspend = 7980 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7981 if (FinalSuspend.isInvalid() || 7982 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7983 return StmtError(); 7984 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7985 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7986 7987 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7988 if (BodyRes.isInvalid()) 7989 return StmtError(); 7990 7991 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7992 if (Builder.isInvalid()) 7993 return StmtError(); 7994 7995 Expr *ReturnObject = S->getReturnValueInit(); 7996 assert(ReturnObject && "the return object is expected to be valid"); 7997 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7998 /*NoCopyInit*/ false); 7999 if (Res.isInvalid()) 8000 return StmtError(); 8001 Builder.ReturnValue = Res.get(); 8002 8003 // If during the previous parse the coroutine still had a dependent promise 8004 // statement, we may need to build some implicit coroutine statements 8005 // (such as exception and fallthrough handlers) for the first time. 8006 if (S->hasDependentPromiseType()) { 8007 // We can only build these statements, however, if the current promise type 8008 // is not dependent. 8009 if (!Promise->getType()->isDependentType()) { 8010 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 8011 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 8012 "these nodes should not have been built yet"); 8013 if (!Builder.buildDependentStatements()) 8014 return StmtError(); 8015 } 8016 } else { 8017 if (auto *OnFallthrough = S->getFallthroughHandler()) { 8018 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 8019 if (Res.isInvalid()) 8020 return StmtError(); 8021 Builder.OnFallthrough = Res.get(); 8022 } 8023 8024 if (auto *OnException = S->getExceptionHandler()) { 8025 StmtResult Res = getDerived().TransformStmt(OnException); 8026 if (Res.isInvalid()) 8027 return StmtError(); 8028 Builder.OnException = Res.get(); 8029 } 8030 8031 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 8032 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 8033 if (Res.isInvalid()) 8034 return StmtError(); 8035 Builder.ReturnStmtOnAllocFailure = Res.get(); 8036 } 8037 8038 // Transform any additional statements we may have already built 8039 assert(S->getAllocate() && S->getDeallocate() && 8040 "allocation and deallocation calls must already be built"); 8041 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 8042 if (AllocRes.isInvalid()) 8043 return StmtError(); 8044 Builder.Allocate = AllocRes.get(); 8045 8046 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 8047 if (DeallocRes.isInvalid()) 8048 return StmtError(); 8049 Builder.Deallocate = DeallocRes.get(); 8050 8051 if (auto *ReturnStmt = S->getReturnStmt()) { 8052 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 8053 if (Res.isInvalid()) 8054 return StmtError(); 8055 Builder.ReturnStmt = Res.get(); 8056 } 8057 } 8058 8059 return getDerived().RebuildCoroutineBodyStmt(Builder); 8060 } 8061 8062 template<typename Derived> 8063 StmtResult 8064 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 8065 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 8066 /*NotCopyInit*/false); 8067 if (Result.isInvalid()) 8068 return StmtError(); 8069 8070 // Always rebuild; we don't know if this needs to be injected into a new 8071 // context or if the promise type has changed. 8072 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 8073 S->isImplicit()); 8074 } 8075 8076 template <typename Derived> 8077 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 8078 ExprResult Operand = getDerived().TransformInitializer(E->getOperand(), 8079 /*NotCopyInit*/ false); 8080 if (Operand.isInvalid()) 8081 return ExprError(); 8082 8083 // Rebuild the common-expr from the operand rather than transforming it 8084 // separately. 8085 8086 // FIXME: getCurScope() should not be used during template instantiation. 8087 // We should pick up the set of unqualified lookup results for operator 8088 // co_await during the initial parse. 8089 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr( 8090 getSema().getCurScope(), E->getKeywordLoc()); 8091 8092 // Always rebuild; we don't know if this needs to be injected into a new 8093 // context or if the promise type has changed. 8094 return getDerived().RebuildCoawaitExpr( 8095 E->getKeywordLoc(), Operand.get(), 8096 cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit()); 8097 } 8098 8099 template <typename Derived> 8100 ExprResult 8101 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 8102 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 8103 /*NotCopyInit*/ false); 8104 if (OperandResult.isInvalid()) 8105 return ExprError(); 8106 8107 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 8108 E->getOperatorCoawaitLookup()); 8109 8110 if (LookupResult.isInvalid()) 8111 return ExprError(); 8112 8113 // Always rebuild; we don't know if this needs to be injected into a new 8114 // context or if the promise type has changed. 8115 return getDerived().RebuildDependentCoawaitExpr( 8116 E->getKeywordLoc(), OperandResult.get(), 8117 cast<UnresolvedLookupExpr>(LookupResult.get())); 8118 } 8119 8120 template<typename Derived> 8121 ExprResult 8122 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 8123 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 8124 /*NotCopyInit*/false); 8125 if (Result.isInvalid()) 8126 return ExprError(); 8127 8128 // Always rebuild; we don't know if this needs to be injected into a new 8129 // context or if the promise type has changed. 8130 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 8131 } 8132 8133 // Objective-C Statements. 8134 8135 template<typename Derived> 8136 StmtResult 8137 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 8138 // Transform the body of the @try. 8139 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 8140 if (TryBody.isInvalid()) 8141 return StmtError(); 8142 8143 // Transform the @catch statements (if present). 8144 bool AnyCatchChanged = false; 8145 SmallVector<Stmt*, 8> CatchStmts; 8146 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8147 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8148 if (Catch.isInvalid()) 8149 return StmtError(); 8150 if (Catch.get() != S->getCatchStmt(I)) 8151 AnyCatchChanged = true; 8152 CatchStmts.push_back(Catch.get()); 8153 } 8154 8155 // Transform the @finally statement (if present). 8156 StmtResult Finally; 8157 if (S->getFinallyStmt()) { 8158 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8159 if (Finally.isInvalid()) 8160 return StmtError(); 8161 } 8162 8163 // If nothing changed, just retain this statement. 8164 if (!getDerived().AlwaysRebuild() && 8165 TryBody.get() == S->getTryBody() && 8166 !AnyCatchChanged && 8167 Finally.get() == S->getFinallyStmt()) 8168 return S; 8169 8170 // Build a new statement. 8171 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8172 CatchStmts, Finally.get()); 8173 } 8174 8175 template<typename Derived> 8176 StmtResult 8177 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8178 // Transform the @catch parameter, if there is one. 8179 VarDecl *Var = nullptr; 8180 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8181 TypeSourceInfo *TSInfo = nullptr; 8182 if (FromVar->getTypeSourceInfo()) { 8183 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8184 if (!TSInfo) 8185 return StmtError(); 8186 } 8187 8188 QualType T; 8189 if (TSInfo) 8190 T = TSInfo->getType(); 8191 else { 8192 T = getDerived().TransformType(FromVar->getType()); 8193 if (T.isNull()) 8194 return StmtError(); 8195 } 8196 8197 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8198 if (!Var) 8199 return StmtError(); 8200 } 8201 8202 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8203 if (Body.isInvalid()) 8204 return StmtError(); 8205 8206 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8207 S->getRParenLoc(), 8208 Var, Body.get()); 8209 } 8210 8211 template<typename Derived> 8212 StmtResult 8213 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8214 // Transform the body. 8215 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8216 if (Body.isInvalid()) 8217 return StmtError(); 8218 8219 // If nothing changed, just retain this statement. 8220 if (!getDerived().AlwaysRebuild() && 8221 Body.get() == S->getFinallyBody()) 8222 return S; 8223 8224 // Build a new statement. 8225 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8226 Body.get()); 8227 } 8228 8229 template<typename Derived> 8230 StmtResult 8231 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8232 ExprResult Operand; 8233 if (S->getThrowExpr()) { 8234 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8235 if (Operand.isInvalid()) 8236 return StmtError(); 8237 } 8238 8239 if (!getDerived().AlwaysRebuild() && 8240 Operand.get() == S->getThrowExpr()) 8241 return S; 8242 8243 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8244 } 8245 8246 template<typename Derived> 8247 StmtResult 8248 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8249 ObjCAtSynchronizedStmt *S) { 8250 // Transform the object we are locking. 8251 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8252 if (Object.isInvalid()) 8253 return StmtError(); 8254 Object = 8255 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8256 Object.get()); 8257 if (Object.isInvalid()) 8258 return StmtError(); 8259 8260 // Transform the body. 8261 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8262 if (Body.isInvalid()) 8263 return StmtError(); 8264 8265 // If nothing change, just retain the current statement. 8266 if (!getDerived().AlwaysRebuild() && 8267 Object.get() == S->getSynchExpr() && 8268 Body.get() == S->getSynchBody()) 8269 return S; 8270 8271 // Build a new statement. 8272 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8273 Object.get(), Body.get()); 8274 } 8275 8276 template<typename Derived> 8277 StmtResult 8278 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8279 ObjCAutoreleasePoolStmt *S) { 8280 // Transform the body. 8281 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8282 if (Body.isInvalid()) 8283 return StmtError(); 8284 8285 // If nothing changed, just retain this statement. 8286 if (!getDerived().AlwaysRebuild() && 8287 Body.get() == S->getSubStmt()) 8288 return S; 8289 8290 // Build a new statement. 8291 return getDerived().RebuildObjCAutoreleasePoolStmt( 8292 S->getAtLoc(), Body.get()); 8293 } 8294 8295 template<typename Derived> 8296 StmtResult 8297 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8298 ObjCForCollectionStmt *S) { 8299 // Transform the element statement. 8300 StmtResult Element = 8301 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8302 if (Element.isInvalid()) 8303 return StmtError(); 8304 8305 // Transform the collection expression. 8306 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8307 if (Collection.isInvalid()) 8308 return StmtError(); 8309 8310 // Transform the body. 8311 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8312 if (Body.isInvalid()) 8313 return StmtError(); 8314 8315 // If nothing changed, just retain this statement. 8316 if (!getDerived().AlwaysRebuild() && 8317 Element.get() == S->getElement() && 8318 Collection.get() == S->getCollection() && 8319 Body.get() == S->getBody()) 8320 return S; 8321 8322 // Build a new statement. 8323 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8324 Element.get(), 8325 Collection.get(), 8326 S->getRParenLoc(), 8327 Body.get()); 8328 } 8329 8330 template <typename Derived> 8331 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8332 // Transform the exception declaration, if any. 8333 VarDecl *Var = nullptr; 8334 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8335 TypeSourceInfo *T = 8336 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8337 if (!T) 8338 return StmtError(); 8339 8340 Var = getDerived().RebuildExceptionDecl( 8341 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8342 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8343 if (!Var || Var->isInvalidDecl()) 8344 return StmtError(); 8345 } 8346 8347 // Transform the actual exception handler. 8348 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8349 if (Handler.isInvalid()) 8350 return StmtError(); 8351 8352 if (!getDerived().AlwaysRebuild() && !Var && 8353 Handler.get() == S->getHandlerBlock()) 8354 return S; 8355 8356 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8357 } 8358 8359 template <typename Derived> 8360 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8361 // Transform the try block itself. 8362 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8363 if (TryBlock.isInvalid()) 8364 return StmtError(); 8365 8366 // Transform the handlers. 8367 bool HandlerChanged = false; 8368 SmallVector<Stmt *, 8> Handlers; 8369 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8370 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8371 if (Handler.isInvalid()) 8372 return StmtError(); 8373 8374 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8375 Handlers.push_back(Handler.getAs<Stmt>()); 8376 } 8377 8378 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8379 !HandlerChanged) 8380 return S; 8381 8382 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8383 Handlers); 8384 } 8385 8386 template<typename Derived> 8387 StmtResult 8388 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8389 StmtResult Init = 8390 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8391 if (Init.isInvalid()) 8392 return StmtError(); 8393 8394 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8395 if (Range.isInvalid()) 8396 return StmtError(); 8397 8398 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8399 if (Begin.isInvalid()) 8400 return StmtError(); 8401 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8402 if (End.isInvalid()) 8403 return StmtError(); 8404 8405 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8406 if (Cond.isInvalid()) 8407 return StmtError(); 8408 if (Cond.get()) 8409 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8410 if (Cond.isInvalid()) 8411 return StmtError(); 8412 if (Cond.get()) 8413 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8414 8415 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8416 if (Inc.isInvalid()) 8417 return StmtError(); 8418 if (Inc.get()) 8419 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8420 8421 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8422 if (LoopVar.isInvalid()) 8423 return StmtError(); 8424 8425 StmtResult NewStmt = S; 8426 if (getDerived().AlwaysRebuild() || 8427 Init.get() != S->getInit() || 8428 Range.get() != S->getRangeStmt() || 8429 Begin.get() != S->getBeginStmt() || 8430 End.get() != S->getEndStmt() || 8431 Cond.get() != S->getCond() || 8432 Inc.get() != S->getInc() || 8433 LoopVar.get() != S->getLoopVarStmt()) { 8434 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8435 S->getCoawaitLoc(), Init.get(), 8436 S->getColonLoc(), Range.get(), 8437 Begin.get(), End.get(), 8438 Cond.get(), 8439 Inc.get(), LoopVar.get(), 8440 S->getRParenLoc()); 8441 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8442 // Might not have attached any initializer to the loop variable. 8443 getSema().ActOnInitializerError( 8444 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8445 return StmtError(); 8446 } 8447 } 8448 8449 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8450 if (Body.isInvalid()) 8451 return StmtError(); 8452 8453 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8454 // it now so we have a new statement to attach the body to. 8455 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8456 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8457 S->getCoawaitLoc(), Init.get(), 8458 S->getColonLoc(), Range.get(), 8459 Begin.get(), End.get(), 8460 Cond.get(), 8461 Inc.get(), LoopVar.get(), 8462 S->getRParenLoc()); 8463 if (NewStmt.isInvalid()) 8464 return StmtError(); 8465 } 8466 8467 if (NewStmt.get() == S) 8468 return S; 8469 8470 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8471 } 8472 8473 template<typename Derived> 8474 StmtResult 8475 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8476 MSDependentExistsStmt *S) { 8477 // Transform the nested-name-specifier, if any. 8478 NestedNameSpecifierLoc QualifierLoc; 8479 if (S->getQualifierLoc()) { 8480 QualifierLoc 8481 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8482 if (!QualifierLoc) 8483 return StmtError(); 8484 } 8485 8486 // Transform the declaration name. 8487 DeclarationNameInfo NameInfo = S->getNameInfo(); 8488 if (NameInfo.getName()) { 8489 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8490 if (!NameInfo.getName()) 8491 return StmtError(); 8492 } 8493 8494 // Check whether anything changed. 8495 if (!getDerived().AlwaysRebuild() && 8496 QualifierLoc == S->getQualifierLoc() && 8497 NameInfo.getName() == S->getNameInfo().getName()) 8498 return S; 8499 8500 // Determine whether this name exists, if we can. 8501 CXXScopeSpec SS; 8502 SS.Adopt(QualifierLoc); 8503 bool Dependent = false; 8504 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8505 case Sema::IER_Exists: 8506 if (S->isIfExists()) 8507 break; 8508 8509 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8510 8511 case Sema::IER_DoesNotExist: 8512 if (S->isIfNotExists()) 8513 break; 8514 8515 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8516 8517 case Sema::IER_Dependent: 8518 Dependent = true; 8519 break; 8520 8521 case Sema::IER_Error: 8522 return StmtError(); 8523 } 8524 8525 // We need to continue with the instantiation, so do so now. 8526 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8527 if (SubStmt.isInvalid()) 8528 return StmtError(); 8529 8530 // If we have resolved the name, just transform to the substatement. 8531 if (!Dependent) 8532 return SubStmt; 8533 8534 // The name is still dependent, so build a dependent expression again. 8535 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8536 S->isIfExists(), 8537 QualifierLoc, 8538 NameInfo, 8539 SubStmt.get()); 8540 } 8541 8542 template<typename Derived> 8543 ExprResult 8544 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8545 NestedNameSpecifierLoc QualifierLoc; 8546 if (E->getQualifierLoc()) { 8547 QualifierLoc 8548 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8549 if (!QualifierLoc) 8550 return ExprError(); 8551 } 8552 8553 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8554 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8555 if (!PD) 8556 return ExprError(); 8557 8558 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8559 if (Base.isInvalid()) 8560 return ExprError(); 8561 8562 return new (SemaRef.getASTContext()) 8563 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8564 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8565 QualifierLoc, E->getMemberLoc()); 8566 } 8567 8568 template <typename Derived> 8569 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8570 MSPropertySubscriptExpr *E) { 8571 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8572 if (BaseRes.isInvalid()) 8573 return ExprError(); 8574 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8575 if (IdxRes.isInvalid()) 8576 return ExprError(); 8577 8578 if (!getDerived().AlwaysRebuild() && 8579 BaseRes.get() == E->getBase() && 8580 IdxRes.get() == E->getIdx()) 8581 return E; 8582 8583 return getDerived().RebuildArraySubscriptExpr( 8584 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8585 } 8586 8587 template <typename Derived> 8588 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8589 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8590 if (TryBlock.isInvalid()) 8591 return StmtError(); 8592 8593 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8594 if (Handler.isInvalid()) 8595 return StmtError(); 8596 8597 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8598 Handler.get() == S->getHandler()) 8599 return S; 8600 8601 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8602 TryBlock.get(), Handler.get()); 8603 } 8604 8605 template <typename Derived> 8606 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8607 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8608 if (Block.isInvalid()) 8609 return StmtError(); 8610 8611 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8612 } 8613 8614 template <typename Derived> 8615 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8616 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8617 if (FilterExpr.isInvalid()) 8618 return StmtError(); 8619 8620 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8621 if (Block.isInvalid()) 8622 return StmtError(); 8623 8624 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8625 Block.get()); 8626 } 8627 8628 template <typename Derived> 8629 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8630 if (isa<SEHFinallyStmt>(Handler)) 8631 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8632 else 8633 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8634 } 8635 8636 template<typename Derived> 8637 StmtResult 8638 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8639 return S; 8640 } 8641 8642 //===----------------------------------------------------------------------===// 8643 // OpenMP directive transformation 8644 //===----------------------------------------------------------------------===// 8645 8646 template <typename Derived> 8647 StmtResult 8648 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8649 // OMPCanonicalLoops are eliminated during transformation, since they will be 8650 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8651 // after transformation. 8652 return getDerived().TransformStmt(L->getLoopStmt()); 8653 } 8654 8655 template <typename Derived> 8656 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8657 OMPExecutableDirective *D) { 8658 8659 // Transform the clauses 8660 llvm::SmallVector<OMPClause *, 16> TClauses; 8661 ArrayRef<OMPClause *> Clauses = D->clauses(); 8662 TClauses.reserve(Clauses.size()); 8663 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8664 I != E; ++I) { 8665 if (*I) { 8666 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8667 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8668 getDerived().getSema().EndOpenMPClause(); 8669 if (Clause) 8670 TClauses.push_back(Clause); 8671 } else { 8672 TClauses.push_back(nullptr); 8673 } 8674 } 8675 StmtResult AssociatedStmt; 8676 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8677 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8678 /*CurScope=*/nullptr); 8679 StmtResult Body; 8680 { 8681 Sema::CompoundScopeRAII CompoundScope(getSema()); 8682 Stmt *CS; 8683 if (D->getDirectiveKind() == OMPD_atomic || 8684 D->getDirectiveKind() == OMPD_critical || 8685 D->getDirectiveKind() == OMPD_section || 8686 D->getDirectiveKind() == OMPD_master) 8687 CS = D->getAssociatedStmt(); 8688 else 8689 CS = D->getRawStmt(); 8690 Body = getDerived().TransformStmt(CS); 8691 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8692 getSema().getLangOpts().OpenMPIRBuilder) 8693 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8694 } 8695 AssociatedStmt = 8696 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8697 if (AssociatedStmt.isInvalid()) { 8698 return StmtError(); 8699 } 8700 } 8701 if (TClauses.size() != Clauses.size()) { 8702 return StmtError(); 8703 } 8704 8705 // Transform directive name for 'omp critical' directive. 8706 DeclarationNameInfo DirName; 8707 if (D->getDirectiveKind() == OMPD_critical) { 8708 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8709 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8710 } 8711 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8712 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8713 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8714 } else if (D->getDirectiveKind() == OMPD_cancel) { 8715 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8716 } 8717 8718 return getDerived().RebuildOMPExecutableDirective( 8719 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8720 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8721 } 8722 8723 template <typename Derived> 8724 StmtResult 8725 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8726 // TODO: Fix This 8727 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8728 << getOpenMPDirectiveName(D->getDirectiveKind()); 8729 return StmtError(); 8730 } 8731 8732 template <typename Derived> 8733 StmtResult 8734 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8735 DeclarationNameInfo DirName; 8736 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8737 D->getBeginLoc()); 8738 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8739 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8740 return Res; 8741 } 8742 8743 template <typename Derived> 8744 StmtResult 8745 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8746 DeclarationNameInfo DirName; 8747 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8748 D->getBeginLoc()); 8749 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8750 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8751 return Res; 8752 } 8753 8754 template <typename Derived> 8755 StmtResult 8756 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8757 DeclarationNameInfo DirName; 8758 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8759 nullptr, D->getBeginLoc()); 8760 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8761 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8762 return Res; 8763 } 8764 8765 template <typename Derived> 8766 StmtResult 8767 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8768 DeclarationNameInfo DirName; 8769 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8770 nullptr, D->getBeginLoc()); 8771 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8772 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8773 return Res; 8774 } 8775 8776 template <typename Derived> 8777 StmtResult 8778 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8779 DeclarationNameInfo DirName; 8780 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8781 D->getBeginLoc()); 8782 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8783 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8784 return Res; 8785 } 8786 8787 template <typename Derived> 8788 StmtResult 8789 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8790 DeclarationNameInfo DirName; 8791 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8792 D->getBeginLoc()); 8793 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8794 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8795 return Res; 8796 } 8797 8798 template <typename Derived> 8799 StmtResult 8800 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8801 DeclarationNameInfo DirName; 8802 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8803 D->getBeginLoc()); 8804 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8805 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8806 return Res; 8807 } 8808 8809 template <typename Derived> 8810 StmtResult 8811 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8812 DeclarationNameInfo DirName; 8813 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8814 D->getBeginLoc()); 8815 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8816 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8817 return Res; 8818 } 8819 8820 template <typename Derived> 8821 StmtResult 8822 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8823 DeclarationNameInfo DirName; 8824 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8825 D->getBeginLoc()); 8826 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8827 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8828 return Res; 8829 } 8830 8831 template <typename Derived> 8832 StmtResult 8833 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8834 DeclarationNameInfo DirName; 8835 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8836 D->getBeginLoc()); 8837 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8838 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8839 return Res; 8840 } 8841 8842 template <typename Derived> 8843 StmtResult 8844 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8845 getDerived().getSema().StartOpenMPDSABlock( 8846 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8847 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8848 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8849 return Res; 8850 } 8851 8852 template <typename Derived> 8853 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8854 OMPParallelForDirective *D) { 8855 DeclarationNameInfo DirName; 8856 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8857 nullptr, D->getBeginLoc()); 8858 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8859 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8860 return Res; 8861 } 8862 8863 template <typename Derived> 8864 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8865 OMPParallelForSimdDirective *D) { 8866 DeclarationNameInfo DirName; 8867 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8868 nullptr, D->getBeginLoc()); 8869 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8870 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8871 return Res; 8872 } 8873 8874 template <typename Derived> 8875 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8876 OMPParallelMasterDirective *D) { 8877 DeclarationNameInfo DirName; 8878 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8879 nullptr, D->getBeginLoc()); 8880 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8881 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8882 return Res; 8883 } 8884 8885 template <typename Derived> 8886 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective( 8887 OMPParallelMaskedDirective *D) { 8888 DeclarationNameInfo DirName; 8889 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName, 8890 nullptr, D->getBeginLoc()); 8891 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8892 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8893 return Res; 8894 } 8895 8896 template <typename Derived> 8897 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8898 OMPParallelSectionsDirective *D) { 8899 DeclarationNameInfo DirName; 8900 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8901 nullptr, D->getBeginLoc()); 8902 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8903 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8904 return Res; 8905 } 8906 8907 template <typename Derived> 8908 StmtResult 8909 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8910 DeclarationNameInfo DirName; 8911 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8912 D->getBeginLoc()); 8913 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8914 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8915 return Res; 8916 } 8917 8918 template <typename Derived> 8919 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8920 OMPTaskyieldDirective *D) { 8921 DeclarationNameInfo DirName; 8922 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8923 D->getBeginLoc()); 8924 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8925 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8926 return Res; 8927 } 8928 8929 template <typename Derived> 8930 StmtResult 8931 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8932 DeclarationNameInfo DirName; 8933 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8934 D->getBeginLoc()); 8935 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8936 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8937 return Res; 8938 } 8939 8940 template <typename Derived> 8941 StmtResult 8942 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8943 DeclarationNameInfo DirName; 8944 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8945 D->getBeginLoc()); 8946 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8947 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8948 return Res; 8949 } 8950 8951 template <typename Derived> 8952 StmtResult 8953 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) { 8954 DeclarationNameInfo DirName; 8955 getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr, 8956 D->getBeginLoc()); 8957 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8958 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8959 return Res; 8960 } 8961 8962 template <typename Derived> 8963 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8964 OMPTaskgroupDirective *D) { 8965 DeclarationNameInfo DirName; 8966 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8967 D->getBeginLoc()); 8968 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8969 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8970 return Res; 8971 } 8972 8973 template <typename Derived> 8974 StmtResult 8975 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8976 DeclarationNameInfo DirName; 8977 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8978 D->getBeginLoc()); 8979 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8980 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8981 return Res; 8982 } 8983 8984 template <typename Derived> 8985 StmtResult 8986 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8987 DeclarationNameInfo DirName; 8988 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8989 D->getBeginLoc()); 8990 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8991 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8992 return Res; 8993 } 8994 8995 template <typename Derived> 8996 StmtResult 8997 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8998 DeclarationNameInfo DirName; 8999 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 9000 D->getBeginLoc()); 9001 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9002 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9003 return Res; 9004 } 9005 9006 template <typename Derived> 9007 StmtResult 9008 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 9009 DeclarationNameInfo DirName; 9010 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 9011 D->getBeginLoc()); 9012 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9013 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9014 return Res; 9015 } 9016 9017 template <typename Derived> 9018 StmtResult 9019 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 9020 DeclarationNameInfo DirName; 9021 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 9022 D->getBeginLoc()); 9023 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9024 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9025 return Res; 9026 } 9027 9028 template <typename Derived> 9029 StmtResult 9030 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 9031 DeclarationNameInfo DirName; 9032 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 9033 D->getBeginLoc()); 9034 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9035 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9036 return Res; 9037 } 9038 9039 template <typename Derived> 9040 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 9041 OMPTargetDataDirective *D) { 9042 DeclarationNameInfo DirName; 9043 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 9044 D->getBeginLoc()); 9045 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9046 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9047 return Res; 9048 } 9049 9050 template <typename Derived> 9051 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 9052 OMPTargetEnterDataDirective *D) { 9053 DeclarationNameInfo DirName; 9054 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 9055 nullptr, D->getBeginLoc()); 9056 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9057 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9058 return Res; 9059 } 9060 9061 template <typename Derived> 9062 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 9063 OMPTargetExitDataDirective *D) { 9064 DeclarationNameInfo DirName; 9065 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 9066 nullptr, D->getBeginLoc()); 9067 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9068 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9069 return Res; 9070 } 9071 9072 template <typename Derived> 9073 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 9074 OMPTargetParallelDirective *D) { 9075 DeclarationNameInfo DirName; 9076 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 9077 nullptr, D->getBeginLoc()); 9078 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9079 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9080 return Res; 9081 } 9082 9083 template <typename Derived> 9084 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 9085 OMPTargetParallelForDirective *D) { 9086 DeclarationNameInfo DirName; 9087 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 9088 nullptr, D->getBeginLoc()); 9089 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9090 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9091 return Res; 9092 } 9093 9094 template <typename Derived> 9095 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 9096 OMPTargetUpdateDirective *D) { 9097 DeclarationNameInfo DirName; 9098 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 9099 nullptr, D->getBeginLoc()); 9100 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9101 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9102 return Res; 9103 } 9104 9105 template <typename Derived> 9106 StmtResult 9107 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 9108 DeclarationNameInfo DirName; 9109 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 9110 D->getBeginLoc()); 9111 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9112 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9113 return Res; 9114 } 9115 9116 template <typename Derived> 9117 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 9118 OMPCancellationPointDirective *D) { 9119 DeclarationNameInfo DirName; 9120 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 9121 nullptr, D->getBeginLoc()); 9122 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9123 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9124 return Res; 9125 } 9126 9127 template <typename Derived> 9128 StmtResult 9129 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 9130 DeclarationNameInfo DirName; 9131 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 9132 D->getBeginLoc()); 9133 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9134 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9135 return Res; 9136 } 9137 9138 template <typename Derived> 9139 StmtResult 9140 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 9141 DeclarationNameInfo DirName; 9142 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 9143 D->getBeginLoc()); 9144 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9145 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9146 return Res; 9147 } 9148 9149 template <typename Derived> 9150 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 9151 OMPTaskLoopSimdDirective *D) { 9152 DeclarationNameInfo DirName; 9153 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 9154 nullptr, D->getBeginLoc()); 9155 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9156 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9157 return Res; 9158 } 9159 9160 template <typename Derived> 9161 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 9162 OMPMasterTaskLoopDirective *D) { 9163 DeclarationNameInfo DirName; 9164 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 9165 nullptr, D->getBeginLoc()); 9166 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9167 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9168 return Res; 9169 } 9170 9171 template <typename Derived> 9172 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective( 9173 OMPMaskedTaskLoopDirective *D) { 9174 DeclarationNameInfo DirName; 9175 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName, 9176 nullptr, D->getBeginLoc()); 9177 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9178 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9179 return Res; 9180 } 9181 9182 template <typename Derived> 9183 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9184 OMPMasterTaskLoopSimdDirective *D) { 9185 DeclarationNameInfo DirName; 9186 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9187 nullptr, D->getBeginLoc()); 9188 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9189 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9190 return Res; 9191 } 9192 9193 template <typename Derived> 9194 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective( 9195 OMPMaskedTaskLoopSimdDirective *D) { 9196 DeclarationNameInfo DirName; 9197 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName, 9198 nullptr, D->getBeginLoc()); 9199 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9200 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9201 return Res; 9202 } 9203 9204 template <typename Derived> 9205 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9206 OMPParallelMasterTaskLoopDirective *D) { 9207 DeclarationNameInfo DirName; 9208 getDerived().getSema().StartOpenMPDSABlock( 9209 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9210 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9211 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9212 return Res; 9213 } 9214 9215 template <typename Derived> 9216 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective( 9217 OMPParallelMaskedTaskLoopDirective *D) { 9218 DeclarationNameInfo DirName; 9219 getDerived().getSema().StartOpenMPDSABlock( 9220 OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc()); 9221 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9222 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9223 return Res; 9224 } 9225 9226 template <typename Derived> 9227 StmtResult 9228 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9229 OMPParallelMasterTaskLoopSimdDirective *D) { 9230 DeclarationNameInfo DirName; 9231 getDerived().getSema().StartOpenMPDSABlock( 9232 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9233 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9234 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9235 return Res; 9236 } 9237 9238 template <typename Derived> 9239 StmtResult 9240 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective( 9241 OMPParallelMaskedTaskLoopSimdDirective *D) { 9242 DeclarationNameInfo DirName; 9243 getDerived().getSema().StartOpenMPDSABlock( 9244 OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9245 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9246 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9247 return Res; 9248 } 9249 9250 template <typename Derived> 9251 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9252 OMPDistributeDirective *D) { 9253 DeclarationNameInfo DirName; 9254 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9255 D->getBeginLoc()); 9256 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9257 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9258 return Res; 9259 } 9260 9261 template <typename Derived> 9262 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9263 OMPDistributeParallelForDirective *D) { 9264 DeclarationNameInfo DirName; 9265 getDerived().getSema().StartOpenMPDSABlock( 9266 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9267 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9268 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9269 return Res; 9270 } 9271 9272 template <typename Derived> 9273 StmtResult 9274 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9275 OMPDistributeParallelForSimdDirective *D) { 9276 DeclarationNameInfo DirName; 9277 getDerived().getSema().StartOpenMPDSABlock( 9278 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9279 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9280 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9281 return Res; 9282 } 9283 9284 template <typename Derived> 9285 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9286 OMPDistributeSimdDirective *D) { 9287 DeclarationNameInfo DirName; 9288 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9289 nullptr, D->getBeginLoc()); 9290 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9291 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9292 return Res; 9293 } 9294 9295 template <typename Derived> 9296 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9297 OMPTargetParallelForSimdDirective *D) { 9298 DeclarationNameInfo DirName; 9299 getDerived().getSema().StartOpenMPDSABlock( 9300 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9301 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9302 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9303 return Res; 9304 } 9305 9306 template <typename Derived> 9307 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9308 OMPTargetSimdDirective *D) { 9309 DeclarationNameInfo DirName; 9310 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9311 D->getBeginLoc()); 9312 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9313 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9314 return Res; 9315 } 9316 9317 template <typename Derived> 9318 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9319 OMPTeamsDistributeDirective *D) { 9320 DeclarationNameInfo DirName; 9321 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9322 nullptr, D->getBeginLoc()); 9323 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9324 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9325 return Res; 9326 } 9327 9328 template <typename Derived> 9329 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9330 OMPTeamsDistributeSimdDirective *D) { 9331 DeclarationNameInfo DirName; 9332 getDerived().getSema().StartOpenMPDSABlock( 9333 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9334 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9335 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9336 return Res; 9337 } 9338 9339 template <typename Derived> 9340 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9341 OMPTeamsDistributeParallelForSimdDirective *D) { 9342 DeclarationNameInfo DirName; 9343 getDerived().getSema().StartOpenMPDSABlock( 9344 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9345 D->getBeginLoc()); 9346 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9347 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9348 return Res; 9349 } 9350 9351 template <typename Derived> 9352 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9353 OMPTeamsDistributeParallelForDirective *D) { 9354 DeclarationNameInfo DirName; 9355 getDerived().getSema().StartOpenMPDSABlock( 9356 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9357 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9358 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9359 return Res; 9360 } 9361 9362 template <typename Derived> 9363 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9364 OMPTargetTeamsDirective *D) { 9365 DeclarationNameInfo DirName; 9366 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9367 nullptr, D->getBeginLoc()); 9368 auto Res = getDerived().TransformOMPExecutableDirective(D); 9369 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9370 return Res; 9371 } 9372 9373 template <typename Derived> 9374 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9375 OMPTargetTeamsDistributeDirective *D) { 9376 DeclarationNameInfo DirName; 9377 getDerived().getSema().StartOpenMPDSABlock( 9378 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9379 auto Res = getDerived().TransformOMPExecutableDirective(D); 9380 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9381 return Res; 9382 } 9383 9384 template <typename Derived> 9385 StmtResult 9386 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9387 OMPTargetTeamsDistributeParallelForDirective *D) { 9388 DeclarationNameInfo DirName; 9389 getDerived().getSema().StartOpenMPDSABlock( 9390 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9391 D->getBeginLoc()); 9392 auto Res = getDerived().TransformOMPExecutableDirective(D); 9393 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9394 return Res; 9395 } 9396 9397 template <typename Derived> 9398 StmtResult TreeTransform<Derived>:: 9399 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9400 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9401 DeclarationNameInfo DirName; 9402 getDerived().getSema().StartOpenMPDSABlock( 9403 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9404 D->getBeginLoc()); 9405 auto Res = getDerived().TransformOMPExecutableDirective(D); 9406 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9407 return Res; 9408 } 9409 9410 template <typename Derived> 9411 StmtResult 9412 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9413 OMPTargetTeamsDistributeSimdDirective *D) { 9414 DeclarationNameInfo DirName; 9415 getDerived().getSema().StartOpenMPDSABlock( 9416 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9417 auto Res = getDerived().TransformOMPExecutableDirective(D); 9418 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9419 return Res; 9420 } 9421 9422 template <typename Derived> 9423 StmtResult 9424 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9425 DeclarationNameInfo DirName; 9426 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9427 D->getBeginLoc()); 9428 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9429 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9430 return Res; 9431 } 9432 9433 template <typename Derived> 9434 StmtResult 9435 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9436 DeclarationNameInfo DirName; 9437 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9438 D->getBeginLoc()); 9439 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9440 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9441 return Res; 9442 } 9443 9444 template <typename Derived> 9445 StmtResult 9446 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9447 DeclarationNameInfo DirName; 9448 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9449 D->getBeginLoc()); 9450 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9451 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9452 return Res; 9453 } 9454 9455 template <typename Derived> 9456 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9457 OMPGenericLoopDirective *D) { 9458 DeclarationNameInfo DirName; 9459 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9460 D->getBeginLoc()); 9461 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9462 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9463 return Res; 9464 } 9465 9466 template <typename Derived> 9467 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9468 OMPTeamsGenericLoopDirective *D) { 9469 DeclarationNameInfo DirName; 9470 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9471 D->getBeginLoc()); 9472 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9473 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9474 return Res; 9475 } 9476 9477 template <typename Derived> 9478 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9479 OMPTargetTeamsGenericLoopDirective *D) { 9480 DeclarationNameInfo DirName; 9481 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9482 nullptr, D->getBeginLoc()); 9483 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9484 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9485 return Res; 9486 } 9487 9488 template <typename Derived> 9489 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9490 OMPParallelGenericLoopDirective *D) { 9491 DeclarationNameInfo DirName; 9492 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9493 nullptr, D->getBeginLoc()); 9494 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9495 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9496 return Res; 9497 } 9498 9499 template <typename Derived> 9500 StmtResult 9501 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9502 OMPTargetParallelGenericLoopDirective *D) { 9503 DeclarationNameInfo DirName; 9504 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9505 nullptr, D->getBeginLoc()); 9506 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9507 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9508 return Res; 9509 } 9510 9511 //===----------------------------------------------------------------------===// 9512 // OpenMP clause transformation 9513 //===----------------------------------------------------------------------===// 9514 template <typename Derived> 9515 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9516 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9517 if (Cond.isInvalid()) 9518 return nullptr; 9519 return getDerived().RebuildOMPIfClause( 9520 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9521 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9522 } 9523 9524 template <typename Derived> 9525 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9526 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9527 if (Cond.isInvalid()) 9528 return nullptr; 9529 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9530 C->getLParenLoc(), C->getEndLoc()); 9531 } 9532 9533 template <typename Derived> 9534 OMPClause * 9535 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9536 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9537 if (NumThreads.isInvalid()) 9538 return nullptr; 9539 return getDerived().RebuildOMPNumThreadsClause( 9540 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9541 } 9542 9543 template <typename Derived> 9544 OMPClause * 9545 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9546 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9547 if (E.isInvalid()) 9548 return nullptr; 9549 return getDerived().RebuildOMPSafelenClause( 9550 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9551 } 9552 9553 template <typename Derived> 9554 OMPClause * 9555 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9556 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9557 if (E.isInvalid()) 9558 return nullptr; 9559 return getDerived().RebuildOMPAllocatorClause( 9560 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9561 } 9562 9563 template <typename Derived> 9564 OMPClause * 9565 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9566 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9567 if (E.isInvalid()) 9568 return nullptr; 9569 return getDerived().RebuildOMPSimdlenClause( 9570 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9571 } 9572 9573 template <typename Derived> 9574 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9575 SmallVector<Expr *, 4> TransformedSizes; 9576 TransformedSizes.reserve(C->getNumSizes()); 9577 bool Changed = false; 9578 for (Expr *E : C->getSizesRefs()) { 9579 if (!E) { 9580 TransformedSizes.push_back(nullptr); 9581 continue; 9582 } 9583 9584 ExprResult T = getDerived().TransformExpr(E); 9585 if (T.isInvalid()) 9586 return nullptr; 9587 if (E != T.get()) 9588 Changed = true; 9589 TransformedSizes.push_back(T.get()); 9590 } 9591 9592 if (!Changed && !getDerived().AlwaysRebuild()) 9593 return C; 9594 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9595 C->getLParenLoc(), C->getEndLoc()); 9596 } 9597 9598 template <typename Derived> 9599 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9600 if (!getDerived().AlwaysRebuild()) 9601 return C; 9602 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9603 } 9604 9605 template <typename Derived> 9606 OMPClause * 9607 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9608 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9609 if (T.isInvalid()) 9610 return nullptr; 9611 Expr *Factor = T.get(); 9612 bool Changed = Factor != C->getFactor(); 9613 9614 if (!Changed && !getDerived().AlwaysRebuild()) 9615 return C; 9616 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9617 C->getEndLoc()); 9618 } 9619 9620 template <typename Derived> 9621 OMPClause * 9622 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9623 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9624 if (E.isInvalid()) 9625 return nullptr; 9626 return getDerived().RebuildOMPCollapseClause( 9627 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9628 } 9629 9630 template <typename Derived> 9631 OMPClause * 9632 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9633 return getDerived().RebuildOMPDefaultClause( 9634 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9635 C->getLParenLoc(), C->getEndLoc()); 9636 } 9637 9638 template <typename Derived> 9639 OMPClause * 9640 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9641 return getDerived().RebuildOMPProcBindClause( 9642 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9643 C->getLParenLoc(), C->getEndLoc()); 9644 } 9645 9646 template <typename Derived> 9647 OMPClause * 9648 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9649 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9650 if (E.isInvalid()) 9651 return nullptr; 9652 return getDerived().RebuildOMPScheduleClause( 9653 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9654 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9655 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9656 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9657 } 9658 9659 template <typename Derived> 9660 OMPClause * 9661 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9662 ExprResult E; 9663 if (auto *Num = C->getNumForLoops()) { 9664 E = getDerived().TransformExpr(Num); 9665 if (E.isInvalid()) 9666 return nullptr; 9667 } 9668 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9669 C->getLParenLoc(), E.get()); 9670 } 9671 9672 template <typename Derived> 9673 OMPClause * 9674 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9675 ExprResult E; 9676 if (Expr *Evt = C->getEventHandler()) { 9677 E = getDerived().TransformExpr(Evt); 9678 if (E.isInvalid()) 9679 return nullptr; 9680 } 9681 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9682 C->getLParenLoc(), C->getEndLoc()); 9683 } 9684 9685 template <typename Derived> 9686 OMPClause * 9687 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9688 // No need to rebuild this clause, no template-dependent parameters. 9689 return C; 9690 } 9691 9692 template <typename Derived> 9693 OMPClause * 9694 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9695 // No need to rebuild this clause, no template-dependent parameters. 9696 return C; 9697 } 9698 9699 template <typename Derived> 9700 OMPClause * 9701 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9702 // No need to rebuild this clause, no template-dependent parameters. 9703 return C; 9704 } 9705 9706 template <typename Derived> 9707 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9708 // No need to rebuild this clause, no template-dependent parameters. 9709 return C; 9710 } 9711 9712 template <typename Derived> 9713 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9714 // No need to rebuild this clause, no template-dependent parameters. 9715 return C; 9716 } 9717 9718 template <typename Derived> 9719 OMPClause * 9720 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9721 // No need to rebuild this clause, no template-dependent parameters. 9722 return C; 9723 } 9724 9725 template <typename Derived> 9726 OMPClause * 9727 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9728 // No need to rebuild this clause, no template-dependent parameters. 9729 return C; 9730 } 9731 9732 template <typename Derived> 9733 OMPClause * 9734 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9735 // No need to rebuild this clause, no template-dependent parameters. 9736 return C; 9737 } 9738 9739 template <typename Derived> 9740 OMPClause * 9741 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9742 // No need to rebuild this clause, no template-dependent parameters. 9743 return C; 9744 } 9745 9746 template <typename Derived> 9747 OMPClause * 9748 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9749 // No need to rebuild this clause, no template-dependent parameters. 9750 return C; 9751 } 9752 9753 template <typename Derived> 9754 OMPClause * 9755 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9756 // No need to rebuild this clause, no template-dependent parameters. 9757 return C; 9758 } 9759 9760 template <typename Derived> 9761 OMPClause * 9762 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9763 // No need to rebuild this clause, no template-dependent parameters. 9764 return C; 9765 } 9766 9767 template <typename Derived> 9768 OMPClause * 9769 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9770 // No need to rebuild this clause, no template-dependent parameters. 9771 return C; 9772 } 9773 9774 template <typename Derived> 9775 OMPClause * 9776 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9777 // No need to rebuild this clause, no template-dependent parameters. 9778 return C; 9779 } 9780 9781 template <typename Derived> 9782 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9783 // No need to rebuild this clause, no template-dependent parameters. 9784 return C; 9785 } 9786 9787 template <typename Derived> 9788 OMPClause * 9789 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9790 // No need to rebuild this clause, no template-dependent parameters. 9791 return C; 9792 } 9793 9794 template <typename Derived> 9795 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9796 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9797 if (IVR.isInvalid()) 9798 return nullptr; 9799 9800 OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync()); 9801 InteropInfo.PreferTypes.reserve(C->varlist_size() - 1); 9802 for (Expr *E : llvm::drop_begin(C->varlists())) { 9803 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9804 if (ER.isInvalid()) 9805 return nullptr; 9806 InteropInfo.PreferTypes.push_back(ER.get()); 9807 } 9808 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo, 9809 C->getBeginLoc(), C->getLParenLoc(), 9810 C->getVarLoc(), C->getEndLoc()); 9811 } 9812 9813 template <typename Derived> 9814 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9815 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9816 if (ER.isInvalid()) 9817 return nullptr; 9818 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9819 C->getLParenLoc(), C->getVarLoc(), 9820 C->getEndLoc()); 9821 } 9822 9823 template <typename Derived> 9824 OMPClause * 9825 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9826 ExprResult ER; 9827 if (Expr *IV = C->getInteropVar()) { 9828 ER = getDerived().TransformExpr(IV); 9829 if (ER.isInvalid()) 9830 return nullptr; 9831 } 9832 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9833 C->getLParenLoc(), C->getVarLoc(), 9834 C->getEndLoc()); 9835 } 9836 9837 template <typename Derived> 9838 OMPClause * 9839 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9840 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9841 if (Cond.isInvalid()) 9842 return nullptr; 9843 return getDerived().RebuildOMPNovariantsClause( 9844 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9845 } 9846 9847 template <typename Derived> 9848 OMPClause * 9849 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9850 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9851 if (Cond.isInvalid()) 9852 return nullptr; 9853 return getDerived().RebuildOMPNocontextClause( 9854 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9855 } 9856 9857 template <typename Derived> 9858 OMPClause * 9859 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9860 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9861 if (ThreadID.isInvalid()) 9862 return nullptr; 9863 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9864 C->getLParenLoc(), C->getEndLoc()); 9865 } 9866 9867 template <typename Derived> 9868 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9869 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9870 if (E.isInvalid()) 9871 return nullptr; 9872 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9873 C->getLParenLoc(), C->getEndLoc()); 9874 } 9875 9876 template <typename Derived> 9877 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9878 OMPUnifiedAddressClause *C) { 9879 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9880 } 9881 9882 template <typename Derived> 9883 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9884 OMPUnifiedSharedMemoryClause *C) { 9885 llvm_unreachable( 9886 "unified_shared_memory clause cannot appear in dependent context"); 9887 } 9888 9889 template <typename Derived> 9890 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9891 OMPReverseOffloadClause *C) { 9892 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9893 } 9894 9895 template <typename Derived> 9896 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9897 OMPDynamicAllocatorsClause *C) { 9898 llvm_unreachable( 9899 "dynamic_allocators clause cannot appear in dependent context"); 9900 } 9901 9902 template <typename Derived> 9903 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9904 OMPAtomicDefaultMemOrderClause *C) { 9905 llvm_unreachable( 9906 "atomic_default_mem_order clause cannot appear in dependent context"); 9907 } 9908 9909 template <typename Derived> 9910 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) { 9911 return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(), 9912 C->getBeginLoc(), C->getLParenLoc(), 9913 C->getEndLoc()); 9914 } 9915 9916 template <typename Derived> 9917 OMPClause * 9918 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) { 9919 return getDerived().RebuildOMPSeverityClause( 9920 C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(), 9921 C->getLParenLoc(), C->getEndLoc()); 9922 } 9923 9924 template <typename Derived> 9925 OMPClause * 9926 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) { 9927 ExprResult E = getDerived().TransformExpr(C->getMessageString()); 9928 if (E.isInvalid()) 9929 return nullptr; 9930 return getDerived().RebuildOMPMessageClause( 9931 C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(), 9932 C->getEndLoc()); 9933 } 9934 9935 template <typename Derived> 9936 OMPClause * 9937 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9938 llvm::SmallVector<Expr *, 16> Vars; 9939 Vars.reserve(C->varlist_size()); 9940 for (auto *VE : C->varlists()) { 9941 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9942 if (EVar.isInvalid()) 9943 return nullptr; 9944 Vars.push_back(EVar.get()); 9945 } 9946 return getDerived().RebuildOMPPrivateClause( 9947 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9948 } 9949 9950 template <typename Derived> 9951 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9952 OMPFirstprivateClause *C) { 9953 llvm::SmallVector<Expr *, 16> Vars; 9954 Vars.reserve(C->varlist_size()); 9955 for (auto *VE : C->varlists()) { 9956 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9957 if (EVar.isInvalid()) 9958 return nullptr; 9959 Vars.push_back(EVar.get()); 9960 } 9961 return getDerived().RebuildOMPFirstprivateClause( 9962 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9963 } 9964 9965 template <typename Derived> 9966 OMPClause * 9967 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9968 llvm::SmallVector<Expr *, 16> Vars; 9969 Vars.reserve(C->varlist_size()); 9970 for (auto *VE : C->varlists()) { 9971 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9972 if (EVar.isInvalid()) 9973 return nullptr; 9974 Vars.push_back(EVar.get()); 9975 } 9976 return getDerived().RebuildOMPLastprivateClause( 9977 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9978 C->getLParenLoc(), C->getEndLoc()); 9979 } 9980 9981 template <typename Derived> 9982 OMPClause * 9983 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9984 llvm::SmallVector<Expr *, 16> Vars; 9985 Vars.reserve(C->varlist_size()); 9986 for (auto *VE : C->varlists()) { 9987 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9988 if (EVar.isInvalid()) 9989 return nullptr; 9990 Vars.push_back(EVar.get()); 9991 } 9992 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9993 C->getLParenLoc(), C->getEndLoc()); 9994 } 9995 9996 template <typename Derived> 9997 OMPClause * 9998 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9999 llvm::SmallVector<Expr *, 16> Vars; 10000 Vars.reserve(C->varlist_size()); 10001 for (auto *VE : C->varlists()) { 10002 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10003 if (EVar.isInvalid()) 10004 return nullptr; 10005 Vars.push_back(EVar.get()); 10006 } 10007 CXXScopeSpec ReductionIdScopeSpec; 10008 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10009 10010 DeclarationNameInfo NameInfo = C->getNameInfo(); 10011 if (NameInfo.getName()) { 10012 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10013 if (!NameInfo.getName()) 10014 return nullptr; 10015 } 10016 // Build a list of all UDR decls with the same names ranged by the Scopes. 10017 // The Scope boundary is a duplication of the previous decl. 10018 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10019 for (auto *E : C->reduction_ops()) { 10020 // Transform all the decls. 10021 if (E) { 10022 auto *ULE = cast<UnresolvedLookupExpr>(E); 10023 UnresolvedSet<8> Decls; 10024 for (auto *D : ULE->decls()) { 10025 NamedDecl *InstD = 10026 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10027 Decls.addDecl(InstD, InstD->getAccess()); 10028 } 10029 UnresolvedReductions.push_back( 10030 UnresolvedLookupExpr::Create( 10031 SemaRef.Context, /*NamingClass=*/nullptr, 10032 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 10033 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 10034 Decls.begin(), Decls.end())); 10035 } else 10036 UnresolvedReductions.push_back(nullptr); 10037 } 10038 return getDerived().RebuildOMPReductionClause( 10039 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 10040 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 10041 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10042 } 10043 10044 template <typename Derived> 10045 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 10046 OMPTaskReductionClause *C) { 10047 llvm::SmallVector<Expr *, 16> Vars; 10048 Vars.reserve(C->varlist_size()); 10049 for (auto *VE : C->varlists()) { 10050 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10051 if (EVar.isInvalid()) 10052 return nullptr; 10053 Vars.push_back(EVar.get()); 10054 } 10055 CXXScopeSpec ReductionIdScopeSpec; 10056 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10057 10058 DeclarationNameInfo NameInfo = C->getNameInfo(); 10059 if (NameInfo.getName()) { 10060 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10061 if (!NameInfo.getName()) 10062 return nullptr; 10063 } 10064 // Build a list of all UDR decls with the same names ranged by the Scopes. 10065 // The Scope boundary is a duplication of the previous decl. 10066 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10067 for (auto *E : C->reduction_ops()) { 10068 // Transform all the decls. 10069 if (E) { 10070 auto *ULE = cast<UnresolvedLookupExpr>(E); 10071 UnresolvedSet<8> Decls; 10072 for (auto *D : ULE->decls()) { 10073 NamedDecl *InstD = 10074 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10075 Decls.addDecl(InstD, InstD->getAccess()); 10076 } 10077 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10078 SemaRef.Context, /*NamingClass=*/nullptr, 10079 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10080 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10081 } else 10082 UnresolvedReductions.push_back(nullptr); 10083 } 10084 return getDerived().RebuildOMPTaskReductionClause( 10085 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10086 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10087 } 10088 10089 template <typename Derived> 10090 OMPClause * 10091 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 10092 llvm::SmallVector<Expr *, 16> Vars; 10093 Vars.reserve(C->varlist_size()); 10094 for (auto *VE : C->varlists()) { 10095 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10096 if (EVar.isInvalid()) 10097 return nullptr; 10098 Vars.push_back(EVar.get()); 10099 } 10100 CXXScopeSpec ReductionIdScopeSpec; 10101 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10102 10103 DeclarationNameInfo NameInfo = C->getNameInfo(); 10104 if (NameInfo.getName()) { 10105 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10106 if (!NameInfo.getName()) 10107 return nullptr; 10108 } 10109 // Build a list of all UDR decls with the same names ranged by the Scopes. 10110 // The Scope boundary is a duplication of the previous decl. 10111 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10112 for (auto *E : C->reduction_ops()) { 10113 // Transform all the decls. 10114 if (E) { 10115 auto *ULE = cast<UnresolvedLookupExpr>(E); 10116 UnresolvedSet<8> Decls; 10117 for (auto *D : ULE->decls()) { 10118 NamedDecl *InstD = 10119 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10120 Decls.addDecl(InstD, InstD->getAccess()); 10121 } 10122 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10123 SemaRef.Context, /*NamingClass=*/nullptr, 10124 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10125 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10126 } else 10127 UnresolvedReductions.push_back(nullptr); 10128 } 10129 return getDerived().RebuildOMPInReductionClause( 10130 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10131 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10132 } 10133 10134 template <typename Derived> 10135 OMPClause * 10136 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 10137 llvm::SmallVector<Expr *, 16> Vars; 10138 Vars.reserve(C->varlist_size()); 10139 for (auto *VE : C->varlists()) { 10140 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10141 if (EVar.isInvalid()) 10142 return nullptr; 10143 Vars.push_back(EVar.get()); 10144 } 10145 ExprResult Step = getDerived().TransformExpr(C->getStep()); 10146 if (Step.isInvalid()) 10147 return nullptr; 10148 return getDerived().RebuildOMPLinearClause( 10149 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 10150 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 10151 } 10152 10153 template <typename Derived> 10154 OMPClause * 10155 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 10156 llvm::SmallVector<Expr *, 16> Vars; 10157 Vars.reserve(C->varlist_size()); 10158 for (auto *VE : C->varlists()) { 10159 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10160 if (EVar.isInvalid()) 10161 return nullptr; 10162 Vars.push_back(EVar.get()); 10163 } 10164 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 10165 if (Alignment.isInvalid()) 10166 return nullptr; 10167 return getDerived().RebuildOMPAlignedClause( 10168 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 10169 C->getColonLoc(), C->getEndLoc()); 10170 } 10171 10172 template <typename Derived> 10173 OMPClause * 10174 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 10175 llvm::SmallVector<Expr *, 16> Vars; 10176 Vars.reserve(C->varlist_size()); 10177 for (auto *VE : C->varlists()) { 10178 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10179 if (EVar.isInvalid()) 10180 return nullptr; 10181 Vars.push_back(EVar.get()); 10182 } 10183 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 10184 C->getLParenLoc(), C->getEndLoc()); 10185 } 10186 10187 template <typename Derived> 10188 OMPClause * 10189 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 10190 llvm::SmallVector<Expr *, 16> Vars; 10191 Vars.reserve(C->varlist_size()); 10192 for (auto *VE : C->varlists()) { 10193 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10194 if (EVar.isInvalid()) 10195 return nullptr; 10196 Vars.push_back(EVar.get()); 10197 } 10198 return getDerived().RebuildOMPCopyprivateClause( 10199 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10200 } 10201 10202 template <typename Derived> 10203 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 10204 llvm::SmallVector<Expr *, 16> Vars; 10205 Vars.reserve(C->varlist_size()); 10206 for (auto *VE : C->varlists()) { 10207 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10208 if (EVar.isInvalid()) 10209 return nullptr; 10210 Vars.push_back(EVar.get()); 10211 } 10212 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 10213 C->getLParenLoc(), C->getEndLoc()); 10214 } 10215 10216 template <typename Derived> 10217 OMPClause * 10218 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 10219 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 10220 if (E.isInvalid()) 10221 return nullptr; 10222 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 10223 C->getLParenLoc(), C->getEndLoc()); 10224 } 10225 10226 template <typename Derived> 10227 OMPClause * 10228 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 10229 llvm::SmallVector<Expr *, 16> Vars; 10230 Expr *DepModifier = C->getModifier(); 10231 if (DepModifier) { 10232 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 10233 if (DepModRes.isInvalid()) 10234 return nullptr; 10235 DepModifier = DepModRes.get(); 10236 } 10237 Vars.reserve(C->varlist_size()); 10238 for (auto *VE : C->varlists()) { 10239 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10240 if (EVar.isInvalid()) 10241 return nullptr; 10242 Vars.push_back(EVar.get()); 10243 } 10244 return getDerived().RebuildOMPDependClause( 10245 {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), 10246 C->getOmpAllMemoryLoc()}, 10247 DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10248 } 10249 10250 template <typename Derived> 10251 OMPClause * 10252 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10253 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10254 if (E.isInvalid()) 10255 return nullptr; 10256 return getDerived().RebuildOMPDeviceClause( 10257 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10258 C->getModifierLoc(), C->getEndLoc()); 10259 } 10260 10261 template <typename Derived, class T> 10262 bool transformOMPMappableExprListClause( 10263 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10264 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10265 DeclarationNameInfo &MapperIdInfo, 10266 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10267 // Transform expressions in the list. 10268 Vars.reserve(C->varlist_size()); 10269 for (auto *VE : C->varlists()) { 10270 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10271 if (EVar.isInvalid()) 10272 return true; 10273 Vars.push_back(EVar.get()); 10274 } 10275 // Transform mapper scope specifier and identifier. 10276 NestedNameSpecifierLoc QualifierLoc; 10277 if (C->getMapperQualifierLoc()) { 10278 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10279 C->getMapperQualifierLoc()); 10280 if (!QualifierLoc) 10281 return true; 10282 } 10283 MapperIdScopeSpec.Adopt(QualifierLoc); 10284 MapperIdInfo = C->getMapperIdInfo(); 10285 if (MapperIdInfo.getName()) { 10286 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10287 if (!MapperIdInfo.getName()) 10288 return true; 10289 } 10290 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10291 // the previous user-defined mapper lookup in dependent environment. 10292 for (auto *E : C->mapperlists()) { 10293 // Transform all the decls. 10294 if (E) { 10295 auto *ULE = cast<UnresolvedLookupExpr>(E); 10296 UnresolvedSet<8> Decls; 10297 for (auto *D : ULE->decls()) { 10298 NamedDecl *InstD = 10299 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10300 Decls.addDecl(InstD, InstD->getAccess()); 10301 } 10302 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10303 TT.getSema().Context, /*NamingClass=*/nullptr, 10304 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10305 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10306 Decls.end())); 10307 } else { 10308 UnresolvedMappers.push_back(nullptr); 10309 } 10310 } 10311 return false; 10312 } 10313 10314 template <typename Derived> 10315 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10316 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10317 llvm::SmallVector<Expr *, 16> Vars; 10318 Expr *IteratorModifier = C->getIteratorModifier(); 10319 if (IteratorModifier) { 10320 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier); 10321 if (MapModRes.isInvalid()) 10322 return nullptr; 10323 IteratorModifier = MapModRes.get(); 10324 } 10325 CXXScopeSpec MapperIdScopeSpec; 10326 DeclarationNameInfo MapperIdInfo; 10327 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10328 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10329 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10330 return nullptr; 10331 return getDerived().RebuildOMPMapClause( 10332 IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), 10333 MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(), 10334 C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10335 } 10336 10337 template <typename Derived> 10338 OMPClause * 10339 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10340 Expr *Allocator = C->getAllocator(); 10341 if (Allocator) { 10342 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10343 if (AllocatorRes.isInvalid()) 10344 return nullptr; 10345 Allocator = AllocatorRes.get(); 10346 } 10347 llvm::SmallVector<Expr *, 16> Vars; 10348 Vars.reserve(C->varlist_size()); 10349 for (auto *VE : C->varlists()) { 10350 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10351 if (EVar.isInvalid()) 10352 return nullptr; 10353 Vars.push_back(EVar.get()); 10354 } 10355 return getDerived().RebuildOMPAllocateClause( 10356 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10357 C->getEndLoc()); 10358 } 10359 10360 template <typename Derived> 10361 OMPClause * 10362 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10363 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10364 if (E.isInvalid()) 10365 return nullptr; 10366 return getDerived().RebuildOMPNumTeamsClause( 10367 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10368 } 10369 10370 template <typename Derived> 10371 OMPClause * 10372 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10373 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10374 if (E.isInvalid()) 10375 return nullptr; 10376 return getDerived().RebuildOMPThreadLimitClause( 10377 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10378 } 10379 10380 template <typename Derived> 10381 OMPClause * 10382 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10383 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10384 if (E.isInvalid()) 10385 return nullptr; 10386 return getDerived().RebuildOMPPriorityClause( 10387 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10388 } 10389 10390 template <typename Derived> 10391 OMPClause * 10392 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10393 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10394 if (E.isInvalid()) 10395 return nullptr; 10396 return getDerived().RebuildOMPGrainsizeClause( 10397 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10398 C->getModifierLoc(), C->getEndLoc()); 10399 } 10400 10401 template <typename Derived> 10402 OMPClause * 10403 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10404 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10405 if (E.isInvalid()) 10406 return nullptr; 10407 return getDerived().RebuildOMPNumTasksClause( 10408 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10409 C->getModifierLoc(), C->getEndLoc()); 10410 } 10411 10412 template <typename Derived> 10413 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10414 ExprResult E = getDerived().TransformExpr(C->getHint()); 10415 if (E.isInvalid()) 10416 return nullptr; 10417 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10418 C->getLParenLoc(), C->getEndLoc()); 10419 } 10420 10421 template <typename Derived> 10422 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10423 OMPDistScheduleClause *C) { 10424 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10425 if (E.isInvalid()) 10426 return nullptr; 10427 return getDerived().RebuildOMPDistScheduleClause( 10428 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10429 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10430 } 10431 10432 template <typename Derived> 10433 OMPClause * 10434 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10435 // Rebuild Defaultmap Clause since we need to invoke the checking of 10436 // defaultmap(none:variable-category) after template initialization. 10437 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10438 C->getDefaultmapKind(), 10439 C->getBeginLoc(), 10440 C->getLParenLoc(), 10441 C->getDefaultmapModifierLoc(), 10442 C->getDefaultmapKindLoc(), 10443 C->getEndLoc()); 10444 } 10445 10446 template <typename Derived> 10447 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10448 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10449 llvm::SmallVector<Expr *, 16> Vars; 10450 CXXScopeSpec MapperIdScopeSpec; 10451 DeclarationNameInfo MapperIdInfo; 10452 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10453 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10454 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10455 return nullptr; 10456 return getDerived().RebuildOMPToClause( 10457 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10458 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10459 } 10460 10461 template <typename Derived> 10462 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10463 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10464 llvm::SmallVector<Expr *, 16> Vars; 10465 CXXScopeSpec MapperIdScopeSpec; 10466 DeclarationNameInfo MapperIdInfo; 10467 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10468 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10469 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10470 return nullptr; 10471 return getDerived().RebuildOMPFromClause( 10472 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10473 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10474 } 10475 10476 template <typename Derived> 10477 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10478 OMPUseDevicePtrClause *C) { 10479 llvm::SmallVector<Expr *, 16> Vars; 10480 Vars.reserve(C->varlist_size()); 10481 for (auto *VE : C->varlists()) { 10482 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10483 if (EVar.isInvalid()) 10484 return nullptr; 10485 Vars.push_back(EVar.get()); 10486 } 10487 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10488 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10489 } 10490 10491 template <typename Derived> 10492 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10493 OMPUseDeviceAddrClause *C) { 10494 llvm::SmallVector<Expr *, 16> Vars; 10495 Vars.reserve(C->varlist_size()); 10496 for (auto *VE : C->varlists()) { 10497 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10498 if (EVar.isInvalid()) 10499 return nullptr; 10500 Vars.push_back(EVar.get()); 10501 } 10502 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10503 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10504 } 10505 10506 template <typename Derived> 10507 OMPClause * 10508 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10509 llvm::SmallVector<Expr *, 16> Vars; 10510 Vars.reserve(C->varlist_size()); 10511 for (auto *VE : C->varlists()) { 10512 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10513 if (EVar.isInvalid()) 10514 return nullptr; 10515 Vars.push_back(EVar.get()); 10516 } 10517 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10518 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10519 } 10520 10521 template <typename Derived> 10522 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause( 10523 OMPHasDeviceAddrClause *C) { 10524 llvm::SmallVector<Expr *, 16> Vars; 10525 Vars.reserve(C->varlist_size()); 10526 for (auto *VE : C->varlists()) { 10527 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10528 if (EVar.isInvalid()) 10529 return nullptr; 10530 Vars.push_back(EVar.get()); 10531 } 10532 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10533 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs); 10534 } 10535 10536 template <typename Derived> 10537 OMPClause * 10538 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10539 llvm::SmallVector<Expr *, 16> Vars; 10540 Vars.reserve(C->varlist_size()); 10541 for (auto *VE : C->varlists()) { 10542 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10543 if (EVar.isInvalid()) 10544 return nullptr; 10545 Vars.push_back(EVar.get()); 10546 } 10547 return getDerived().RebuildOMPNontemporalClause( 10548 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10549 } 10550 10551 template <typename Derived> 10552 OMPClause * 10553 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10554 llvm::SmallVector<Expr *, 16> Vars; 10555 Vars.reserve(C->varlist_size()); 10556 for (auto *VE : C->varlists()) { 10557 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10558 if (EVar.isInvalid()) 10559 return nullptr; 10560 Vars.push_back(EVar.get()); 10561 } 10562 return getDerived().RebuildOMPInclusiveClause( 10563 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10564 } 10565 10566 template <typename Derived> 10567 OMPClause * 10568 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10569 llvm::SmallVector<Expr *, 16> Vars; 10570 Vars.reserve(C->varlist_size()); 10571 for (auto *VE : C->varlists()) { 10572 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10573 if (EVar.isInvalid()) 10574 return nullptr; 10575 Vars.push_back(EVar.get()); 10576 } 10577 return getDerived().RebuildOMPExclusiveClause( 10578 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10579 } 10580 10581 template <typename Derived> 10582 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10583 OMPUsesAllocatorsClause *C) { 10584 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10585 Data.reserve(C->getNumberOfAllocators()); 10586 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10587 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10588 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10589 if (Allocator.isInvalid()) 10590 continue; 10591 ExprResult AllocatorTraits; 10592 if (Expr *AT = D.AllocatorTraits) { 10593 AllocatorTraits = getDerived().TransformExpr(AT); 10594 if (AllocatorTraits.isInvalid()) 10595 continue; 10596 } 10597 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10598 NewD.Allocator = Allocator.get(); 10599 NewD.AllocatorTraits = AllocatorTraits.get(); 10600 NewD.LParenLoc = D.LParenLoc; 10601 NewD.RParenLoc = D.RParenLoc; 10602 } 10603 return getDerived().RebuildOMPUsesAllocatorsClause( 10604 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10605 } 10606 10607 template <typename Derived> 10608 OMPClause * 10609 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10610 SmallVector<Expr *, 4> Locators; 10611 Locators.reserve(C->varlist_size()); 10612 ExprResult ModifierRes; 10613 if (Expr *Modifier = C->getModifier()) { 10614 ModifierRes = getDerived().TransformExpr(Modifier); 10615 if (ModifierRes.isInvalid()) 10616 return nullptr; 10617 } 10618 for (Expr *E : C->varlists()) { 10619 ExprResult Locator = getDerived().TransformExpr(E); 10620 if (Locator.isInvalid()) 10621 continue; 10622 Locators.push_back(Locator.get()); 10623 } 10624 return getDerived().RebuildOMPAffinityClause( 10625 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10626 ModifierRes.get(), Locators); 10627 } 10628 10629 template <typename Derived> 10630 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10631 return getDerived().RebuildOMPOrderClause( 10632 C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(), 10633 C->getEndLoc(), C->getModifier(), C->getModifierKwLoc()); 10634 } 10635 10636 template <typename Derived> 10637 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10638 return getDerived().RebuildOMPBindClause( 10639 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10640 C->getLParenLoc(), C->getEndLoc()); 10641 } 10642 10643 template <typename Derived> 10644 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause( 10645 OMPXDynCGroupMemClause *C) { 10646 ExprResult Size = getDerived().TransformExpr(C->getSize()); 10647 if (Size.isInvalid()) 10648 return nullptr; 10649 return getDerived().RebuildOMPXDynCGroupMemClause( 10650 Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10651 } 10652 10653 //===----------------------------------------------------------------------===// 10654 // Expression transformation 10655 //===----------------------------------------------------------------------===// 10656 template<typename Derived> 10657 ExprResult 10658 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10659 return TransformExpr(E->getSubExpr()); 10660 } 10661 10662 template <typename Derived> 10663 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10664 SYCLUniqueStableNameExpr *E) { 10665 if (!E->isTypeDependent()) 10666 return E; 10667 10668 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10669 10670 if (!NewT) 10671 return ExprError(); 10672 10673 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10674 return E; 10675 10676 return getDerived().RebuildSYCLUniqueStableNameExpr( 10677 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10678 } 10679 10680 template<typename Derived> 10681 ExprResult 10682 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10683 if (!E->isTypeDependent()) 10684 return E; 10685 10686 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10687 E->getIdentKind()); 10688 } 10689 10690 template<typename Derived> 10691 ExprResult 10692 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10693 NestedNameSpecifierLoc QualifierLoc; 10694 if (E->getQualifierLoc()) { 10695 QualifierLoc 10696 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10697 if (!QualifierLoc) 10698 return ExprError(); 10699 } 10700 10701 ValueDecl *ND 10702 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10703 E->getDecl())); 10704 if (!ND) 10705 return ExprError(); 10706 10707 NamedDecl *Found = ND; 10708 if (E->getFoundDecl() != E->getDecl()) { 10709 Found = cast_or_null<NamedDecl>( 10710 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10711 if (!Found) 10712 return ExprError(); 10713 } 10714 10715 DeclarationNameInfo NameInfo = E->getNameInfo(); 10716 if (NameInfo.getName()) { 10717 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10718 if (!NameInfo.getName()) 10719 return ExprError(); 10720 } 10721 10722 if (!getDerived().AlwaysRebuild() && 10723 QualifierLoc == E->getQualifierLoc() && 10724 ND == E->getDecl() && 10725 Found == E->getFoundDecl() && 10726 NameInfo.getName() == E->getDecl()->getDeclName() && 10727 !E->hasExplicitTemplateArgs()) { 10728 10729 // Mark it referenced in the new context regardless. 10730 // FIXME: this is a bit instantiation-specific. 10731 SemaRef.MarkDeclRefReferenced(E); 10732 10733 return E; 10734 } 10735 10736 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10737 if (E->hasExplicitTemplateArgs()) { 10738 TemplateArgs = &TransArgs; 10739 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10740 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10741 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10742 E->getNumTemplateArgs(), 10743 TransArgs)) 10744 return ExprError(); 10745 } 10746 10747 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10748 Found, TemplateArgs); 10749 } 10750 10751 template<typename Derived> 10752 ExprResult 10753 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10754 return E; 10755 } 10756 10757 template <typename Derived> 10758 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10759 FixedPointLiteral *E) { 10760 return E; 10761 } 10762 10763 template<typename Derived> 10764 ExprResult 10765 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10766 return E; 10767 } 10768 10769 template<typename Derived> 10770 ExprResult 10771 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10772 return E; 10773 } 10774 10775 template<typename Derived> 10776 ExprResult 10777 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10778 return E; 10779 } 10780 10781 template<typename Derived> 10782 ExprResult 10783 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10784 return E; 10785 } 10786 10787 template<typename Derived> 10788 ExprResult 10789 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10790 return getDerived().TransformCallExpr(E); 10791 } 10792 10793 template<typename Derived> 10794 ExprResult 10795 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10796 ExprResult ControllingExpr = 10797 getDerived().TransformExpr(E->getControllingExpr()); 10798 if (ControllingExpr.isInvalid()) 10799 return ExprError(); 10800 10801 SmallVector<Expr *, 4> AssocExprs; 10802 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10803 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10804 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10805 if (TSI) { 10806 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10807 if (!AssocType) 10808 return ExprError(); 10809 AssocTypes.push_back(AssocType); 10810 } else { 10811 AssocTypes.push_back(nullptr); 10812 } 10813 10814 ExprResult AssocExpr = 10815 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10816 if (AssocExpr.isInvalid()) 10817 return ExprError(); 10818 AssocExprs.push_back(AssocExpr.get()); 10819 } 10820 10821 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10822 E->getDefaultLoc(), 10823 E->getRParenLoc(), 10824 ControllingExpr.get(), 10825 AssocTypes, 10826 AssocExprs); 10827 } 10828 10829 template<typename Derived> 10830 ExprResult 10831 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10832 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10833 if (SubExpr.isInvalid()) 10834 return ExprError(); 10835 10836 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10837 return E; 10838 10839 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10840 E->getRParen()); 10841 } 10842 10843 /// The operand of a unary address-of operator has special rules: it's 10844 /// allowed to refer to a non-static member of a class even if there's no 'this' 10845 /// object available. 10846 template<typename Derived> 10847 ExprResult 10848 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10849 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10850 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10851 else 10852 return getDerived().TransformExpr(E); 10853 } 10854 10855 template<typename Derived> 10856 ExprResult 10857 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10858 ExprResult SubExpr; 10859 if (E->getOpcode() == UO_AddrOf) 10860 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10861 else 10862 SubExpr = TransformExpr(E->getSubExpr()); 10863 if (SubExpr.isInvalid()) 10864 return ExprError(); 10865 10866 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10867 return E; 10868 10869 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10870 E->getOpcode(), 10871 SubExpr.get()); 10872 } 10873 10874 template<typename Derived> 10875 ExprResult 10876 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10877 // Transform the type. 10878 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10879 if (!Type) 10880 return ExprError(); 10881 10882 // Transform all of the components into components similar to what the 10883 // parser uses. 10884 // FIXME: It would be slightly more efficient in the non-dependent case to 10885 // just map FieldDecls, rather than requiring the rebuilder to look for 10886 // the fields again. However, __builtin_offsetof is rare enough in 10887 // template code that we don't care. 10888 bool ExprChanged = false; 10889 typedef Sema::OffsetOfComponent Component; 10890 SmallVector<Component, 4> Components; 10891 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10892 const OffsetOfNode &ON = E->getComponent(I); 10893 Component Comp; 10894 Comp.isBrackets = true; 10895 Comp.LocStart = ON.getSourceRange().getBegin(); 10896 Comp.LocEnd = ON.getSourceRange().getEnd(); 10897 switch (ON.getKind()) { 10898 case OffsetOfNode::Array: { 10899 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10900 ExprResult Index = getDerived().TransformExpr(FromIndex); 10901 if (Index.isInvalid()) 10902 return ExprError(); 10903 10904 ExprChanged = ExprChanged || Index.get() != FromIndex; 10905 Comp.isBrackets = true; 10906 Comp.U.E = Index.get(); 10907 break; 10908 } 10909 10910 case OffsetOfNode::Field: 10911 case OffsetOfNode::Identifier: 10912 Comp.isBrackets = false; 10913 Comp.U.IdentInfo = ON.getFieldName(); 10914 if (!Comp.U.IdentInfo) 10915 continue; 10916 10917 break; 10918 10919 case OffsetOfNode::Base: 10920 // Will be recomputed during the rebuild. 10921 continue; 10922 } 10923 10924 Components.push_back(Comp); 10925 } 10926 10927 // If nothing changed, retain the existing expression. 10928 if (!getDerived().AlwaysRebuild() && 10929 Type == E->getTypeSourceInfo() && 10930 !ExprChanged) 10931 return E; 10932 10933 // Build a new offsetof expression. 10934 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10935 Components, E->getRParenLoc()); 10936 } 10937 10938 template<typename Derived> 10939 ExprResult 10940 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10941 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10942 "opaque value expression requires transformation"); 10943 return E; 10944 } 10945 10946 template<typename Derived> 10947 ExprResult 10948 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10949 return E; 10950 } 10951 10952 template <typename Derived> 10953 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10954 llvm::SmallVector<Expr *, 8> Children; 10955 bool Changed = false; 10956 for (Expr *C : E->subExpressions()) { 10957 ExprResult NewC = getDerived().TransformExpr(C); 10958 if (NewC.isInvalid()) 10959 return ExprError(); 10960 Children.push_back(NewC.get()); 10961 10962 Changed |= NewC.get() != C; 10963 } 10964 if (!getDerived().AlwaysRebuild() && !Changed) 10965 return E; 10966 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10967 Children, E->getType()); 10968 } 10969 10970 template<typename Derived> 10971 ExprResult 10972 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10973 // Rebuild the syntactic form. The original syntactic form has 10974 // opaque-value expressions in it, so strip those away and rebuild 10975 // the result. This is a really awful way of doing this, but the 10976 // better solution (rebuilding the semantic expressions and 10977 // rebinding OVEs as necessary) doesn't work; we'd need 10978 // TreeTransform to not strip away implicit conversions. 10979 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10980 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10981 if (result.isInvalid()) return ExprError(); 10982 10983 // If that gives us a pseudo-object result back, the pseudo-object 10984 // expression must have been an lvalue-to-rvalue conversion which we 10985 // should reapply. 10986 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10987 result = SemaRef.checkPseudoObjectRValue(result.get()); 10988 10989 return result; 10990 } 10991 10992 template<typename Derived> 10993 ExprResult 10994 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10995 UnaryExprOrTypeTraitExpr *E) { 10996 if (E->isArgumentType()) { 10997 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10998 10999 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11000 if (!NewT) 11001 return ExprError(); 11002 11003 if (!getDerived().AlwaysRebuild() && OldT == NewT) 11004 return E; 11005 11006 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 11007 E->getKind(), 11008 E->getSourceRange()); 11009 } 11010 11011 // C++0x [expr.sizeof]p1: 11012 // The operand is either an expression, which is an unevaluated operand 11013 // [...] 11014 EnterExpressionEvaluationContext Unevaluated( 11015 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11016 Sema::ReuseLambdaContextDecl); 11017 11018 // Try to recover if we have something like sizeof(T::X) where X is a type. 11019 // Notably, there must be *exactly* one set of parens if X is a type. 11020 TypeSourceInfo *RecoveryTSI = nullptr; 11021 ExprResult SubExpr; 11022 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 11023 if (auto *DRE = 11024 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 11025 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 11026 PE, DRE, false, &RecoveryTSI); 11027 else 11028 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 11029 11030 if (RecoveryTSI) { 11031 return getDerived().RebuildUnaryExprOrTypeTrait( 11032 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 11033 } else if (SubExpr.isInvalid()) 11034 return ExprError(); 11035 11036 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 11037 return E; 11038 11039 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 11040 E->getOperatorLoc(), 11041 E->getKind(), 11042 E->getSourceRange()); 11043 } 11044 11045 template<typename Derived> 11046 ExprResult 11047 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 11048 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11049 if (LHS.isInvalid()) 11050 return ExprError(); 11051 11052 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11053 if (RHS.isInvalid()) 11054 return ExprError(); 11055 11056 11057 if (!getDerived().AlwaysRebuild() && 11058 LHS.get() == E->getLHS() && 11059 RHS.get() == E->getRHS()) 11060 return E; 11061 11062 return getDerived().RebuildArraySubscriptExpr( 11063 LHS.get(), 11064 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 11065 } 11066 11067 template <typename Derived> 11068 ExprResult 11069 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 11070 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11071 if (Base.isInvalid()) 11072 return ExprError(); 11073 11074 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 11075 if (RowIdx.isInvalid()) 11076 return ExprError(); 11077 11078 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 11079 if (ColumnIdx.isInvalid()) 11080 return ExprError(); 11081 11082 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11083 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 11084 return E; 11085 11086 return getDerived().RebuildMatrixSubscriptExpr( 11087 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 11088 } 11089 11090 template <typename Derived> 11091 ExprResult 11092 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 11093 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11094 if (Base.isInvalid()) 11095 return ExprError(); 11096 11097 ExprResult LowerBound; 11098 if (E->getLowerBound()) { 11099 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 11100 if (LowerBound.isInvalid()) 11101 return ExprError(); 11102 } 11103 11104 ExprResult Length; 11105 if (E->getLength()) { 11106 Length = getDerived().TransformExpr(E->getLength()); 11107 if (Length.isInvalid()) 11108 return ExprError(); 11109 } 11110 11111 ExprResult Stride; 11112 if (Expr *Str = E->getStride()) { 11113 Stride = getDerived().TransformExpr(Str); 11114 if (Stride.isInvalid()) 11115 return ExprError(); 11116 } 11117 11118 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11119 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 11120 return E; 11121 11122 return getDerived().RebuildOMPArraySectionExpr( 11123 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 11124 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 11125 E->getRBracketLoc()); 11126 } 11127 11128 template <typename Derived> 11129 ExprResult 11130 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 11131 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11132 if (Base.isInvalid()) 11133 return ExprError(); 11134 11135 SmallVector<Expr *, 4> Dims; 11136 bool ErrorFound = false; 11137 for (Expr *Dim : E->getDimensions()) { 11138 ExprResult DimRes = getDerived().TransformExpr(Dim); 11139 if (DimRes.isInvalid()) { 11140 ErrorFound = true; 11141 continue; 11142 } 11143 Dims.push_back(DimRes.get()); 11144 } 11145 11146 if (ErrorFound) 11147 return ExprError(); 11148 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 11149 E->getRParenLoc(), Dims, 11150 E->getBracketsRanges()); 11151 } 11152 11153 template <typename Derived> 11154 ExprResult 11155 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 11156 unsigned NumIterators = E->numOfIterators(); 11157 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 11158 11159 bool ErrorFound = false; 11160 bool NeedToRebuild = getDerived().AlwaysRebuild(); 11161 for (unsigned I = 0; I < NumIterators; ++I) { 11162 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 11163 Data[I].DeclIdent = D->getIdentifier(); 11164 Data[I].DeclIdentLoc = D->getLocation(); 11165 if (D->getLocation() == D->getBeginLoc()) { 11166 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 11167 "Implicit type must be int."); 11168 } else { 11169 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 11170 QualType DeclTy = getDerived().TransformType(D->getType()); 11171 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 11172 } 11173 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 11174 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 11175 ExprResult End = getDerived().TransformExpr(Range.End); 11176 ExprResult Step = getDerived().TransformExpr(Range.Step); 11177 ErrorFound = ErrorFound || 11178 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 11179 !Data[I].Type.get().isNull())) || 11180 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 11181 if (ErrorFound) 11182 continue; 11183 Data[I].Range.Begin = Begin.get(); 11184 Data[I].Range.End = End.get(); 11185 Data[I].Range.Step = Step.get(); 11186 Data[I].AssignLoc = E->getAssignLoc(I); 11187 Data[I].ColonLoc = E->getColonLoc(I); 11188 Data[I].SecColonLoc = E->getSecondColonLoc(I); 11189 NeedToRebuild = 11190 NeedToRebuild || 11191 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 11192 D->getType().getTypePtrOrNull()) || 11193 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 11194 Range.Step != Data[I].Range.Step; 11195 } 11196 if (ErrorFound) 11197 return ExprError(); 11198 if (!NeedToRebuild) 11199 return E; 11200 11201 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 11202 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 11203 if (!Res.isUsable()) 11204 return Res; 11205 auto *IE = cast<OMPIteratorExpr>(Res.get()); 11206 for (unsigned I = 0; I < NumIterators; ++I) 11207 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 11208 IE->getIteratorDecl(I)); 11209 return Res; 11210 } 11211 11212 template<typename Derived> 11213 ExprResult 11214 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 11215 // Transform the callee. 11216 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11217 if (Callee.isInvalid()) 11218 return ExprError(); 11219 11220 // Transform arguments. 11221 bool ArgChanged = false; 11222 SmallVector<Expr*, 8> Args; 11223 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11224 &ArgChanged)) 11225 return ExprError(); 11226 11227 if (!getDerived().AlwaysRebuild() && 11228 Callee.get() == E->getCallee() && 11229 !ArgChanged) 11230 return SemaRef.MaybeBindToTemporary(E); 11231 11232 // FIXME: Wrong source location information for the '('. 11233 SourceLocation FakeLParenLoc 11234 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11235 11236 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11237 if (E->hasStoredFPFeatures()) { 11238 FPOptionsOverride NewOverrides = E->getFPFeatures(); 11239 getSema().CurFPFeatures = 11240 NewOverrides.applyOverrides(getSema().getLangOpts()); 11241 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11242 } 11243 11244 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11245 Args, 11246 E->getRParenLoc()); 11247 } 11248 11249 template<typename Derived> 11250 ExprResult 11251 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 11252 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11253 if (Base.isInvalid()) 11254 return ExprError(); 11255 11256 NestedNameSpecifierLoc QualifierLoc; 11257 if (E->hasQualifier()) { 11258 QualifierLoc 11259 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11260 11261 if (!QualifierLoc) 11262 return ExprError(); 11263 } 11264 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11265 11266 ValueDecl *Member 11267 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 11268 E->getMemberDecl())); 11269 if (!Member) 11270 return ExprError(); 11271 11272 NamedDecl *FoundDecl = E->getFoundDecl(); 11273 if (FoundDecl == E->getMemberDecl()) { 11274 FoundDecl = Member; 11275 } else { 11276 FoundDecl = cast_or_null<NamedDecl>( 11277 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11278 if (!FoundDecl) 11279 return ExprError(); 11280 } 11281 11282 if (!getDerived().AlwaysRebuild() && 11283 Base.get() == E->getBase() && 11284 QualifierLoc == E->getQualifierLoc() && 11285 Member == E->getMemberDecl() && 11286 FoundDecl == E->getFoundDecl() && 11287 !E->hasExplicitTemplateArgs()) { 11288 11289 // Skip for member expression of (this->f), rebuilt thisi->f is needed 11290 // for Openmp where the field need to be privatizized in the case. 11291 if (!(isa<CXXThisExpr>(E->getBase()) && 11292 getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) { 11293 // Mark it referenced in the new context regardless. 11294 // FIXME: this is a bit instantiation-specific. 11295 SemaRef.MarkMemberReferenced(E); 11296 return E; 11297 } 11298 } 11299 11300 TemplateArgumentListInfo TransArgs; 11301 if (E->hasExplicitTemplateArgs()) { 11302 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11303 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11304 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11305 E->getNumTemplateArgs(), 11306 TransArgs)) 11307 return ExprError(); 11308 } 11309 11310 // FIXME: Bogus source location for the operator 11311 SourceLocation FakeOperatorLoc = 11312 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11313 11314 // FIXME: to do this check properly, we will need to preserve the 11315 // first-qualifier-in-scope here, just in case we had a dependent 11316 // base (and therefore couldn't do the check) and a 11317 // nested-name-qualifier (and therefore could do the lookup). 11318 NamedDecl *FirstQualifierInScope = nullptr; 11319 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11320 if (MemberNameInfo.getName()) { 11321 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11322 if (!MemberNameInfo.getName()) 11323 return ExprError(); 11324 } 11325 11326 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11327 E->isArrow(), 11328 QualifierLoc, 11329 TemplateKWLoc, 11330 MemberNameInfo, 11331 Member, 11332 FoundDecl, 11333 (E->hasExplicitTemplateArgs() 11334 ? &TransArgs : nullptr), 11335 FirstQualifierInScope); 11336 } 11337 11338 template<typename Derived> 11339 ExprResult 11340 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11341 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11342 if (LHS.isInvalid()) 11343 return ExprError(); 11344 11345 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11346 if (RHS.isInvalid()) 11347 return ExprError(); 11348 11349 if (!getDerived().AlwaysRebuild() && 11350 LHS.get() == E->getLHS() && 11351 RHS.get() == E->getRHS()) 11352 return E; 11353 11354 if (E->isCompoundAssignmentOp()) 11355 // FPFeatures has already been established from trailing storage 11356 return getDerived().RebuildBinaryOperator( 11357 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11358 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11359 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11360 getSema().CurFPFeatures = 11361 NewOverrides.applyOverrides(getSema().getLangOpts()); 11362 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11363 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11364 LHS.get(), RHS.get()); 11365 } 11366 11367 template <typename Derived> 11368 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11369 CXXRewrittenBinaryOperator *E) { 11370 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11371 11372 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11373 if (LHS.isInvalid()) 11374 return ExprError(); 11375 11376 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11377 if (RHS.isInvalid()) 11378 return ExprError(); 11379 11380 // Extract the already-resolved callee declarations so that we can restrict 11381 // ourselves to using them as the unqualified lookup results when rebuilding. 11382 UnresolvedSet<2> UnqualLookups; 11383 bool ChangedAnyLookups = false; 11384 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11385 const_cast<Expr *>(Decomp.InnerBinOp)}; 11386 for (Expr *PossibleBinOp : PossibleBinOps) { 11387 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11388 if (!Op) 11389 continue; 11390 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11391 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11392 continue; 11393 11394 // Transform the callee in case we built a call to a local extern 11395 // declaration. 11396 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11397 E->getOperatorLoc(), Callee->getFoundDecl())); 11398 if (!Found) 11399 return ExprError(); 11400 if (Found != Callee->getFoundDecl()) 11401 ChangedAnyLookups = true; 11402 UnqualLookups.addDecl(Found); 11403 } 11404 11405 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11406 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11407 // Mark all functions used in the rewrite as referenced. Note that when 11408 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11409 // function calls, and/or there might be a user-defined conversion sequence 11410 // applied to the operands of the <. 11411 // FIXME: this is a bit instantiation-specific. 11412 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11413 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11414 return E; 11415 } 11416 11417 return getDerived().RebuildCXXRewrittenBinaryOperator( 11418 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11419 } 11420 11421 template<typename Derived> 11422 ExprResult 11423 TreeTransform<Derived>::TransformCompoundAssignOperator( 11424 CompoundAssignOperator *E) { 11425 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11426 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11427 getSema().CurFPFeatures = 11428 NewOverrides.applyOverrides(getSema().getLangOpts()); 11429 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11430 return getDerived().TransformBinaryOperator(E); 11431 } 11432 11433 template<typename Derived> 11434 ExprResult TreeTransform<Derived>:: 11435 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11436 // Just rebuild the common and RHS expressions and see whether we 11437 // get any changes. 11438 11439 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11440 if (commonExpr.isInvalid()) 11441 return ExprError(); 11442 11443 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11444 if (rhs.isInvalid()) 11445 return ExprError(); 11446 11447 if (!getDerived().AlwaysRebuild() && 11448 commonExpr.get() == e->getCommon() && 11449 rhs.get() == e->getFalseExpr()) 11450 return e; 11451 11452 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11453 e->getQuestionLoc(), 11454 nullptr, 11455 e->getColonLoc(), 11456 rhs.get()); 11457 } 11458 11459 template<typename Derived> 11460 ExprResult 11461 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11462 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11463 if (Cond.isInvalid()) 11464 return ExprError(); 11465 11466 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11467 if (LHS.isInvalid()) 11468 return ExprError(); 11469 11470 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11471 if (RHS.isInvalid()) 11472 return ExprError(); 11473 11474 if (!getDerived().AlwaysRebuild() && 11475 Cond.get() == E->getCond() && 11476 LHS.get() == E->getLHS() && 11477 RHS.get() == E->getRHS()) 11478 return E; 11479 11480 return getDerived().RebuildConditionalOperator(Cond.get(), 11481 E->getQuestionLoc(), 11482 LHS.get(), 11483 E->getColonLoc(), 11484 RHS.get()); 11485 } 11486 11487 template<typename Derived> 11488 ExprResult 11489 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11490 // Implicit casts are eliminated during transformation, since they 11491 // will be recomputed by semantic analysis after transformation. 11492 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11493 } 11494 11495 template<typename Derived> 11496 ExprResult 11497 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11498 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11499 if (!Type) 11500 return ExprError(); 11501 11502 ExprResult SubExpr 11503 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11504 if (SubExpr.isInvalid()) 11505 return ExprError(); 11506 11507 if (!getDerived().AlwaysRebuild() && 11508 Type == E->getTypeInfoAsWritten() && 11509 SubExpr.get() == E->getSubExpr()) 11510 return E; 11511 11512 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11513 Type, 11514 E->getRParenLoc(), 11515 SubExpr.get()); 11516 } 11517 11518 template<typename Derived> 11519 ExprResult 11520 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11521 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11522 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11523 if (!NewT) 11524 return ExprError(); 11525 11526 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11527 if (Init.isInvalid()) 11528 return ExprError(); 11529 11530 if (!getDerived().AlwaysRebuild() && 11531 OldT == NewT && 11532 Init.get() == E->getInitializer()) 11533 return SemaRef.MaybeBindToTemporary(E); 11534 11535 // Note: the expression type doesn't necessarily match the 11536 // type-as-written, but that's okay, because it should always be 11537 // derivable from the initializer. 11538 11539 return getDerived().RebuildCompoundLiteralExpr( 11540 E->getLParenLoc(), NewT, 11541 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11542 } 11543 11544 template<typename Derived> 11545 ExprResult 11546 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11547 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11548 if (Base.isInvalid()) 11549 return ExprError(); 11550 11551 if (!getDerived().AlwaysRebuild() && 11552 Base.get() == E->getBase()) 11553 return E; 11554 11555 // FIXME: Bad source location 11556 SourceLocation FakeOperatorLoc = 11557 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11558 return getDerived().RebuildExtVectorElementExpr( 11559 Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(), 11560 E->getAccessor()); 11561 } 11562 11563 template<typename Derived> 11564 ExprResult 11565 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11566 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11567 E = Syntactic; 11568 11569 bool InitChanged = false; 11570 11571 EnterExpressionEvaluationContext Context( 11572 getSema(), EnterExpressionEvaluationContext::InitList); 11573 11574 SmallVector<Expr*, 4> Inits; 11575 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11576 Inits, &InitChanged)) 11577 return ExprError(); 11578 11579 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11580 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11581 // in some cases. We can't reuse it in general, because the syntactic and 11582 // semantic forms are linked, and we can't know that semantic form will 11583 // match even if the syntactic form does. 11584 } 11585 11586 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11587 E->getRBraceLoc()); 11588 } 11589 11590 template<typename Derived> 11591 ExprResult 11592 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11593 Designation Desig; 11594 11595 // transform the initializer value 11596 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11597 if (Init.isInvalid()) 11598 return ExprError(); 11599 11600 // transform the designators. 11601 SmallVector<Expr*, 4> ArrayExprs; 11602 bool ExprChanged = false; 11603 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11604 if (D.isFieldDesignator()) { 11605 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11606 D.getDotLoc(), 11607 D.getFieldLoc())); 11608 if (D.getField()) { 11609 FieldDecl *Field = cast_or_null<FieldDecl>( 11610 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11611 if (Field != D.getField()) 11612 // Rebuild the expression when the transformed FieldDecl is 11613 // different to the already assigned FieldDecl. 11614 ExprChanged = true; 11615 } else { 11616 // Ensure that the designator expression is rebuilt when there isn't 11617 // a resolved FieldDecl in the designator as we don't want to assign 11618 // a FieldDecl to a pattern designator that will be instantiated again. 11619 ExprChanged = true; 11620 } 11621 continue; 11622 } 11623 11624 if (D.isArrayDesignator()) { 11625 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11626 if (Index.isInvalid()) 11627 return ExprError(); 11628 11629 Desig.AddDesignator( 11630 Designator::getArray(Index.get(), D.getLBracketLoc())); 11631 11632 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11633 ArrayExprs.push_back(Index.get()); 11634 continue; 11635 } 11636 11637 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11638 ExprResult Start 11639 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11640 if (Start.isInvalid()) 11641 return ExprError(); 11642 11643 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11644 if (End.isInvalid()) 11645 return ExprError(); 11646 11647 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11648 End.get(), 11649 D.getLBracketLoc(), 11650 D.getEllipsisLoc())); 11651 11652 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11653 End.get() != E->getArrayRangeEnd(D); 11654 11655 ArrayExprs.push_back(Start.get()); 11656 ArrayExprs.push_back(End.get()); 11657 } 11658 11659 if (!getDerived().AlwaysRebuild() && 11660 Init.get() == E->getInit() && 11661 !ExprChanged) 11662 return E; 11663 11664 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11665 E->getEqualOrColonLoc(), 11666 E->usesGNUSyntax(), Init.get()); 11667 } 11668 11669 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11670 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11671 template<typename Derived> 11672 ExprResult 11673 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11674 DesignatedInitUpdateExpr *E) { 11675 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11676 "initializer"); 11677 return ExprError(); 11678 } 11679 11680 template<typename Derived> 11681 ExprResult 11682 TreeTransform<Derived>::TransformNoInitExpr( 11683 NoInitExpr *E) { 11684 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11685 return ExprError(); 11686 } 11687 11688 template<typename Derived> 11689 ExprResult 11690 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11691 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11692 return ExprError(); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11698 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11699 return ExprError(); 11700 } 11701 11702 template<typename Derived> 11703 ExprResult 11704 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11705 ImplicitValueInitExpr *E) { 11706 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11707 11708 // FIXME: Will we ever have proper type location here? Will we actually 11709 // need to transform the type? 11710 QualType T = getDerived().TransformType(E->getType()); 11711 if (T.isNull()) 11712 return ExprError(); 11713 11714 if (!getDerived().AlwaysRebuild() && 11715 T == E->getType()) 11716 return E; 11717 11718 return getDerived().RebuildImplicitValueInitExpr(T); 11719 } 11720 11721 template<typename Derived> 11722 ExprResult 11723 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11724 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11725 if (!TInfo) 11726 return ExprError(); 11727 11728 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11729 if (SubExpr.isInvalid()) 11730 return ExprError(); 11731 11732 if (!getDerived().AlwaysRebuild() && 11733 TInfo == E->getWrittenTypeInfo() && 11734 SubExpr.get() == E->getSubExpr()) 11735 return E; 11736 11737 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11738 TInfo, E->getRParenLoc()); 11739 } 11740 11741 template<typename Derived> 11742 ExprResult 11743 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11744 bool ArgumentChanged = false; 11745 SmallVector<Expr*, 4> Inits; 11746 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11747 &ArgumentChanged)) 11748 return ExprError(); 11749 11750 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11751 Inits, 11752 E->getRParenLoc()); 11753 } 11754 11755 /// Transform an address-of-label expression. 11756 /// 11757 /// By default, the transformation of an address-of-label expression always 11758 /// rebuilds the expression, so that the label identifier can be resolved to 11759 /// the corresponding label statement by semantic analysis. 11760 template<typename Derived> 11761 ExprResult 11762 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11763 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11764 E->getLabel()); 11765 if (!LD) 11766 return ExprError(); 11767 11768 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11769 cast<LabelDecl>(LD)); 11770 } 11771 11772 template<typename Derived> 11773 ExprResult 11774 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11775 SemaRef.ActOnStartStmtExpr(); 11776 StmtResult SubStmt 11777 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11778 if (SubStmt.isInvalid()) { 11779 SemaRef.ActOnStmtExprError(); 11780 return ExprError(); 11781 } 11782 11783 unsigned OldDepth = E->getTemplateDepth(); 11784 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11785 11786 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11787 SubStmt.get() == E->getSubStmt()) { 11788 // Calling this an 'error' is unintuitive, but it does the right thing. 11789 SemaRef.ActOnStmtExprError(); 11790 return SemaRef.MaybeBindToTemporary(E); 11791 } 11792 11793 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11794 E->getRParenLoc(), NewDepth); 11795 } 11796 11797 template<typename Derived> 11798 ExprResult 11799 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11800 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11801 if (Cond.isInvalid()) 11802 return ExprError(); 11803 11804 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11805 if (LHS.isInvalid()) 11806 return ExprError(); 11807 11808 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11809 if (RHS.isInvalid()) 11810 return ExprError(); 11811 11812 if (!getDerived().AlwaysRebuild() && 11813 Cond.get() == E->getCond() && 11814 LHS.get() == E->getLHS() && 11815 RHS.get() == E->getRHS()) 11816 return E; 11817 11818 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11819 Cond.get(), LHS.get(), RHS.get(), 11820 E->getRParenLoc()); 11821 } 11822 11823 template<typename Derived> 11824 ExprResult 11825 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11826 return E; 11827 } 11828 11829 template<typename Derived> 11830 ExprResult 11831 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11832 switch (E->getOperator()) { 11833 case OO_New: 11834 case OO_Delete: 11835 case OO_Array_New: 11836 case OO_Array_Delete: 11837 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11838 11839 case OO_Subscript: 11840 case OO_Call: { 11841 // This is a call to an object's operator(). 11842 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11843 11844 // Transform the object itself. 11845 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11846 if (Object.isInvalid()) 11847 return ExprError(); 11848 11849 // FIXME: Poor location information 11850 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11851 static_cast<Expr *>(Object.get())->getEndLoc()); 11852 11853 // Transform the call arguments. 11854 SmallVector<Expr*, 8> Args; 11855 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11856 Args)) 11857 return ExprError(); 11858 11859 if (E->getOperator() == OO_Subscript) 11860 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11861 Args, E->getEndLoc()); 11862 11863 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11864 E->getEndLoc()); 11865 } 11866 11867 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11868 case OO_##Name: \ 11869 break; 11870 11871 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11872 #include "clang/Basic/OperatorKinds.def" 11873 11874 case OO_Conditional: 11875 llvm_unreachable("conditional operator is not actually overloadable"); 11876 11877 case OO_None: 11878 case NUM_OVERLOADED_OPERATORS: 11879 llvm_unreachable("not an overloaded operator?"); 11880 } 11881 11882 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11883 if (Callee.isInvalid()) 11884 return ExprError(); 11885 11886 ExprResult First; 11887 if (E->getOperator() == OO_Amp) 11888 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11889 else 11890 First = getDerived().TransformExpr(E->getArg(0)); 11891 if (First.isInvalid()) 11892 return ExprError(); 11893 11894 ExprResult Second; 11895 if (E->getNumArgs() == 2) { 11896 Second = getDerived().TransformExpr(E->getArg(1)); 11897 if (Second.isInvalid()) 11898 return ExprError(); 11899 } 11900 11901 if (!getDerived().AlwaysRebuild() && 11902 Callee.get() == E->getCallee() && 11903 First.get() == E->getArg(0) && 11904 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11905 return SemaRef.MaybeBindToTemporary(E); 11906 11907 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11908 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11909 getSema().CurFPFeatures = 11910 NewOverrides.applyOverrides(getSema().getLangOpts()); 11911 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11912 11913 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11914 E->getOperatorLoc(), 11915 Callee.get(), 11916 First.get(), 11917 Second.get()); 11918 } 11919 11920 template<typename Derived> 11921 ExprResult 11922 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11923 return getDerived().TransformCallExpr(E); 11924 } 11925 11926 template <typename Derived> 11927 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11928 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11929 getSema().CurContext != E->getParentContext(); 11930 11931 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11932 return E; 11933 11934 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 11935 E->getBeginLoc(), E->getEndLoc(), 11936 getSema().CurContext); 11937 } 11938 11939 template<typename Derived> 11940 ExprResult 11941 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11942 // Transform the callee. 11943 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11944 if (Callee.isInvalid()) 11945 return ExprError(); 11946 11947 // Transform exec config. 11948 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11949 if (EC.isInvalid()) 11950 return ExprError(); 11951 11952 // Transform arguments. 11953 bool ArgChanged = false; 11954 SmallVector<Expr*, 8> Args; 11955 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11956 &ArgChanged)) 11957 return ExprError(); 11958 11959 if (!getDerived().AlwaysRebuild() && 11960 Callee.get() == E->getCallee() && 11961 !ArgChanged) 11962 return SemaRef.MaybeBindToTemporary(E); 11963 11964 // FIXME: Wrong source location information for the '('. 11965 SourceLocation FakeLParenLoc 11966 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11967 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11968 Args, 11969 E->getRParenLoc(), EC.get()); 11970 } 11971 11972 template<typename Derived> 11973 ExprResult 11974 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11975 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11976 if (!Type) 11977 return ExprError(); 11978 11979 ExprResult SubExpr 11980 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11981 if (SubExpr.isInvalid()) 11982 return ExprError(); 11983 11984 if (!getDerived().AlwaysRebuild() && 11985 Type == E->getTypeInfoAsWritten() && 11986 SubExpr.get() == E->getSubExpr()) 11987 return E; 11988 return getDerived().RebuildCXXNamedCastExpr( 11989 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11990 Type, E->getAngleBrackets().getEnd(), 11991 // FIXME. this should be '(' location 11992 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11993 } 11994 11995 template<typename Derived> 11996 ExprResult 11997 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11998 TypeSourceInfo *TSI = 11999 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 12000 if (!TSI) 12001 return ExprError(); 12002 12003 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 12004 if (Sub.isInvalid()) 12005 return ExprError(); 12006 12007 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 12008 Sub.get(), BCE->getEndLoc()); 12009 } 12010 12011 template<typename Derived> 12012 ExprResult 12013 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 12014 return getDerived().TransformCXXNamedCastExpr(E); 12015 } 12016 12017 template<typename Derived> 12018 ExprResult 12019 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 12020 return getDerived().TransformCXXNamedCastExpr(E); 12021 } 12022 12023 template<typename Derived> 12024 ExprResult 12025 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 12026 CXXReinterpretCastExpr *E) { 12027 return getDerived().TransformCXXNamedCastExpr(E); 12028 } 12029 12030 template<typename Derived> 12031 ExprResult 12032 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 12033 return getDerived().TransformCXXNamedCastExpr(E); 12034 } 12035 12036 template<typename Derived> 12037 ExprResult 12038 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 12039 return getDerived().TransformCXXNamedCastExpr(E); 12040 } 12041 12042 template<typename Derived> 12043 ExprResult 12044 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 12045 CXXFunctionalCastExpr *E) { 12046 TypeSourceInfo *Type = 12047 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 12048 if (!Type) 12049 return ExprError(); 12050 12051 ExprResult SubExpr 12052 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12053 if (SubExpr.isInvalid()) 12054 return ExprError(); 12055 12056 if (!getDerived().AlwaysRebuild() && 12057 Type == E->getTypeInfoAsWritten() && 12058 SubExpr.get() == E->getSubExpr()) 12059 return E; 12060 12061 return getDerived().RebuildCXXFunctionalCastExpr(Type, 12062 E->getLParenLoc(), 12063 SubExpr.get(), 12064 E->getRParenLoc(), 12065 E->isListInitialization()); 12066 } 12067 12068 template<typename Derived> 12069 ExprResult 12070 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 12071 if (E->isTypeOperand()) { 12072 TypeSourceInfo *TInfo 12073 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12074 if (!TInfo) 12075 return ExprError(); 12076 12077 if (!getDerived().AlwaysRebuild() && 12078 TInfo == E->getTypeOperandSourceInfo()) 12079 return E; 12080 12081 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12082 TInfo, E->getEndLoc()); 12083 } 12084 12085 // Typeid's operand is an unevaluated context, unless it's a polymorphic 12086 // type. We must not unilaterally enter unevaluated context here, as then 12087 // semantic processing can re-transform an already transformed operand. 12088 Expr *Op = E->getExprOperand(); 12089 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 12090 if (E->isGLValue()) 12091 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 12092 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 12093 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 12094 12095 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 12096 Sema::ReuseLambdaContextDecl); 12097 12098 ExprResult SubExpr = getDerived().TransformExpr(Op); 12099 if (SubExpr.isInvalid()) 12100 return ExprError(); 12101 12102 if (!getDerived().AlwaysRebuild() && 12103 SubExpr.get() == E->getExprOperand()) 12104 return E; 12105 12106 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12107 SubExpr.get(), E->getEndLoc()); 12108 } 12109 12110 template<typename Derived> 12111 ExprResult 12112 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 12113 if (E->isTypeOperand()) { 12114 TypeSourceInfo *TInfo 12115 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12116 if (!TInfo) 12117 return ExprError(); 12118 12119 if (!getDerived().AlwaysRebuild() && 12120 TInfo == E->getTypeOperandSourceInfo()) 12121 return E; 12122 12123 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12124 TInfo, E->getEndLoc()); 12125 } 12126 12127 EnterExpressionEvaluationContext Unevaluated( 12128 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12129 12130 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 12131 if (SubExpr.isInvalid()) 12132 return ExprError(); 12133 12134 if (!getDerived().AlwaysRebuild() && 12135 SubExpr.get() == E->getExprOperand()) 12136 return E; 12137 12138 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12139 SubExpr.get(), E->getEndLoc()); 12140 } 12141 12142 template<typename Derived> 12143 ExprResult 12144 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 12145 return E; 12146 } 12147 12148 template<typename Derived> 12149 ExprResult 12150 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 12151 CXXNullPtrLiteralExpr *E) { 12152 return E; 12153 } 12154 12155 template<typename Derived> 12156 ExprResult 12157 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 12158 QualType T = getSema().getCurrentThisType(); 12159 12160 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 12161 // Mark it referenced in the new context regardless. 12162 // FIXME: this is a bit instantiation-specific. 12163 getSema().MarkThisReferenced(E); 12164 return E; 12165 } 12166 12167 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 12168 } 12169 12170 template<typename Derived> 12171 ExprResult 12172 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 12173 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12174 if (SubExpr.isInvalid()) 12175 return ExprError(); 12176 12177 if (!getDerived().AlwaysRebuild() && 12178 SubExpr.get() == E->getSubExpr()) 12179 return E; 12180 12181 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 12182 E->isThrownVariableInScope()); 12183 } 12184 12185 template<typename Derived> 12186 ExprResult 12187 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 12188 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 12189 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 12190 if (!Param) 12191 return ExprError(); 12192 12193 ExprResult InitRes; 12194 if (E->hasRewrittenInit()) { 12195 InitRes = getDerived().TransformExpr(E->getRewrittenExpr()); 12196 if (InitRes.isInvalid()) 12197 return ExprError(); 12198 } 12199 12200 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 12201 E->getUsedContext() == SemaRef.CurContext && 12202 InitRes.get() == E->getRewrittenExpr()) 12203 return E; 12204 12205 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param, 12206 InitRes.get()); 12207 } 12208 12209 template<typename Derived> 12210 ExprResult 12211 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 12212 FieldDecl *Field = cast_or_null<FieldDecl>( 12213 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 12214 if (!Field) 12215 return ExprError(); 12216 12217 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 12218 E->getUsedContext() == SemaRef.CurContext) 12219 return E; 12220 12221 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 12222 } 12223 12224 template<typename Derived> 12225 ExprResult 12226 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 12227 CXXScalarValueInitExpr *E) { 12228 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 12229 if (!T) 12230 return ExprError(); 12231 12232 if (!getDerived().AlwaysRebuild() && 12233 T == E->getTypeSourceInfo()) 12234 return E; 12235 12236 return getDerived().RebuildCXXScalarValueInitExpr(T, 12237 /*FIXME:*/T->getTypeLoc().getEndLoc(), 12238 E->getRParenLoc()); 12239 } 12240 12241 template<typename Derived> 12242 ExprResult 12243 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 12244 // Transform the type that we're allocating 12245 TypeSourceInfo *AllocTypeInfo = 12246 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 12247 if (!AllocTypeInfo) 12248 return ExprError(); 12249 12250 // Transform the size of the array we're allocating (if any). 12251 std::optional<Expr *> ArraySize; 12252 if (E->isArray()) { 12253 ExprResult NewArraySize; 12254 if (std::optional<Expr *> OldArraySize = E->getArraySize()) { 12255 NewArraySize = getDerived().TransformExpr(*OldArraySize); 12256 if (NewArraySize.isInvalid()) 12257 return ExprError(); 12258 } 12259 ArraySize = NewArraySize.get(); 12260 } 12261 12262 // Transform the placement arguments (if any). 12263 bool ArgumentChanged = false; 12264 SmallVector<Expr*, 8> PlacementArgs; 12265 if (getDerived().TransformExprs(E->getPlacementArgs(), 12266 E->getNumPlacementArgs(), true, 12267 PlacementArgs, &ArgumentChanged)) 12268 return ExprError(); 12269 12270 // Transform the initializer (if any). 12271 Expr *OldInit = E->getInitializer(); 12272 ExprResult NewInit; 12273 if (OldInit) 12274 NewInit = getDerived().TransformInitializer(OldInit, true); 12275 if (NewInit.isInvalid()) 12276 return ExprError(); 12277 12278 // Transform new operator and delete operator. 12279 FunctionDecl *OperatorNew = nullptr; 12280 if (E->getOperatorNew()) { 12281 OperatorNew = cast_or_null<FunctionDecl>( 12282 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 12283 if (!OperatorNew) 12284 return ExprError(); 12285 } 12286 12287 FunctionDecl *OperatorDelete = nullptr; 12288 if (E->getOperatorDelete()) { 12289 OperatorDelete = cast_or_null<FunctionDecl>( 12290 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12291 if (!OperatorDelete) 12292 return ExprError(); 12293 } 12294 12295 if (!getDerived().AlwaysRebuild() && 12296 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12297 ArraySize == E->getArraySize() && 12298 NewInit.get() == OldInit && 12299 OperatorNew == E->getOperatorNew() && 12300 OperatorDelete == E->getOperatorDelete() && 12301 !ArgumentChanged) { 12302 // Mark any declarations we need as referenced. 12303 // FIXME: instantiation-specific. 12304 if (OperatorNew) 12305 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12306 if (OperatorDelete) 12307 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12308 12309 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12310 QualType ElementType 12311 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12312 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12313 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12314 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12315 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12316 } 12317 } 12318 } 12319 12320 return E; 12321 } 12322 12323 QualType AllocType = AllocTypeInfo->getType(); 12324 if (!ArraySize) { 12325 // If no array size was specified, but the new expression was 12326 // instantiated with an array type (e.g., "new T" where T is 12327 // instantiated with "int[4]"), extract the outer bound from the 12328 // array type as our array size. We do this with constant and 12329 // dependently-sized array types. 12330 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12331 if (!ArrayT) { 12332 // Do nothing 12333 } else if (const ConstantArrayType *ConsArrayT 12334 = dyn_cast<ConstantArrayType>(ArrayT)) { 12335 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12336 SemaRef.Context.getSizeType(), 12337 /*FIXME:*/ E->getBeginLoc()); 12338 AllocType = ConsArrayT->getElementType(); 12339 } else if (const DependentSizedArrayType *DepArrayT 12340 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12341 if (DepArrayT->getSizeExpr()) { 12342 ArraySize = DepArrayT->getSizeExpr(); 12343 AllocType = DepArrayT->getElementType(); 12344 } 12345 } 12346 } 12347 12348 return getDerived().RebuildCXXNewExpr( 12349 E->getBeginLoc(), E->isGlobalNew(), 12350 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12351 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12352 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12353 } 12354 12355 template<typename Derived> 12356 ExprResult 12357 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12358 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12359 if (Operand.isInvalid()) 12360 return ExprError(); 12361 12362 // Transform the delete operator, if known. 12363 FunctionDecl *OperatorDelete = nullptr; 12364 if (E->getOperatorDelete()) { 12365 OperatorDelete = cast_or_null<FunctionDecl>( 12366 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12367 if (!OperatorDelete) 12368 return ExprError(); 12369 } 12370 12371 if (!getDerived().AlwaysRebuild() && 12372 Operand.get() == E->getArgument() && 12373 OperatorDelete == E->getOperatorDelete()) { 12374 // Mark any declarations we need as referenced. 12375 // FIXME: instantiation-specific. 12376 if (OperatorDelete) 12377 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12378 12379 if (!E->getArgument()->isTypeDependent()) { 12380 QualType Destroyed = SemaRef.Context.getBaseElementType( 12381 E->getDestroyedType()); 12382 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12383 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12384 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12385 SemaRef.LookupDestructor(Record)); 12386 } 12387 } 12388 12389 return E; 12390 } 12391 12392 return getDerived().RebuildCXXDeleteExpr( 12393 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12394 } 12395 12396 template<typename Derived> 12397 ExprResult 12398 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12399 CXXPseudoDestructorExpr *E) { 12400 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12401 if (Base.isInvalid()) 12402 return ExprError(); 12403 12404 ParsedType ObjectTypePtr; 12405 bool MayBePseudoDestructor = false; 12406 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12407 E->getOperatorLoc(), 12408 E->isArrow()? tok::arrow : tok::period, 12409 ObjectTypePtr, 12410 MayBePseudoDestructor); 12411 if (Base.isInvalid()) 12412 return ExprError(); 12413 12414 QualType ObjectType = ObjectTypePtr.get(); 12415 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12416 if (QualifierLoc) { 12417 QualifierLoc 12418 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12419 if (!QualifierLoc) 12420 return ExprError(); 12421 } 12422 CXXScopeSpec SS; 12423 SS.Adopt(QualifierLoc); 12424 12425 PseudoDestructorTypeStorage Destroyed; 12426 if (E->getDestroyedTypeInfo()) { 12427 TypeSourceInfo *DestroyedTypeInfo 12428 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12429 ObjectType, nullptr, SS); 12430 if (!DestroyedTypeInfo) 12431 return ExprError(); 12432 Destroyed = DestroyedTypeInfo; 12433 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12434 // We aren't likely to be able to resolve the identifier down to a type 12435 // now anyway, so just retain the identifier. 12436 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12437 E->getDestroyedTypeLoc()); 12438 } else { 12439 // Look for a destructor known with the given name. 12440 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12441 *E->getDestroyedTypeIdentifier(), 12442 E->getDestroyedTypeLoc(), 12443 /*Scope=*/nullptr, 12444 SS, ObjectTypePtr, 12445 false); 12446 if (!T) 12447 return ExprError(); 12448 12449 Destroyed 12450 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12451 E->getDestroyedTypeLoc()); 12452 } 12453 12454 TypeSourceInfo *ScopeTypeInfo = nullptr; 12455 if (E->getScopeTypeInfo()) { 12456 CXXScopeSpec EmptySS; 12457 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12458 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12459 if (!ScopeTypeInfo) 12460 return ExprError(); 12461 } 12462 12463 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12464 E->getOperatorLoc(), 12465 E->isArrow(), 12466 SS, 12467 ScopeTypeInfo, 12468 E->getColonColonLoc(), 12469 E->getTildeLoc(), 12470 Destroyed); 12471 } 12472 12473 template <typename Derived> 12474 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12475 bool RequiresADL, 12476 LookupResult &R) { 12477 // Transform all the decls. 12478 bool AllEmptyPacks = true; 12479 for (auto *OldD : Old->decls()) { 12480 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12481 if (!InstD) { 12482 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12483 // This can happen because of dependent hiding. 12484 if (isa<UsingShadowDecl>(OldD)) 12485 continue; 12486 else { 12487 R.clear(); 12488 return true; 12489 } 12490 } 12491 12492 // Expand using pack declarations. 12493 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12494 ArrayRef<NamedDecl*> Decls = SingleDecl; 12495 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12496 Decls = UPD->expansions(); 12497 12498 // Expand using declarations. 12499 for (auto *D : Decls) { 12500 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12501 for (auto *SD : UD->shadows()) 12502 R.addDecl(SD); 12503 } else { 12504 R.addDecl(D); 12505 } 12506 } 12507 12508 AllEmptyPacks &= Decls.empty(); 12509 }; 12510 12511 // C++ [temp.res]/8.4.2: 12512 // The program is ill-formed, no diagnostic required, if [...] lookup for 12513 // a name in the template definition found a using-declaration, but the 12514 // lookup in the corresponding scope in the instantiation odoes not find 12515 // any declarations because the using-declaration was a pack expansion and 12516 // the corresponding pack is empty 12517 if (AllEmptyPacks && !RequiresADL) { 12518 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12519 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12520 return true; 12521 } 12522 12523 // Resolve a kind, but don't do any further analysis. If it's 12524 // ambiguous, the callee needs to deal with it. 12525 R.resolveKind(); 12526 return false; 12527 } 12528 12529 template<typename Derived> 12530 ExprResult 12531 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12532 UnresolvedLookupExpr *Old) { 12533 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12534 Sema::LookupOrdinaryName); 12535 12536 // Transform the declaration set. 12537 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12538 return ExprError(); 12539 12540 // Rebuild the nested-name qualifier, if present. 12541 CXXScopeSpec SS; 12542 if (Old->getQualifierLoc()) { 12543 NestedNameSpecifierLoc QualifierLoc 12544 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12545 if (!QualifierLoc) 12546 return ExprError(); 12547 12548 SS.Adopt(QualifierLoc); 12549 } 12550 12551 if (Old->getNamingClass()) { 12552 CXXRecordDecl *NamingClass 12553 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12554 Old->getNameLoc(), 12555 Old->getNamingClass())); 12556 if (!NamingClass) { 12557 R.clear(); 12558 return ExprError(); 12559 } 12560 12561 R.setNamingClass(NamingClass); 12562 } 12563 12564 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12565 12566 // If we have neither explicit template arguments, nor the template keyword, 12567 // it's a normal declaration name or member reference. 12568 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12569 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12570 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12571 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12572 // give a good diagnostic. 12573 if (D && D->isCXXInstanceMember()) { 12574 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12575 /*TemplateArgs=*/nullptr, 12576 /*Scope=*/nullptr); 12577 } 12578 12579 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12580 } 12581 12582 // If we have template arguments, rebuild them, then rebuild the 12583 // templateid expression. 12584 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12585 if (Old->hasExplicitTemplateArgs() && 12586 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12587 Old->getNumTemplateArgs(), 12588 TransArgs)) { 12589 R.clear(); 12590 return ExprError(); 12591 } 12592 12593 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12594 Old->requiresADL(), &TransArgs); 12595 } 12596 12597 template<typename Derived> 12598 ExprResult 12599 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12600 bool ArgChanged = false; 12601 SmallVector<TypeSourceInfo *, 4> Args; 12602 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12603 TypeSourceInfo *From = E->getArg(I); 12604 TypeLoc FromTL = From->getTypeLoc(); 12605 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12606 TypeLocBuilder TLB; 12607 TLB.reserve(FromTL.getFullDataSize()); 12608 QualType To = getDerived().TransformType(TLB, FromTL); 12609 if (To.isNull()) 12610 return ExprError(); 12611 12612 if (To == From->getType()) 12613 Args.push_back(From); 12614 else { 12615 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12616 ArgChanged = true; 12617 } 12618 continue; 12619 } 12620 12621 ArgChanged = true; 12622 12623 // We have a pack expansion. Instantiate it. 12624 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12625 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12626 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12627 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12628 12629 // Determine whether the set of unexpanded parameter packs can and should 12630 // be expanded. 12631 bool Expand = true; 12632 bool RetainExpansion = false; 12633 std::optional<unsigned> OrigNumExpansions = 12634 ExpansionTL.getTypePtr()->getNumExpansions(); 12635 std::optional<unsigned> NumExpansions = OrigNumExpansions; 12636 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12637 PatternTL.getSourceRange(), 12638 Unexpanded, 12639 Expand, RetainExpansion, 12640 NumExpansions)) 12641 return ExprError(); 12642 12643 if (!Expand) { 12644 // The transform has determined that we should perform a simple 12645 // transformation on the pack expansion, producing another pack 12646 // expansion. 12647 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12648 12649 TypeLocBuilder TLB; 12650 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12651 12652 QualType To = getDerived().TransformType(TLB, PatternTL); 12653 if (To.isNull()) 12654 return ExprError(); 12655 12656 To = getDerived().RebuildPackExpansionType(To, 12657 PatternTL.getSourceRange(), 12658 ExpansionTL.getEllipsisLoc(), 12659 NumExpansions); 12660 if (To.isNull()) 12661 return ExprError(); 12662 12663 PackExpansionTypeLoc ToExpansionTL 12664 = TLB.push<PackExpansionTypeLoc>(To); 12665 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12666 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12667 continue; 12668 } 12669 12670 // Expand the pack expansion by substituting for each argument in the 12671 // pack(s). 12672 for (unsigned I = 0; I != *NumExpansions; ++I) { 12673 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12674 TypeLocBuilder TLB; 12675 TLB.reserve(PatternTL.getFullDataSize()); 12676 QualType To = getDerived().TransformType(TLB, PatternTL); 12677 if (To.isNull()) 12678 return ExprError(); 12679 12680 if (To->containsUnexpandedParameterPack()) { 12681 To = getDerived().RebuildPackExpansionType(To, 12682 PatternTL.getSourceRange(), 12683 ExpansionTL.getEllipsisLoc(), 12684 NumExpansions); 12685 if (To.isNull()) 12686 return ExprError(); 12687 12688 PackExpansionTypeLoc ToExpansionTL 12689 = TLB.push<PackExpansionTypeLoc>(To); 12690 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12691 } 12692 12693 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12694 } 12695 12696 if (!RetainExpansion) 12697 continue; 12698 12699 // If we're supposed to retain a pack expansion, do so by temporarily 12700 // forgetting the partially-substituted parameter pack. 12701 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12702 12703 TypeLocBuilder TLB; 12704 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12705 12706 QualType To = getDerived().TransformType(TLB, PatternTL); 12707 if (To.isNull()) 12708 return ExprError(); 12709 12710 To = getDerived().RebuildPackExpansionType(To, 12711 PatternTL.getSourceRange(), 12712 ExpansionTL.getEllipsisLoc(), 12713 NumExpansions); 12714 if (To.isNull()) 12715 return ExprError(); 12716 12717 PackExpansionTypeLoc ToExpansionTL 12718 = TLB.push<PackExpansionTypeLoc>(To); 12719 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12720 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12721 } 12722 12723 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12724 return E; 12725 12726 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12727 E->getEndLoc()); 12728 } 12729 12730 template<typename Derived> 12731 ExprResult 12732 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12733 ConceptSpecializationExpr *E) { 12734 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12735 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12736 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12737 Old->NumTemplateArgs, TransArgs)) 12738 return ExprError(); 12739 12740 return getDerived().RebuildConceptSpecializationExpr( 12741 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12742 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12743 &TransArgs); 12744 } 12745 12746 template<typename Derived> 12747 ExprResult 12748 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12749 SmallVector<ParmVarDecl*, 4> TransParams; 12750 SmallVector<QualType, 4> TransParamTypes; 12751 Sema::ExtParameterInfoBuilder ExtParamInfos; 12752 12753 // C++2a [expr.prim.req]p2 12754 // Expressions appearing within a requirement-body are unevaluated operands. 12755 EnterExpressionEvaluationContext Ctx( 12756 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 12757 Sema::ReuseLambdaContextDecl); 12758 12759 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12760 getSema().Context, getSema().CurContext, 12761 E->getBody()->getBeginLoc()); 12762 12763 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12764 12765 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams( 12766 E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body, 12767 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos); 12768 12769 for (ParmVarDecl *Param : TransParams) 12770 if (Param) 12771 Param->setDeclContext(Body); 12772 12773 // On failure to transform, TransformRequiresTypeParams returns an expression 12774 // in the event that the transformation of the type params failed in some way. 12775 // It is expected that this will result in a 'not satisfied' Requires clause 12776 // when instantiating. 12777 if (!TypeParamResult.isUnset()) 12778 return TypeParamResult; 12779 12780 SmallVector<concepts::Requirement *, 4> TransReqs; 12781 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12782 TransReqs)) 12783 return ExprError(); 12784 12785 for (concepts::Requirement *Req : TransReqs) { 12786 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12787 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12788 ER->getReturnTypeRequirement() 12789 .getTypeConstraintTemplateParameterList()->getParam(0) 12790 ->setDeclContext(Body); 12791 } 12792 } 12793 } 12794 12795 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12796 TransParams, TransReqs, 12797 E->getRBraceLoc()); 12798 } 12799 12800 template<typename Derived> 12801 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12802 ArrayRef<concepts::Requirement *> Reqs, 12803 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12804 for (concepts::Requirement *Req : Reqs) { 12805 concepts::Requirement *TransReq = nullptr; 12806 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12807 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12808 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12809 TransReq = getDerived().TransformExprRequirement(ExprReq); 12810 else 12811 TransReq = getDerived().TransformNestedRequirement( 12812 cast<concepts::NestedRequirement>(Req)); 12813 if (!TransReq) 12814 return true; 12815 Transformed.push_back(TransReq); 12816 } 12817 return false; 12818 } 12819 12820 template<typename Derived> 12821 concepts::TypeRequirement * 12822 TreeTransform<Derived>::TransformTypeRequirement( 12823 concepts::TypeRequirement *Req) { 12824 if (Req->isSubstitutionFailure()) { 12825 if (getDerived().AlwaysRebuild()) 12826 return getDerived().RebuildTypeRequirement( 12827 Req->getSubstitutionDiagnostic()); 12828 return Req; 12829 } 12830 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12831 if (!TransType) 12832 return nullptr; 12833 return getDerived().RebuildTypeRequirement(TransType); 12834 } 12835 12836 template<typename Derived> 12837 concepts::ExprRequirement * 12838 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12839 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12840 if (Req->isExprSubstitutionFailure()) 12841 TransExpr = Req->getExprSubstitutionDiagnostic(); 12842 else { 12843 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12844 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12845 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12846 if (TransExprRes.isInvalid()) 12847 return nullptr; 12848 TransExpr = TransExprRes.get(); 12849 } 12850 12851 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12852 const auto &RetReq = Req->getReturnTypeRequirement(); 12853 if (RetReq.isEmpty()) 12854 TransRetReq.emplace(); 12855 else if (RetReq.isSubstitutionFailure()) 12856 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12857 else if (RetReq.isTypeConstraint()) { 12858 TemplateParameterList *OrigTPL = 12859 RetReq.getTypeConstraintTemplateParameterList(); 12860 TemplateParameterList *TPL = 12861 getDerived().TransformTemplateParameterList(OrigTPL); 12862 if (!TPL) 12863 return nullptr; 12864 TransRetReq.emplace(TPL); 12865 } 12866 assert(TransRetReq && "All code paths leading here must set TransRetReq"); 12867 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12868 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12869 Req->getNoexceptLoc(), 12870 std::move(*TransRetReq)); 12871 return getDerived().RebuildExprRequirement( 12872 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12873 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12874 } 12875 12876 template<typename Derived> 12877 concepts::NestedRequirement * 12878 TreeTransform<Derived>::TransformNestedRequirement( 12879 concepts::NestedRequirement *Req) { 12880 if (Req->hasInvalidConstraint()) { 12881 if (getDerived().AlwaysRebuild()) 12882 return getDerived().RebuildNestedRequirement( 12883 Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction()); 12884 return Req; 12885 } 12886 ExprResult TransConstraint = 12887 getDerived().TransformExpr(Req->getConstraintExpr()); 12888 if (TransConstraint.isInvalid()) 12889 return nullptr; 12890 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12891 } 12892 12893 template<typename Derived> 12894 ExprResult 12895 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12896 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12897 if (!T) 12898 return ExprError(); 12899 12900 if (!getDerived().AlwaysRebuild() && 12901 T == E->getQueriedTypeSourceInfo()) 12902 return E; 12903 12904 ExprResult SubExpr; 12905 { 12906 EnterExpressionEvaluationContext Unevaluated( 12907 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12908 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12909 if (SubExpr.isInvalid()) 12910 return ExprError(); 12911 12912 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12913 return E; 12914 } 12915 12916 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12917 SubExpr.get(), E->getEndLoc()); 12918 } 12919 12920 template<typename Derived> 12921 ExprResult 12922 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12923 ExprResult SubExpr; 12924 { 12925 EnterExpressionEvaluationContext Unevaluated( 12926 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12927 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12928 if (SubExpr.isInvalid()) 12929 return ExprError(); 12930 12931 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12932 return E; 12933 } 12934 12935 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12936 SubExpr.get(), E->getEndLoc()); 12937 } 12938 12939 template <typename Derived> 12940 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12941 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12942 TypeSourceInfo **RecoveryTSI) { 12943 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12944 DRE, AddrTaken, RecoveryTSI); 12945 12946 // Propagate both errors and recovered types, which return ExprEmpty. 12947 if (!NewDRE.isUsable()) 12948 return NewDRE; 12949 12950 // We got an expr, wrap it up in parens. 12951 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12952 return PE; 12953 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12954 PE->getRParen()); 12955 } 12956 12957 template <typename Derived> 12958 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12959 DependentScopeDeclRefExpr *E) { 12960 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12961 nullptr); 12962 } 12963 12964 template <typename Derived> 12965 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12966 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12967 TypeSourceInfo **RecoveryTSI) { 12968 assert(E->getQualifierLoc()); 12969 NestedNameSpecifierLoc QualifierLoc = 12970 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12971 if (!QualifierLoc) 12972 return ExprError(); 12973 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12974 12975 // TODO: If this is a conversion-function-id, verify that the 12976 // destination type name (if present) resolves the same way after 12977 // instantiation as it did in the local scope. 12978 12979 DeclarationNameInfo NameInfo = 12980 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12981 if (!NameInfo.getName()) 12982 return ExprError(); 12983 12984 if (!E->hasExplicitTemplateArgs()) { 12985 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12986 // Note: it is sufficient to compare the Name component of NameInfo: 12987 // if name has not changed, DNLoc has not changed either. 12988 NameInfo.getName() == E->getDeclName()) 12989 return E; 12990 12991 return getDerived().RebuildDependentScopeDeclRefExpr( 12992 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12993 IsAddressOfOperand, RecoveryTSI); 12994 } 12995 12996 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12997 if (getDerived().TransformTemplateArguments( 12998 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12999 return ExprError(); 13000 13001 return getDerived().RebuildDependentScopeDeclRefExpr( 13002 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 13003 RecoveryTSI); 13004 } 13005 13006 template<typename Derived> 13007 ExprResult 13008 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 13009 // CXXConstructExprs other than for list-initialization and 13010 // CXXTemporaryObjectExpr are always implicit, so when we have 13011 // a 1-argument construction we just transform that argument. 13012 if (getDerived().AllowSkippingCXXConstructExpr() && 13013 ((E->getNumArgs() == 1 || 13014 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 13015 (!getDerived().DropCallArgument(E->getArg(0))) && 13016 !E->isListInitialization())) 13017 return getDerived().TransformInitializer(E->getArg(0), 13018 /*DirectInit*/ false); 13019 13020 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 13021 13022 QualType T = getDerived().TransformType(E->getType()); 13023 if (T.isNull()) 13024 return ExprError(); 13025 13026 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13027 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13028 if (!Constructor) 13029 return ExprError(); 13030 13031 bool ArgumentChanged = false; 13032 SmallVector<Expr*, 8> Args; 13033 { 13034 EnterExpressionEvaluationContext Context( 13035 getSema(), EnterExpressionEvaluationContext::InitList, 13036 E->isListInitialization()); 13037 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13038 &ArgumentChanged)) 13039 return ExprError(); 13040 } 13041 13042 if (!getDerived().AlwaysRebuild() && 13043 T == E->getType() && 13044 Constructor == E->getConstructor() && 13045 !ArgumentChanged) { 13046 // Mark the constructor as referenced. 13047 // FIXME: Instantiation-specific 13048 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13049 return E; 13050 } 13051 13052 return getDerived().RebuildCXXConstructExpr( 13053 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 13054 E->hadMultipleCandidates(), E->isListInitialization(), 13055 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 13056 E->getConstructionKind(), E->getParenOrBraceRange()); 13057 } 13058 13059 template<typename Derived> 13060 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 13061 CXXInheritedCtorInitExpr *E) { 13062 QualType T = getDerived().TransformType(E->getType()); 13063 if (T.isNull()) 13064 return ExprError(); 13065 13066 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13067 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13068 if (!Constructor) 13069 return ExprError(); 13070 13071 if (!getDerived().AlwaysRebuild() && 13072 T == E->getType() && 13073 Constructor == E->getConstructor()) { 13074 // Mark the constructor as referenced. 13075 // FIXME: Instantiation-specific 13076 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13077 return E; 13078 } 13079 13080 return getDerived().RebuildCXXInheritedCtorInitExpr( 13081 T, E->getLocation(), Constructor, 13082 E->constructsVBase(), E->inheritedFromVBase()); 13083 } 13084 13085 /// Transform a C++ temporary-binding expression. 13086 /// 13087 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 13088 /// transform the subexpression and return that. 13089 template<typename Derived> 13090 ExprResult 13091 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 13092 if (auto *Dtor = E->getTemporary()->getDestructor()) 13093 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 13094 const_cast<CXXDestructorDecl *>(Dtor)); 13095 return getDerived().TransformExpr(E->getSubExpr()); 13096 } 13097 13098 /// Transform a C++ expression that contains cleanups that should 13099 /// be run after the expression is evaluated. 13100 /// 13101 /// Since ExprWithCleanups nodes are implicitly generated, we 13102 /// just transform the subexpression and return that. 13103 template<typename Derived> 13104 ExprResult 13105 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 13106 return getDerived().TransformExpr(E->getSubExpr()); 13107 } 13108 13109 template<typename Derived> 13110 ExprResult 13111 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 13112 CXXTemporaryObjectExpr *E) { 13113 TypeSourceInfo *T = 13114 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13115 if (!T) 13116 return ExprError(); 13117 13118 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13119 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13120 if (!Constructor) 13121 return ExprError(); 13122 13123 bool ArgumentChanged = false; 13124 SmallVector<Expr*, 8> Args; 13125 Args.reserve(E->getNumArgs()); 13126 { 13127 EnterExpressionEvaluationContext Context( 13128 getSema(), EnterExpressionEvaluationContext::InitList, 13129 E->isListInitialization()); 13130 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13131 &ArgumentChanged)) 13132 return ExprError(); 13133 } 13134 13135 if (!getDerived().AlwaysRebuild() && 13136 T == E->getTypeSourceInfo() && 13137 Constructor == E->getConstructor() && 13138 !ArgumentChanged) { 13139 // FIXME: Instantiation-specific 13140 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13141 return SemaRef.MaybeBindToTemporary(E); 13142 } 13143 13144 // FIXME: We should just pass E->isListInitialization(), but we're not 13145 // prepared to handle list-initialization without a child InitListExpr. 13146 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 13147 return getDerived().RebuildCXXTemporaryObjectExpr( 13148 T, LParenLoc, Args, E->getEndLoc(), 13149 /*ListInitialization=*/LParenLoc.isInvalid()); 13150 } 13151 13152 template<typename Derived> 13153 ExprResult 13154 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 13155 // Transform any init-capture expressions before entering the scope of the 13156 // lambda body, because they are not semantically within that scope. 13157 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 13158 struct TransformedInitCapture { 13159 // The location of the ... if the result is retaining a pack expansion. 13160 SourceLocation EllipsisLoc; 13161 // Zero or more expansions of the init-capture. 13162 SmallVector<InitCaptureInfoTy, 4> Expansions; 13163 }; 13164 SmallVector<TransformedInitCapture, 4> InitCaptures; 13165 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 13166 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13167 CEnd = E->capture_end(); 13168 C != CEnd; ++C) { 13169 if (!E->isInitCapture(C)) 13170 continue; 13171 13172 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 13173 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13174 13175 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 13176 std::optional<unsigned> NumExpansions) { 13177 ExprResult NewExprInitResult = getDerived().TransformInitializer( 13178 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 13179 13180 if (NewExprInitResult.isInvalid()) { 13181 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 13182 return; 13183 } 13184 Expr *NewExprInit = NewExprInitResult.get(); 13185 13186 QualType NewInitCaptureType = 13187 getSema().buildLambdaInitCaptureInitialization( 13188 C->getLocation(), C->getCaptureKind() == LCK_ByRef, 13189 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 13190 cast<VarDecl>(C->getCapturedVar())->getInitStyle() != 13191 VarDecl::CInit, 13192 NewExprInit); 13193 Result.Expansions.push_back( 13194 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 13195 }; 13196 13197 // If this is an init-capture pack, consider expanding the pack now. 13198 if (OldVD->isParameterPack()) { 13199 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 13200 ->getTypeLoc() 13201 .castAs<PackExpansionTypeLoc>(); 13202 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13203 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 13204 13205 // Determine whether the set of unexpanded parameter packs can and should 13206 // be expanded. 13207 bool Expand = true; 13208 bool RetainExpansion = false; 13209 std::optional<unsigned> OrigNumExpansions = 13210 ExpansionTL.getTypePtr()->getNumExpansions(); 13211 std::optional<unsigned> NumExpansions = OrigNumExpansions; 13212 if (getDerived().TryExpandParameterPacks( 13213 ExpansionTL.getEllipsisLoc(), 13214 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 13215 RetainExpansion, NumExpansions)) 13216 return ExprError(); 13217 if (Expand) { 13218 for (unsigned I = 0; I != *NumExpansions; ++I) { 13219 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13220 SubstInitCapture(SourceLocation(), std::nullopt); 13221 } 13222 } 13223 if (!Expand || RetainExpansion) { 13224 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13225 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 13226 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 13227 } 13228 } else { 13229 SubstInitCapture(SourceLocation(), std::nullopt); 13230 } 13231 } 13232 13233 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 13234 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 13235 13236 // Transform the template parameters, and add them to the current 13237 // instantiation scope. The null case is handled correctly. 13238 auto TPL = getDerived().TransformTemplateParameterList( 13239 E->getTemplateParameterList()); 13240 LSI->GLTemplateParameterList = TPL; 13241 13242 // Transform the type of the original lambda's call operator. 13243 // The transformation MUST be done in the CurrentInstantiationScope since 13244 // it introduces a mapping of the original to the newly created 13245 // transformed parameters. 13246 TypeSourceInfo *NewCallOpTSI = nullptr; 13247 { 13248 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 13249 FunctionProtoTypeLoc OldCallOpFPTL = 13250 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 13251 13252 TypeLocBuilder NewCallOpTLBuilder; 13253 SmallVector<QualType, 4> ExceptionStorage; 13254 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 13255 QualType NewCallOpType = TransformFunctionProtoType( 13256 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 13257 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 13258 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 13259 ExceptionStorage, Changed); 13260 }); 13261 if (NewCallOpType.isNull()) 13262 return ExprError(); 13263 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 13264 NewCallOpType); 13265 } 13266 13267 // Create the local class that will describe the lambda. 13268 13269 // FIXME: DependencyKind below is wrong when substituting inside a templated 13270 // context that isn't a DeclContext (such as a variable template), or when 13271 // substituting an unevaluated lambda inside of a function's parameter's type 13272 // - as parameter types are not instantiated from within a function's DC. We 13273 // use evaluation contexts to distinguish the function parameter case. 13274 CXXRecordDecl::LambdaDependencyKind DependencyKind = 13275 CXXRecordDecl::LDK_Unknown; 13276 if ((getSema().isUnevaluatedContext() || 13277 getSema().isConstantEvaluatedContext()) && 13278 (getSema().CurContext->isFileContext() || 13279 !getSema().CurContext->getParent()->isDependentContext())) 13280 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 13281 13282 CXXRecordDecl *OldClass = E->getLambdaClass(); 13283 CXXRecordDecl *Class = 13284 getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI, 13285 DependencyKind, E->getCaptureDefault()); 13286 13287 getDerived().transformedLocalDecl(OldClass, {Class}); 13288 13289 std::optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 13290 if (getDerived().ReplacingOriginal()) 13291 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 13292 OldClass->getLambdaManglingNumber(), 13293 OldClass->getDeviceLambdaManglingNumber(), 13294 OldClass->getLambdaContextDecl()); 13295 13296 // Build the call operator. 13297 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 13298 Class, E->getIntroducerRange(), NewCallOpTSI, 13299 E->getCallOperator()->getEndLoc(), 13300 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 13301 E->getCallOperator()->getConstexprKind(), 13302 E->getCallOperator()->getStorageClass(), 13303 E->getCallOperator()->getTrailingRequiresClause()); 13304 13305 LSI->CallOperator = NewCallOperator; 13306 13307 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13308 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13309 13310 // Number the lambda for linkage purposes if necessary. 13311 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 13312 13313 // Introduce the context of the call operator. 13314 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13315 /*NewThisContext*/false); 13316 13317 // Enter the scope of the lambda. 13318 getSema().buildLambdaScope(LSI, NewCallOperator, 13319 E->getIntroducerRange(), 13320 E->getCaptureDefault(), 13321 E->getCaptureDefaultLoc(), 13322 E->hasExplicitParameters(), 13323 E->hasExplicitResultType(), 13324 E->isMutable()); 13325 13326 bool Invalid = false; 13327 13328 // Transform captures. 13329 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13330 CEnd = E->capture_end(); 13331 C != CEnd; ++C) { 13332 // When we hit the first implicit capture, tell Sema that we've finished 13333 // the list of explicit captures. 13334 if (C->isImplicit()) 13335 break; 13336 13337 // Capturing 'this' is trivial. 13338 if (C->capturesThis()) { 13339 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13340 /*BuildAndDiagnose*/ true, nullptr, 13341 C->getCaptureKind() == LCK_StarThis); 13342 continue; 13343 } 13344 // Captured expression will be recaptured during captured variables 13345 // rebuilding. 13346 if (C->capturesVLAType()) 13347 continue; 13348 13349 // Rebuild init-captures, including the implied field declaration. 13350 if (E->isInitCapture(C)) { 13351 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13352 13353 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13354 llvm::SmallVector<Decl*, 4> NewVDs; 13355 13356 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13357 ExprResult Init = Info.first; 13358 QualType InitQualType = Info.second; 13359 if (Init.isInvalid() || InitQualType.isNull()) { 13360 Invalid = true; 13361 break; 13362 } 13363 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13364 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13365 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13366 if (!NewVD) { 13367 Invalid = true; 13368 break; 13369 } 13370 NewVDs.push_back(NewVD); 13371 getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef); 13372 } 13373 13374 if (Invalid) 13375 break; 13376 13377 getDerived().transformedLocalDecl(OldVD, NewVDs); 13378 continue; 13379 } 13380 13381 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13382 13383 // Determine the capture kind for Sema. 13384 Sema::TryCaptureKind Kind 13385 = C->isImplicit()? Sema::TryCapture_Implicit 13386 : C->getCaptureKind() == LCK_ByCopy 13387 ? Sema::TryCapture_ExplicitByVal 13388 : Sema::TryCapture_ExplicitByRef; 13389 SourceLocation EllipsisLoc; 13390 if (C->isPackExpansion()) { 13391 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13392 bool ShouldExpand = false; 13393 bool RetainExpansion = false; 13394 std::optional<unsigned> NumExpansions; 13395 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13396 C->getLocation(), 13397 Unexpanded, 13398 ShouldExpand, RetainExpansion, 13399 NumExpansions)) { 13400 Invalid = true; 13401 continue; 13402 } 13403 13404 if (ShouldExpand) { 13405 // The transform has determined that we should perform an expansion; 13406 // transform and capture each of the arguments. 13407 // expansion of the pattern. Do so. 13408 auto *Pack = cast<VarDecl>(C->getCapturedVar()); 13409 for (unsigned I = 0; I != *NumExpansions; ++I) { 13410 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13411 VarDecl *CapturedVar 13412 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13413 Pack)); 13414 if (!CapturedVar) { 13415 Invalid = true; 13416 continue; 13417 } 13418 13419 // Capture the transformed variable. 13420 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13421 } 13422 13423 // FIXME: Retain a pack expansion if RetainExpansion is true. 13424 13425 continue; 13426 } 13427 13428 EllipsisLoc = C->getEllipsisLoc(); 13429 } 13430 13431 // Transform the captured variable. 13432 auto *CapturedVar = cast_or_null<ValueDecl>( 13433 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13434 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13435 Invalid = true; 13436 continue; 13437 } 13438 13439 // Capture the transformed variable. 13440 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13441 EllipsisLoc); 13442 } 13443 getSema().finishLambdaExplicitCaptures(LSI); 13444 13445 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13446 // evaluation context even if we're not transforming the function body. 13447 getSema().PushExpressionEvaluationContext( 13448 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13449 13450 // Instantiate the body of the lambda expression. 13451 StmtResult Body = 13452 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13453 13454 // ActOnLambda* will pop the function scope for us. 13455 FuncScopeCleanup.disable(); 13456 13457 if (Body.isInvalid()) { 13458 SavedContext.pop(); 13459 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13460 /*IsInstantiation=*/true); 13461 return ExprError(); 13462 } 13463 13464 // Copy the LSI before ActOnFinishFunctionBody removes it. 13465 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13466 // the call operator. 13467 auto LSICopy = *LSI; 13468 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13469 /*IsInstantiation*/ true); 13470 SavedContext.pop(); 13471 13472 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13473 &LSICopy); 13474 } 13475 13476 template<typename Derived> 13477 StmtResult 13478 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13479 return TransformStmt(S); 13480 } 13481 13482 template<typename Derived> 13483 StmtResult 13484 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13485 // Transform captures. 13486 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13487 CEnd = E->capture_end(); 13488 C != CEnd; ++C) { 13489 // When we hit the first implicit capture, tell Sema that we've finished 13490 // the list of explicit captures. 13491 if (!C->isImplicit()) 13492 continue; 13493 13494 // Capturing 'this' is trivial. 13495 if (C->capturesThis()) { 13496 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13497 /*BuildAndDiagnose*/ true, nullptr, 13498 C->getCaptureKind() == LCK_StarThis); 13499 continue; 13500 } 13501 // Captured expression will be recaptured during captured variables 13502 // rebuilding. 13503 if (C->capturesVLAType()) 13504 continue; 13505 13506 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13507 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13508 13509 // Transform the captured variable. 13510 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13511 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13512 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13513 return StmtError(); 13514 13515 // Capture the transformed variable. 13516 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13517 } 13518 13519 return S; 13520 } 13521 13522 template<typename Derived> 13523 ExprResult 13524 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13525 CXXUnresolvedConstructExpr *E) { 13526 TypeSourceInfo *T = 13527 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13528 if (!T) 13529 return ExprError(); 13530 13531 bool ArgumentChanged = false; 13532 SmallVector<Expr*, 8> Args; 13533 Args.reserve(E->getNumArgs()); 13534 { 13535 EnterExpressionEvaluationContext Context( 13536 getSema(), EnterExpressionEvaluationContext::InitList, 13537 E->isListInitialization()); 13538 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13539 &ArgumentChanged)) 13540 return ExprError(); 13541 } 13542 13543 if (!getDerived().AlwaysRebuild() && 13544 T == E->getTypeSourceInfo() && 13545 !ArgumentChanged) 13546 return E; 13547 13548 // FIXME: we're faking the locations of the commas 13549 return getDerived().RebuildCXXUnresolvedConstructExpr( 13550 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13551 } 13552 13553 template<typename Derived> 13554 ExprResult 13555 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13556 CXXDependentScopeMemberExpr *E) { 13557 // Transform the base of the expression. 13558 ExprResult Base((Expr*) nullptr); 13559 Expr *OldBase; 13560 QualType BaseType; 13561 QualType ObjectType; 13562 if (!E->isImplicitAccess()) { 13563 OldBase = E->getBase(); 13564 Base = getDerived().TransformExpr(OldBase); 13565 if (Base.isInvalid()) 13566 return ExprError(); 13567 13568 // Start the member reference and compute the object's type. 13569 ParsedType ObjectTy; 13570 bool MayBePseudoDestructor = false; 13571 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13572 E->getOperatorLoc(), 13573 E->isArrow()? tok::arrow : tok::period, 13574 ObjectTy, 13575 MayBePseudoDestructor); 13576 if (Base.isInvalid()) 13577 return ExprError(); 13578 13579 ObjectType = ObjectTy.get(); 13580 BaseType = ((Expr*) Base.get())->getType(); 13581 } else { 13582 OldBase = nullptr; 13583 BaseType = getDerived().TransformType(E->getBaseType()); 13584 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13585 } 13586 13587 // Transform the first part of the nested-name-specifier that qualifies 13588 // the member name. 13589 NamedDecl *FirstQualifierInScope 13590 = getDerived().TransformFirstQualifierInScope( 13591 E->getFirstQualifierFoundInScope(), 13592 E->getQualifierLoc().getBeginLoc()); 13593 13594 NestedNameSpecifierLoc QualifierLoc; 13595 if (E->getQualifier()) { 13596 QualifierLoc 13597 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13598 ObjectType, 13599 FirstQualifierInScope); 13600 if (!QualifierLoc) 13601 return ExprError(); 13602 } 13603 13604 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13605 13606 // TODO: If this is a conversion-function-id, verify that the 13607 // destination type name (if present) resolves the same way after 13608 // instantiation as it did in the local scope. 13609 13610 DeclarationNameInfo NameInfo 13611 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13612 if (!NameInfo.getName()) 13613 return ExprError(); 13614 13615 if (!E->hasExplicitTemplateArgs()) { 13616 // This is a reference to a member without an explicitly-specified 13617 // template argument list. Optimize for this common case. 13618 if (!getDerived().AlwaysRebuild() && 13619 Base.get() == OldBase && 13620 BaseType == E->getBaseType() && 13621 QualifierLoc == E->getQualifierLoc() && 13622 NameInfo.getName() == E->getMember() && 13623 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13624 return E; 13625 13626 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13627 BaseType, 13628 E->isArrow(), 13629 E->getOperatorLoc(), 13630 QualifierLoc, 13631 TemplateKWLoc, 13632 FirstQualifierInScope, 13633 NameInfo, 13634 /*TemplateArgs*/nullptr); 13635 } 13636 13637 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13638 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13639 E->getNumTemplateArgs(), 13640 TransArgs)) 13641 return ExprError(); 13642 13643 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13644 BaseType, 13645 E->isArrow(), 13646 E->getOperatorLoc(), 13647 QualifierLoc, 13648 TemplateKWLoc, 13649 FirstQualifierInScope, 13650 NameInfo, 13651 &TransArgs); 13652 } 13653 13654 template <typename Derived> 13655 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13656 UnresolvedMemberExpr *Old) { 13657 // Transform the base of the expression. 13658 ExprResult Base((Expr *)nullptr); 13659 QualType BaseType; 13660 if (!Old->isImplicitAccess()) { 13661 Base = getDerived().TransformExpr(Old->getBase()); 13662 if (Base.isInvalid()) 13663 return ExprError(); 13664 Base = 13665 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13666 if (Base.isInvalid()) 13667 return ExprError(); 13668 BaseType = Base.get()->getType(); 13669 } else { 13670 BaseType = getDerived().TransformType(Old->getBaseType()); 13671 } 13672 13673 NestedNameSpecifierLoc QualifierLoc; 13674 if (Old->getQualifierLoc()) { 13675 QualifierLoc = 13676 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13677 if (!QualifierLoc) 13678 return ExprError(); 13679 } 13680 13681 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13682 13683 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13684 13685 // Transform the declaration set. 13686 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13687 return ExprError(); 13688 13689 // Determine the naming class. 13690 if (Old->getNamingClass()) { 13691 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13692 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13693 if (!NamingClass) 13694 return ExprError(); 13695 13696 R.setNamingClass(NamingClass); 13697 } 13698 13699 TemplateArgumentListInfo TransArgs; 13700 if (Old->hasExplicitTemplateArgs()) { 13701 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13702 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13703 if (getDerived().TransformTemplateArguments( 13704 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13705 return ExprError(); 13706 } 13707 13708 // FIXME: to do this check properly, we will need to preserve the 13709 // first-qualifier-in-scope here, just in case we had a dependent 13710 // base (and therefore couldn't do the check) and a 13711 // nested-name-qualifier (and therefore could do the lookup). 13712 NamedDecl *FirstQualifierInScope = nullptr; 13713 13714 return getDerived().RebuildUnresolvedMemberExpr( 13715 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13716 TemplateKWLoc, FirstQualifierInScope, R, 13717 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13718 } 13719 13720 template<typename Derived> 13721 ExprResult 13722 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13723 EnterExpressionEvaluationContext Unevaluated( 13724 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13725 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13726 if (SubExpr.isInvalid()) 13727 return ExprError(); 13728 13729 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13730 return E; 13731 13732 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13733 } 13734 13735 template<typename Derived> 13736 ExprResult 13737 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13738 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13739 if (Pattern.isInvalid()) 13740 return ExprError(); 13741 13742 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13743 return E; 13744 13745 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13746 E->getNumExpansions()); 13747 } 13748 13749 template<typename Derived> 13750 ExprResult 13751 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13752 // If E is not value-dependent, then nothing will change when we transform it. 13753 // Note: This is an instantiation-centric view. 13754 if (!E->isValueDependent()) 13755 return E; 13756 13757 EnterExpressionEvaluationContext Unevaluated( 13758 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13759 13760 ArrayRef<TemplateArgument> PackArgs; 13761 TemplateArgument ArgStorage; 13762 13763 // Find the argument list to transform. 13764 if (E->isPartiallySubstituted()) { 13765 PackArgs = E->getPartialArguments(); 13766 } else if (E->isValueDependent()) { 13767 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13768 bool ShouldExpand = false; 13769 bool RetainExpansion = false; 13770 std::optional<unsigned> NumExpansions; 13771 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13772 Unexpanded, 13773 ShouldExpand, RetainExpansion, 13774 NumExpansions)) 13775 return ExprError(); 13776 13777 // If we need to expand the pack, build a template argument from it and 13778 // expand that. 13779 if (ShouldExpand) { 13780 auto *Pack = E->getPack(); 13781 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13782 ArgStorage = getSema().Context.getPackExpansionType( 13783 getSema().Context.getTypeDeclType(TTPD), std::nullopt); 13784 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13785 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt); 13786 } else { 13787 auto *VD = cast<ValueDecl>(Pack); 13788 ExprResult DRE = getSema().BuildDeclRefExpr( 13789 VD, VD->getType().getNonLValueExprType(getSema().Context), 13790 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13791 E->getPackLoc()); 13792 if (DRE.isInvalid()) 13793 return ExprError(); 13794 ArgStorage = new (getSema().Context) 13795 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(), 13796 E->getPackLoc(), std::nullopt); 13797 } 13798 PackArgs = ArgStorage; 13799 } 13800 } 13801 13802 // If we're not expanding the pack, just transform the decl. 13803 if (!PackArgs.size()) { 13804 auto *Pack = cast_or_null<NamedDecl>( 13805 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13806 if (!Pack) 13807 return ExprError(); 13808 return getDerived().RebuildSizeOfPackExpr( 13809 E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(), 13810 std::nullopt, std::nullopt); 13811 } 13812 13813 // Try to compute the result without performing a partial substitution. 13814 std::optional<unsigned> Result = 0; 13815 for (const TemplateArgument &Arg : PackArgs) { 13816 if (!Arg.isPackExpansion()) { 13817 Result = *Result + 1; 13818 continue; 13819 } 13820 13821 TemplateArgumentLoc ArgLoc; 13822 InventTemplateArgumentLoc(Arg, ArgLoc); 13823 13824 // Find the pattern of the pack expansion. 13825 SourceLocation Ellipsis; 13826 std::optional<unsigned> OrigNumExpansions; 13827 TemplateArgumentLoc Pattern = 13828 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13829 OrigNumExpansions); 13830 13831 // Substitute under the pack expansion. Do not expand the pack (yet). 13832 TemplateArgumentLoc OutPattern; 13833 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13834 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13835 /*Uneval*/ true)) 13836 return true; 13837 13838 // See if we can determine the number of arguments from the result. 13839 std::optional<unsigned> NumExpansions = 13840 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13841 if (!NumExpansions) { 13842 // No: we must be in an alias template expansion, and we're going to need 13843 // to actually expand the packs. 13844 Result = std::nullopt; 13845 break; 13846 } 13847 13848 Result = *Result + *NumExpansions; 13849 } 13850 13851 // Common case: we could determine the number of expansions without 13852 // substituting. 13853 if (Result) 13854 return getDerived().RebuildSizeOfPackExpr( 13855 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 13856 *Result, std::nullopt); 13857 13858 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13859 E->getPackLoc()); 13860 { 13861 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13862 typedef TemplateArgumentLocInventIterator< 13863 Derived, const TemplateArgument*> PackLocIterator; 13864 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13865 PackLocIterator(*this, PackArgs.end()), 13866 TransformedPackArgs, /*Uneval*/true)) 13867 return ExprError(); 13868 } 13869 13870 // Check whether we managed to fully-expand the pack. 13871 // FIXME: Is it possible for us to do so and not hit the early exit path? 13872 SmallVector<TemplateArgument, 8> Args; 13873 bool PartialSubstitution = false; 13874 for (auto &Loc : TransformedPackArgs.arguments()) { 13875 Args.push_back(Loc.getArgument()); 13876 if (Loc.getArgument().isPackExpansion()) 13877 PartialSubstitution = true; 13878 } 13879 13880 if (PartialSubstitution) 13881 return getDerived().RebuildSizeOfPackExpr( 13882 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 13883 std::nullopt, Args); 13884 13885 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13886 E->getPackLoc(), E->getRParenLoc(), 13887 Args.size(), std::nullopt); 13888 } 13889 13890 template<typename Derived> 13891 ExprResult 13892 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13893 SubstNonTypeTemplateParmPackExpr *E) { 13894 // Default behavior is to do nothing with this transformation. 13895 return E; 13896 } 13897 13898 template<typename Derived> 13899 ExprResult 13900 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13901 SubstNonTypeTemplateParmExpr *E) { 13902 // Default behavior is to do nothing with this transformation. 13903 return E; 13904 } 13905 13906 template<typename Derived> 13907 ExprResult 13908 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13909 // Default behavior is to do nothing with this transformation. 13910 return E; 13911 } 13912 13913 template<typename Derived> 13914 ExprResult 13915 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13916 MaterializeTemporaryExpr *E) { 13917 return getDerived().TransformExpr(E->getSubExpr()); 13918 } 13919 13920 template<typename Derived> 13921 ExprResult 13922 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13923 UnresolvedLookupExpr *Callee = nullptr; 13924 if (Expr *OldCallee = E->getCallee()) { 13925 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13926 if (CalleeResult.isInvalid()) 13927 return ExprError(); 13928 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13929 } 13930 13931 Expr *Pattern = E->getPattern(); 13932 13933 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13934 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13935 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13936 13937 // Determine whether the set of unexpanded parameter packs can and should 13938 // be expanded. 13939 bool Expand = true; 13940 bool RetainExpansion = false; 13941 std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13942 NumExpansions = OrigNumExpansions; 13943 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13944 Pattern->getSourceRange(), 13945 Unexpanded, 13946 Expand, RetainExpansion, 13947 NumExpansions)) 13948 return true; 13949 13950 if (!Expand) { 13951 // Do not expand any packs here, just transform and rebuild a fold 13952 // expression. 13953 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13954 13955 ExprResult LHS = 13956 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13957 if (LHS.isInvalid()) 13958 return true; 13959 13960 ExprResult RHS = 13961 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13962 if (RHS.isInvalid()) 13963 return true; 13964 13965 if (!getDerived().AlwaysRebuild() && 13966 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13967 return E; 13968 13969 return getDerived().RebuildCXXFoldExpr( 13970 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13971 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13972 } 13973 13974 // Formally a fold expression expands to nested parenthesized expressions. 13975 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13976 // them. 13977 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13978 SemaRef.Diag(E->getEllipsisLoc(), 13979 clang::diag::err_fold_expression_limit_exceeded) 13980 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13981 << E->getSourceRange(); 13982 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13983 return ExprError(); 13984 } 13985 13986 // The transform has determined that we should perform an elementwise 13987 // expansion of the pattern. Do so. 13988 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13989 if (Result.isInvalid()) 13990 return true; 13991 bool LeftFold = E->isLeftFold(); 13992 13993 // If we're retaining an expansion for a right fold, it is the innermost 13994 // component and takes the init (if any). 13995 if (!LeftFold && RetainExpansion) { 13996 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13997 13998 ExprResult Out = getDerived().TransformExpr(Pattern); 13999 if (Out.isInvalid()) 14000 return true; 14001 14002 Result = getDerived().RebuildCXXFoldExpr( 14003 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 14004 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 14005 if (Result.isInvalid()) 14006 return true; 14007 } 14008 14009 for (unsigned I = 0; I != *NumExpansions; ++I) { 14010 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 14011 getSema(), LeftFold ? I : *NumExpansions - I - 1); 14012 ExprResult Out = getDerived().TransformExpr(Pattern); 14013 if (Out.isInvalid()) 14014 return true; 14015 14016 if (Out.get()->containsUnexpandedParameterPack()) { 14017 // We still have a pack; retain a pack expansion for this slice. 14018 Result = getDerived().RebuildCXXFoldExpr( 14019 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 14020 E->getOperator(), E->getEllipsisLoc(), 14021 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 14022 OrigNumExpansions); 14023 } else if (Result.isUsable()) { 14024 // We've got down to a single element; build a binary operator. 14025 Expr *LHS = LeftFold ? Result.get() : Out.get(); 14026 Expr *RHS = LeftFold ? Out.get() : Result.get(); 14027 if (Callee) 14028 Result = getDerived().RebuildCXXOperatorCallExpr( 14029 BinaryOperator::getOverloadedOperator(E->getOperator()), 14030 E->getEllipsisLoc(), Callee, LHS, RHS); 14031 else 14032 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 14033 E->getOperator(), LHS, RHS); 14034 } else 14035 Result = Out; 14036 14037 if (Result.isInvalid()) 14038 return true; 14039 } 14040 14041 // If we're retaining an expansion for a left fold, it is the outermost 14042 // component and takes the complete expansion so far as its init (if any). 14043 if (LeftFold && RetainExpansion) { 14044 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14045 14046 ExprResult Out = getDerived().TransformExpr(Pattern); 14047 if (Out.isInvalid()) 14048 return true; 14049 14050 Result = getDerived().RebuildCXXFoldExpr( 14051 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 14052 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 14053 if (Result.isInvalid()) 14054 return true; 14055 } 14056 14057 // If we had no init and an empty pack, and we're not retaining an expansion, 14058 // then produce a fallback value or error. 14059 if (Result.isUnset()) 14060 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 14061 E->getOperator()); 14062 14063 return Result; 14064 } 14065 14066 template <typename Derived> 14067 ExprResult 14068 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) { 14069 SmallVector<Expr *, 4> TransformedInits; 14070 ArrayRef<Expr *> InitExprs = E->getInitExprs(); 14071 if (TransformExprs(InitExprs.data(), InitExprs.size(), true, 14072 TransformedInits)) 14073 return ExprError(); 14074 14075 return getDerived().RebuildParenListExpr(E->getBeginLoc(), TransformedInits, 14076 E->getEndLoc()); 14077 } 14078 14079 template<typename Derived> 14080 ExprResult 14081 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 14082 CXXStdInitializerListExpr *E) { 14083 return getDerived().TransformExpr(E->getSubExpr()); 14084 } 14085 14086 template<typename Derived> 14087 ExprResult 14088 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 14089 return SemaRef.MaybeBindToTemporary(E); 14090 } 14091 14092 template<typename Derived> 14093 ExprResult 14094 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 14095 return E; 14096 } 14097 14098 template<typename Derived> 14099 ExprResult 14100 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 14101 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 14102 if (SubExpr.isInvalid()) 14103 return ExprError(); 14104 14105 if (!getDerived().AlwaysRebuild() && 14106 SubExpr.get() == E->getSubExpr()) 14107 return E; 14108 14109 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 14110 } 14111 14112 template<typename Derived> 14113 ExprResult 14114 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 14115 // Transform each of the elements. 14116 SmallVector<Expr *, 8> Elements; 14117 bool ArgChanged = false; 14118 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 14119 /*IsCall=*/false, Elements, &ArgChanged)) 14120 return ExprError(); 14121 14122 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14123 return SemaRef.MaybeBindToTemporary(E); 14124 14125 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 14126 Elements.data(), 14127 Elements.size()); 14128 } 14129 14130 template<typename Derived> 14131 ExprResult 14132 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 14133 ObjCDictionaryLiteral *E) { 14134 // Transform each of the elements. 14135 SmallVector<ObjCDictionaryElement, 8> Elements; 14136 bool ArgChanged = false; 14137 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 14138 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 14139 14140 if (OrigElement.isPackExpansion()) { 14141 // This key/value element is a pack expansion. 14142 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14143 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 14144 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 14145 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14146 14147 // Determine whether the set of unexpanded parameter packs can 14148 // and should be expanded. 14149 bool Expand = true; 14150 bool RetainExpansion = false; 14151 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 14152 std::optional<unsigned> NumExpansions = OrigNumExpansions; 14153 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 14154 OrigElement.Value->getEndLoc()); 14155 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 14156 PatternRange, Unexpanded, Expand, 14157 RetainExpansion, NumExpansions)) 14158 return ExprError(); 14159 14160 if (!Expand) { 14161 // The transform has determined that we should perform a simple 14162 // transformation on the pack expansion, producing another pack 14163 // expansion. 14164 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14165 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14166 if (Key.isInvalid()) 14167 return ExprError(); 14168 14169 if (Key.get() != OrigElement.Key) 14170 ArgChanged = true; 14171 14172 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14173 if (Value.isInvalid()) 14174 return ExprError(); 14175 14176 if (Value.get() != OrigElement.Value) 14177 ArgChanged = true; 14178 14179 ObjCDictionaryElement Expansion = { 14180 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 14181 }; 14182 Elements.push_back(Expansion); 14183 continue; 14184 } 14185 14186 // Record right away that the argument was changed. This needs 14187 // to happen even if the array expands to nothing. 14188 ArgChanged = true; 14189 14190 // The transform has determined that we should perform an elementwise 14191 // expansion of the pattern. Do so. 14192 for (unsigned I = 0; I != *NumExpansions; ++I) { 14193 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 14194 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14195 if (Key.isInvalid()) 14196 return ExprError(); 14197 14198 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14199 if (Value.isInvalid()) 14200 return ExprError(); 14201 14202 ObjCDictionaryElement Element = { 14203 Key.get(), Value.get(), SourceLocation(), NumExpansions 14204 }; 14205 14206 // If any unexpanded parameter packs remain, we still have a 14207 // pack expansion. 14208 // FIXME: Can this really happen? 14209 if (Key.get()->containsUnexpandedParameterPack() || 14210 Value.get()->containsUnexpandedParameterPack()) 14211 Element.EllipsisLoc = OrigElement.EllipsisLoc; 14212 14213 Elements.push_back(Element); 14214 } 14215 14216 // FIXME: Retain a pack expansion if RetainExpansion is true. 14217 14218 // We've finished with this pack expansion. 14219 continue; 14220 } 14221 14222 // Transform and check key. 14223 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14224 if (Key.isInvalid()) 14225 return ExprError(); 14226 14227 if (Key.get() != OrigElement.Key) 14228 ArgChanged = true; 14229 14230 // Transform and check value. 14231 ExprResult Value 14232 = getDerived().TransformExpr(OrigElement.Value); 14233 if (Value.isInvalid()) 14234 return ExprError(); 14235 14236 if (Value.get() != OrigElement.Value) 14237 ArgChanged = true; 14238 14239 ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(), 14240 std::nullopt}; 14241 Elements.push_back(Element); 14242 } 14243 14244 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14245 return SemaRef.MaybeBindToTemporary(E); 14246 14247 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 14248 Elements); 14249 } 14250 14251 template<typename Derived> 14252 ExprResult 14253 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 14254 TypeSourceInfo *EncodedTypeInfo 14255 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 14256 if (!EncodedTypeInfo) 14257 return ExprError(); 14258 14259 if (!getDerived().AlwaysRebuild() && 14260 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 14261 return E; 14262 14263 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 14264 EncodedTypeInfo, 14265 E->getRParenLoc()); 14266 } 14267 14268 template<typename Derived> 14269 ExprResult TreeTransform<Derived>:: 14270 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 14271 // This is a kind of implicit conversion, and it needs to get dropped 14272 // and recomputed for the same general reasons that ImplicitCastExprs 14273 // do, as well a more specific one: this expression is only valid when 14274 // it appears *immediately* as an argument expression. 14275 return getDerived().TransformExpr(E->getSubExpr()); 14276 } 14277 14278 template<typename Derived> 14279 ExprResult TreeTransform<Derived>:: 14280 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 14281 TypeSourceInfo *TSInfo 14282 = getDerived().TransformType(E->getTypeInfoAsWritten()); 14283 if (!TSInfo) 14284 return ExprError(); 14285 14286 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 14287 if (Result.isInvalid()) 14288 return ExprError(); 14289 14290 if (!getDerived().AlwaysRebuild() && 14291 TSInfo == E->getTypeInfoAsWritten() && 14292 Result.get() == E->getSubExpr()) 14293 return E; 14294 14295 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 14296 E->getBridgeKeywordLoc(), TSInfo, 14297 Result.get()); 14298 } 14299 14300 template <typename Derived> 14301 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14302 ObjCAvailabilityCheckExpr *E) { 14303 return E; 14304 } 14305 14306 template<typename Derived> 14307 ExprResult 14308 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14309 // Transform arguments. 14310 bool ArgChanged = false; 14311 SmallVector<Expr*, 8> Args; 14312 Args.reserve(E->getNumArgs()); 14313 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14314 &ArgChanged)) 14315 return ExprError(); 14316 14317 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14318 // Class message: transform the receiver type. 14319 TypeSourceInfo *ReceiverTypeInfo 14320 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14321 if (!ReceiverTypeInfo) 14322 return ExprError(); 14323 14324 // If nothing changed, just retain the existing message send. 14325 if (!getDerived().AlwaysRebuild() && 14326 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14327 return SemaRef.MaybeBindToTemporary(E); 14328 14329 // Build a new class message send. 14330 SmallVector<SourceLocation, 16> SelLocs; 14331 E->getSelectorLocs(SelLocs); 14332 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14333 E->getSelector(), 14334 SelLocs, 14335 E->getMethodDecl(), 14336 E->getLeftLoc(), 14337 Args, 14338 E->getRightLoc()); 14339 } 14340 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14341 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14342 if (!E->getMethodDecl()) 14343 return ExprError(); 14344 14345 // Build a new class message send to 'super'. 14346 SmallVector<SourceLocation, 16> SelLocs; 14347 E->getSelectorLocs(SelLocs); 14348 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14349 E->getSelector(), 14350 SelLocs, 14351 E->getReceiverType(), 14352 E->getMethodDecl(), 14353 E->getLeftLoc(), 14354 Args, 14355 E->getRightLoc()); 14356 } 14357 14358 // Instance message: transform the receiver 14359 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14360 "Only class and instance messages may be instantiated"); 14361 ExprResult Receiver 14362 = getDerived().TransformExpr(E->getInstanceReceiver()); 14363 if (Receiver.isInvalid()) 14364 return ExprError(); 14365 14366 // If nothing changed, just retain the existing message send. 14367 if (!getDerived().AlwaysRebuild() && 14368 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14369 return SemaRef.MaybeBindToTemporary(E); 14370 14371 // Build a new instance message send. 14372 SmallVector<SourceLocation, 16> SelLocs; 14373 E->getSelectorLocs(SelLocs); 14374 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14375 E->getSelector(), 14376 SelLocs, 14377 E->getMethodDecl(), 14378 E->getLeftLoc(), 14379 Args, 14380 E->getRightLoc()); 14381 } 14382 14383 template<typename Derived> 14384 ExprResult 14385 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14386 return E; 14387 } 14388 14389 template<typename Derived> 14390 ExprResult 14391 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14392 return E; 14393 } 14394 14395 template<typename Derived> 14396 ExprResult 14397 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14398 // Transform the base expression. 14399 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14400 if (Base.isInvalid()) 14401 return ExprError(); 14402 14403 // We don't need to transform the ivar; it will never change. 14404 14405 // If nothing changed, just retain the existing expression. 14406 if (!getDerived().AlwaysRebuild() && 14407 Base.get() == E->getBase()) 14408 return E; 14409 14410 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14411 E->getLocation(), 14412 E->isArrow(), E->isFreeIvar()); 14413 } 14414 14415 template<typename Derived> 14416 ExprResult 14417 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14418 // 'super' and types never change. Property never changes. Just 14419 // retain the existing expression. 14420 if (!E->isObjectReceiver()) 14421 return E; 14422 14423 // Transform the base expression. 14424 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14425 if (Base.isInvalid()) 14426 return ExprError(); 14427 14428 // We don't need to transform the property; it will never change. 14429 14430 // If nothing changed, just retain the existing expression. 14431 if (!getDerived().AlwaysRebuild() && 14432 Base.get() == E->getBase()) 14433 return E; 14434 14435 if (E->isExplicitProperty()) 14436 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14437 E->getExplicitProperty(), 14438 E->getLocation()); 14439 14440 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14441 SemaRef.Context.PseudoObjectTy, 14442 E->getImplicitPropertyGetter(), 14443 E->getImplicitPropertySetter(), 14444 E->getLocation()); 14445 } 14446 14447 template<typename Derived> 14448 ExprResult 14449 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14450 // Transform the base expression. 14451 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14452 if (Base.isInvalid()) 14453 return ExprError(); 14454 14455 // Transform the key expression. 14456 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14457 if (Key.isInvalid()) 14458 return ExprError(); 14459 14460 // If nothing changed, just retain the existing expression. 14461 if (!getDerived().AlwaysRebuild() && 14462 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14463 return E; 14464 14465 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14466 Base.get(), Key.get(), 14467 E->getAtIndexMethodDecl(), 14468 E->setAtIndexMethodDecl()); 14469 } 14470 14471 template<typename Derived> 14472 ExprResult 14473 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14474 // Transform the base expression. 14475 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14476 if (Base.isInvalid()) 14477 return ExprError(); 14478 14479 // If nothing changed, just retain the existing expression. 14480 if (!getDerived().AlwaysRebuild() && 14481 Base.get() == E->getBase()) 14482 return E; 14483 14484 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14485 E->getOpLoc(), 14486 E->isArrow()); 14487 } 14488 14489 template<typename Derived> 14490 ExprResult 14491 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14492 bool ArgumentChanged = false; 14493 SmallVector<Expr*, 8> SubExprs; 14494 SubExprs.reserve(E->getNumSubExprs()); 14495 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14496 SubExprs, &ArgumentChanged)) 14497 return ExprError(); 14498 14499 if (!getDerived().AlwaysRebuild() && 14500 !ArgumentChanged) 14501 return E; 14502 14503 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14504 SubExprs, 14505 E->getRParenLoc()); 14506 } 14507 14508 template<typename Derived> 14509 ExprResult 14510 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14511 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14512 if (SrcExpr.isInvalid()) 14513 return ExprError(); 14514 14515 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14516 if (!Type) 14517 return ExprError(); 14518 14519 if (!getDerived().AlwaysRebuild() && 14520 Type == E->getTypeSourceInfo() && 14521 SrcExpr.get() == E->getSrcExpr()) 14522 return E; 14523 14524 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14525 SrcExpr.get(), Type, 14526 E->getRParenLoc()); 14527 } 14528 14529 template<typename Derived> 14530 ExprResult 14531 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14532 BlockDecl *oldBlock = E->getBlockDecl(); 14533 14534 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14535 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14536 14537 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14538 blockScope->TheDecl->setBlockMissingReturnType( 14539 oldBlock->blockMissingReturnType()); 14540 14541 SmallVector<ParmVarDecl*, 4> params; 14542 SmallVector<QualType, 4> paramTypes; 14543 14544 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14545 14546 // Parameter substitution. 14547 Sema::ExtParameterInfoBuilder extParamInfos; 14548 if (getDerived().TransformFunctionTypeParams( 14549 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14550 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14551 extParamInfos)) { 14552 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14553 return ExprError(); 14554 } 14555 14556 QualType exprResultType = 14557 getDerived().TransformType(exprFunctionType->getReturnType()); 14558 14559 auto epi = exprFunctionType->getExtProtoInfo(); 14560 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14561 14562 QualType functionType = 14563 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14564 blockScope->FunctionType = functionType; 14565 14566 // Set the parameters on the block decl. 14567 if (!params.empty()) 14568 blockScope->TheDecl->setParams(params); 14569 14570 if (!oldBlock->blockMissingReturnType()) { 14571 blockScope->HasImplicitReturnType = false; 14572 blockScope->ReturnType = exprResultType; 14573 } 14574 14575 // Transform the body 14576 StmtResult body = getDerived().TransformStmt(E->getBody()); 14577 if (body.isInvalid()) { 14578 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14579 return ExprError(); 14580 } 14581 14582 #ifndef NDEBUG 14583 // In builds with assertions, make sure that we captured everything we 14584 // captured before. 14585 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14586 for (const auto &I : oldBlock->captures()) { 14587 VarDecl *oldCapture = I.getVariable(); 14588 14589 // Ignore parameter packs. 14590 if (oldCapture->isParameterPack()) 14591 continue; 14592 14593 VarDecl *newCapture = 14594 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14595 oldCapture)); 14596 assert(blockScope->CaptureMap.count(newCapture)); 14597 } 14598 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14599 } 14600 #endif 14601 14602 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14603 /*Scope=*/nullptr); 14604 } 14605 14606 template<typename Derived> 14607 ExprResult 14608 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14609 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14610 if (SrcExpr.isInvalid()) 14611 return ExprError(); 14612 14613 QualType Type = getDerived().TransformType(E->getType()); 14614 14615 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14616 E->getRParenLoc()); 14617 } 14618 14619 template<typename Derived> 14620 ExprResult 14621 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14622 bool ArgumentChanged = false; 14623 SmallVector<Expr*, 8> SubExprs; 14624 SubExprs.reserve(E->getNumSubExprs()); 14625 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14626 SubExprs, &ArgumentChanged)) 14627 return ExprError(); 14628 14629 if (!getDerived().AlwaysRebuild() && 14630 !ArgumentChanged) 14631 return E; 14632 14633 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14634 E->getOp(), E->getRParenLoc()); 14635 } 14636 14637 //===----------------------------------------------------------------------===// 14638 // Type reconstruction 14639 //===----------------------------------------------------------------------===// 14640 14641 template<typename Derived> 14642 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14643 SourceLocation Star) { 14644 return SemaRef.BuildPointerType(PointeeType, Star, 14645 getDerived().getBaseEntity()); 14646 } 14647 14648 template<typename Derived> 14649 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14650 SourceLocation Star) { 14651 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14652 getDerived().getBaseEntity()); 14653 } 14654 14655 template<typename Derived> 14656 QualType 14657 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14658 bool WrittenAsLValue, 14659 SourceLocation Sigil) { 14660 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14661 Sigil, getDerived().getBaseEntity()); 14662 } 14663 14664 template<typename Derived> 14665 QualType 14666 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14667 QualType ClassType, 14668 SourceLocation Sigil) { 14669 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14670 getDerived().getBaseEntity()); 14671 } 14672 14673 template<typename Derived> 14674 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14675 const ObjCTypeParamDecl *Decl, 14676 SourceLocation ProtocolLAngleLoc, 14677 ArrayRef<ObjCProtocolDecl *> Protocols, 14678 ArrayRef<SourceLocation> ProtocolLocs, 14679 SourceLocation ProtocolRAngleLoc) { 14680 return SemaRef.BuildObjCTypeParamType(Decl, 14681 ProtocolLAngleLoc, Protocols, 14682 ProtocolLocs, ProtocolRAngleLoc, 14683 /*FailOnError=*/true); 14684 } 14685 14686 template<typename Derived> 14687 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14688 QualType BaseType, 14689 SourceLocation Loc, 14690 SourceLocation TypeArgsLAngleLoc, 14691 ArrayRef<TypeSourceInfo *> TypeArgs, 14692 SourceLocation TypeArgsRAngleLoc, 14693 SourceLocation ProtocolLAngleLoc, 14694 ArrayRef<ObjCProtocolDecl *> Protocols, 14695 ArrayRef<SourceLocation> ProtocolLocs, 14696 SourceLocation ProtocolRAngleLoc) { 14697 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs, 14698 TypeArgsRAngleLoc, ProtocolLAngleLoc, 14699 Protocols, ProtocolLocs, ProtocolRAngleLoc, 14700 /*FailOnError=*/true, 14701 /*Rebuilding=*/true); 14702 } 14703 14704 template<typename Derived> 14705 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14706 QualType PointeeType, 14707 SourceLocation Star) { 14708 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14709 } 14710 14711 template<typename Derived> 14712 QualType 14713 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14714 ArrayType::ArraySizeModifier SizeMod, 14715 const llvm::APInt *Size, 14716 Expr *SizeExpr, 14717 unsigned IndexTypeQuals, 14718 SourceRange BracketsRange) { 14719 if (SizeExpr || !Size) 14720 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14721 IndexTypeQuals, BracketsRange, 14722 getDerived().getBaseEntity()); 14723 14724 QualType Types[] = { 14725 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14726 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14727 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14728 }; 14729 QualType SizeType; 14730 for (const auto &T : Types) 14731 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) { 14732 SizeType = T; 14733 break; 14734 } 14735 14736 // Note that we can return a VariableArrayType here in the case where 14737 // the element type was a dependent VariableArrayType. 14738 IntegerLiteral *ArraySize 14739 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14740 /*FIXME*/BracketsRange.getBegin()); 14741 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14742 IndexTypeQuals, BracketsRange, 14743 getDerived().getBaseEntity()); 14744 } 14745 14746 template<typename Derived> 14747 QualType 14748 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14749 ArrayType::ArraySizeModifier SizeMod, 14750 const llvm::APInt &Size, 14751 Expr *SizeExpr, 14752 unsigned IndexTypeQuals, 14753 SourceRange BracketsRange) { 14754 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14755 IndexTypeQuals, BracketsRange); 14756 } 14757 14758 template<typename Derived> 14759 QualType 14760 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14761 ArrayType::ArraySizeModifier SizeMod, 14762 unsigned IndexTypeQuals, 14763 SourceRange BracketsRange) { 14764 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14765 IndexTypeQuals, BracketsRange); 14766 } 14767 14768 template<typename Derived> 14769 QualType 14770 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14771 ArrayType::ArraySizeModifier SizeMod, 14772 Expr *SizeExpr, 14773 unsigned IndexTypeQuals, 14774 SourceRange BracketsRange) { 14775 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14776 SizeExpr, 14777 IndexTypeQuals, BracketsRange); 14778 } 14779 14780 template<typename Derived> 14781 QualType 14782 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14783 ArrayType::ArraySizeModifier SizeMod, 14784 Expr *SizeExpr, 14785 unsigned IndexTypeQuals, 14786 SourceRange BracketsRange) { 14787 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14788 SizeExpr, 14789 IndexTypeQuals, BracketsRange); 14790 } 14791 14792 template <typename Derived> 14793 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14794 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14795 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14796 AttributeLoc); 14797 } 14798 14799 template <typename Derived> 14800 QualType 14801 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14802 unsigned NumElements, 14803 VectorType::VectorKind VecKind) { 14804 // FIXME: semantic checking! 14805 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14806 } 14807 14808 template <typename Derived> 14809 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14810 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14811 VectorType::VectorKind VecKind) { 14812 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14813 } 14814 14815 template<typename Derived> 14816 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14817 unsigned NumElements, 14818 SourceLocation AttributeLoc) { 14819 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14820 NumElements, true); 14821 IntegerLiteral *VectorSize 14822 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14823 AttributeLoc); 14824 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14825 } 14826 14827 template<typename Derived> 14828 QualType 14829 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14830 Expr *SizeExpr, 14831 SourceLocation AttributeLoc) { 14832 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14833 } 14834 14835 template <typename Derived> 14836 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14837 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14838 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14839 NumColumns); 14840 } 14841 14842 template <typename Derived> 14843 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14844 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14845 SourceLocation AttributeLoc) { 14846 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14847 AttributeLoc); 14848 } 14849 14850 template<typename Derived> 14851 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14852 QualType T, 14853 MutableArrayRef<QualType> ParamTypes, 14854 const FunctionProtoType::ExtProtoInfo &EPI) { 14855 return SemaRef.BuildFunctionType(T, ParamTypes, 14856 getDerived().getBaseLocation(), 14857 getDerived().getBaseEntity(), 14858 EPI); 14859 } 14860 14861 template<typename Derived> 14862 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14863 return SemaRef.Context.getFunctionNoProtoType(T); 14864 } 14865 14866 template<typename Derived> 14867 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14868 Decl *D) { 14869 assert(D && "no decl found"); 14870 if (D->isInvalidDecl()) return QualType(); 14871 14872 // FIXME: Doesn't account for ObjCInterfaceDecl! 14873 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14874 // A valid resolved using typename pack expansion decl can have multiple 14875 // UsingDecls, but they must each have exactly one type, and it must be 14876 // the same type in every case. But we must have at least one expansion! 14877 if (UPD->expansions().empty()) { 14878 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14879 << UPD->isCXXClassMember() << UPD; 14880 return QualType(); 14881 } 14882 14883 // We might still have some unresolved types. Try to pick a resolved type 14884 // if we can. The final instantiation will check that the remaining 14885 // unresolved types instantiate to the type we pick. 14886 QualType FallbackT; 14887 QualType T; 14888 for (auto *E : UPD->expansions()) { 14889 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14890 if (ThisT.isNull()) 14891 continue; 14892 else if (ThisT->getAs<UnresolvedUsingType>()) 14893 FallbackT = ThisT; 14894 else if (T.isNull()) 14895 T = ThisT; 14896 else 14897 assert(getSema().Context.hasSameType(ThisT, T) && 14898 "mismatched resolved types in using pack expansion"); 14899 } 14900 return T.isNull() ? FallbackT : T; 14901 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14902 assert(Using->hasTypename() && 14903 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14904 14905 // A valid resolved using typename decl points to exactly one type decl. 14906 assert(++Using->shadow_begin() == Using->shadow_end()); 14907 14908 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14909 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14910 return QualType(); 14911 return SemaRef.Context.getUsingType( 14912 Shadow, SemaRef.Context.getTypeDeclType( 14913 cast<TypeDecl>(Shadow->getTargetDecl()))); 14914 } else { 14915 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14916 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14917 return SemaRef.Context.getTypeDeclType( 14918 cast<UnresolvedUsingTypenameDecl>(D)); 14919 } 14920 } 14921 14922 template <typename Derived> 14923 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation, 14924 TypeOfKind Kind) { 14925 return SemaRef.BuildTypeofExprType(E, Kind); 14926 } 14927 14928 template<typename Derived> 14929 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying, 14930 TypeOfKind Kind) { 14931 return SemaRef.Context.getTypeOfType(Underlying, Kind); 14932 } 14933 14934 template <typename Derived> 14935 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14936 return SemaRef.BuildDecltypeType(E); 14937 } 14938 14939 template<typename Derived> 14940 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14941 UnaryTransformType::UTTKind UKind, 14942 SourceLocation Loc) { 14943 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14944 } 14945 14946 template<typename Derived> 14947 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14948 TemplateName Template, 14949 SourceLocation TemplateNameLoc, 14950 TemplateArgumentListInfo &TemplateArgs) { 14951 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14952 } 14953 14954 template<typename Derived> 14955 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14956 SourceLocation KWLoc) { 14957 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14958 } 14959 14960 template<typename Derived> 14961 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14962 SourceLocation KWLoc, 14963 bool isReadPipe) { 14964 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14965 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14966 } 14967 14968 template <typename Derived> 14969 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14970 unsigned NumBits, 14971 SourceLocation Loc) { 14972 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14973 NumBits, true); 14974 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14975 SemaRef.Context.IntTy, Loc); 14976 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14977 } 14978 14979 template <typename Derived> 14980 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14981 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14982 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14983 } 14984 14985 template<typename Derived> 14986 TemplateName 14987 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14988 bool TemplateKW, 14989 TemplateDecl *Template) { 14990 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14991 TemplateName(Template)); 14992 } 14993 14994 template<typename Derived> 14995 TemplateName 14996 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14997 SourceLocation TemplateKWLoc, 14998 const IdentifierInfo &Name, 14999 SourceLocation NameLoc, 15000 QualType ObjectType, 15001 NamedDecl *FirstQualifierInScope, 15002 bool AllowInjectedClassName) { 15003 UnqualifiedId TemplateName; 15004 TemplateName.setIdentifier(&Name, NameLoc); 15005 Sema::TemplateTy Template; 15006 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 15007 TemplateName, ParsedType::make(ObjectType), 15008 /*EnteringContext=*/false, Template, 15009 AllowInjectedClassName); 15010 return Template.get(); 15011 } 15012 15013 template<typename Derived> 15014 TemplateName 15015 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15016 SourceLocation TemplateKWLoc, 15017 OverloadedOperatorKind Operator, 15018 SourceLocation NameLoc, 15019 QualType ObjectType, 15020 bool AllowInjectedClassName) { 15021 UnqualifiedId Name; 15022 // FIXME: Bogus location information. 15023 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 15024 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 15025 Sema::TemplateTy Template; 15026 getSema().ActOnTemplateName( 15027 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 15028 /*EnteringContext=*/false, Template, AllowInjectedClassName); 15029 return Template.get(); 15030 } 15031 15032 template<typename Derived> 15033 ExprResult 15034 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 15035 SourceLocation OpLoc, 15036 Expr *OrigCallee, 15037 Expr *First, 15038 Expr *Second) { 15039 Expr *Callee = OrigCallee->IgnoreParenCasts(); 15040 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 15041 15042 if (First->getObjectKind() == OK_ObjCProperty) { 15043 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15044 if (BinaryOperator::isAssignmentOp(Opc)) 15045 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 15046 First, Second); 15047 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 15048 if (Result.isInvalid()) 15049 return ExprError(); 15050 First = Result.get(); 15051 } 15052 15053 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 15054 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 15055 if (Result.isInvalid()) 15056 return ExprError(); 15057 Second = Result.get(); 15058 } 15059 15060 // Determine whether this should be a builtin operation. 15061 if (Op == OO_Subscript) { 15062 if (!First->getType()->isOverloadableType() && 15063 !Second->getType()->isOverloadableType()) 15064 return getSema().CreateBuiltinArraySubscriptExpr( 15065 First, Callee->getBeginLoc(), Second, OpLoc); 15066 } else if (Op == OO_Arrow) { 15067 // It is possible that the type refers to a RecoveryExpr created earlier 15068 // in the tree transformation. 15069 if (First->getType()->isDependentType()) 15070 return ExprError(); 15071 // -> is never a builtin operation. 15072 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 15073 } else if (Second == nullptr || isPostIncDec) { 15074 if (!First->getType()->isOverloadableType() || 15075 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 15076 // The argument is not of overloadable type, or this is an expression 15077 // of the form &Class::member, so try to create a built-in unary 15078 // operation. 15079 UnaryOperatorKind Opc 15080 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15081 15082 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 15083 } 15084 } else { 15085 if (!First->getType()->isOverloadableType() && 15086 !Second->getType()->isOverloadableType()) { 15087 // Neither of the arguments is an overloadable type, so try to 15088 // create a built-in binary operation. 15089 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15090 ExprResult Result 15091 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 15092 if (Result.isInvalid()) 15093 return ExprError(); 15094 15095 return Result; 15096 } 15097 } 15098 15099 // Compute the transformed set of functions (and function templates) to be 15100 // used during overload resolution. 15101 UnresolvedSet<16> Functions; 15102 bool RequiresADL; 15103 15104 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 15105 Functions.append(ULE->decls_begin(), ULE->decls_end()); 15106 // If the overload could not be resolved in the template definition 15107 // (because we had a dependent argument), ADL is performed as part of 15108 // template instantiation. 15109 RequiresADL = ULE->requiresADL(); 15110 } else { 15111 // If we've resolved this to a particular non-member function, just call 15112 // that function. If we resolved it to a member function, 15113 // CreateOverloaded* will find that function for us. 15114 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 15115 if (!isa<CXXMethodDecl>(ND)) 15116 Functions.addDecl(ND); 15117 RequiresADL = false; 15118 } 15119 15120 // Add any functions found via argument-dependent lookup. 15121 Expr *Args[2] = { First, Second }; 15122 unsigned NumArgs = 1 + (Second != nullptr); 15123 15124 // Create the overloaded operator invocation for unary operators. 15125 if (NumArgs == 1 || isPostIncDec) { 15126 UnaryOperatorKind Opc 15127 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15128 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 15129 RequiresADL); 15130 } 15131 15132 if (Op == OO_Subscript) { 15133 SourceLocation LBrace; 15134 SourceLocation RBrace; 15135 15136 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 15137 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 15138 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 15139 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 15140 } else { 15141 LBrace = Callee->getBeginLoc(); 15142 RBrace = OpLoc; 15143 } 15144 15145 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 15146 First, Second); 15147 } 15148 15149 // Create the overloaded operator invocation for binary operators. 15150 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15151 ExprResult Result = SemaRef.CreateOverloadedBinOp( 15152 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 15153 if (Result.isInvalid()) 15154 return ExprError(); 15155 15156 return Result; 15157 } 15158 15159 template<typename Derived> 15160 ExprResult 15161 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 15162 SourceLocation OperatorLoc, 15163 bool isArrow, 15164 CXXScopeSpec &SS, 15165 TypeSourceInfo *ScopeType, 15166 SourceLocation CCLoc, 15167 SourceLocation TildeLoc, 15168 PseudoDestructorTypeStorage Destroyed) { 15169 QualType BaseType = Base->getType(); 15170 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 15171 (!isArrow && !BaseType->getAs<RecordType>()) || 15172 (isArrow && BaseType->getAs<PointerType>() && 15173 !BaseType->castAs<PointerType>()->getPointeeType() 15174 ->template getAs<RecordType>())){ 15175 // This pseudo-destructor expression is still a pseudo-destructor. 15176 return SemaRef.BuildPseudoDestructorExpr( 15177 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 15178 CCLoc, TildeLoc, Destroyed); 15179 } 15180 15181 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 15182 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 15183 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 15184 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 15185 NameInfo.setNamedTypeInfo(DestroyedType); 15186 15187 // The scope type is now known to be a valid nested name specifier 15188 // component. Tack it on to the end of the nested name specifier. 15189 if (ScopeType) { 15190 if (!ScopeType->getType()->getAs<TagType>()) { 15191 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 15192 diag::err_expected_class_or_namespace) 15193 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 15194 return ExprError(); 15195 } 15196 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 15197 CCLoc); 15198 } 15199 15200 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 15201 return getSema().BuildMemberReferenceExpr(Base, BaseType, 15202 OperatorLoc, isArrow, 15203 SS, TemplateKWLoc, 15204 /*FIXME: FirstQualifier*/ nullptr, 15205 NameInfo, 15206 /*TemplateArgs*/ nullptr, 15207 /*S*/nullptr); 15208 } 15209 15210 template<typename Derived> 15211 StmtResult 15212 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 15213 SourceLocation Loc = S->getBeginLoc(); 15214 CapturedDecl *CD = S->getCapturedDecl(); 15215 unsigned NumParams = CD->getNumParams(); 15216 unsigned ContextParamPos = CD->getContextParamPosition(); 15217 SmallVector<Sema::CapturedParamNameType, 4> Params; 15218 for (unsigned I = 0; I < NumParams; ++I) { 15219 if (I != ContextParamPos) { 15220 Params.push_back( 15221 std::make_pair( 15222 CD->getParam(I)->getName(), 15223 getDerived().TransformType(CD->getParam(I)->getType()))); 15224 } else { 15225 Params.push_back(std::make_pair(StringRef(), QualType())); 15226 } 15227 } 15228 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 15229 S->getCapturedRegionKind(), Params); 15230 StmtResult Body; 15231 { 15232 Sema::CompoundScopeRAII CompoundScope(getSema()); 15233 Body = getDerived().TransformStmt(S->getCapturedStmt()); 15234 } 15235 15236 if (Body.isInvalid()) { 15237 getSema().ActOnCapturedRegionError(); 15238 return StmtError(); 15239 } 15240 15241 return getSema().ActOnCapturedRegionEnd(Body.get()); 15242 } 15243 15244 } // end namespace clang 15245 15246 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15247