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 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3141 MultiExprArg(&Sub, 1), RParenLoc, 3142 ListInitialization); 3143 } 3144 3145 /// Build a new C++ __builtin_bit_cast expression. 3146 /// 3147 /// By default, performs semantic analysis to build the new expression. 3148 /// Subclasses may override this routine to provide different behavior. 3149 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3150 TypeSourceInfo *TSI, Expr *Sub, 3151 SourceLocation RParenLoc) { 3152 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3153 } 3154 3155 /// Build a new C++ typeid(type) expression. 3156 /// 3157 /// By default, performs semantic analysis to build the new expression. 3158 /// Subclasses may override this routine to provide different behavior. 3159 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3160 SourceLocation TypeidLoc, 3161 TypeSourceInfo *Operand, 3162 SourceLocation RParenLoc) { 3163 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3164 RParenLoc); 3165 } 3166 3167 3168 /// Build a new C++ typeid(expr) expression. 3169 /// 3170 /// By default, performs semantic analysis to build the new expression. 3171 /// Subclasses may override this routine to provide different behavior. 3172 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3173 SourceLocation TypeidLoc, 3174 Expr *Operand, 3175 SourceLocation RParenLoc) { 3176 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3177 RParenLoc); 3178 } 3179 3180 /// Build a new C++ __uuidof(type) expression. 3181 /// 3182 /// By default, performs semantic analysis to build the new expression. 3183 /// Subclasses may override this routine to provide different behavior. 3184 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3185 TypeSourceInfo *Operand, 3186 SourceLocation RParenLoc) { 3187 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3188 } 3189 3190 /// Build a new C++ __uuidof(expr) expression. 3191 /// 3192 /// By default, performs semantic analysis to build the new expression. 3193 /// Subclasses may override this routine to provide different behavior. 3194 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3195 Expr *Operand, SourceLocation RParenLoc) { 3196 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3197 } 3198 3199 /// Build a new C++ "this" expression. 3200 /// 3201 /// By default, builds a new "this" expression without performing any 3202 /// semantic analysis. Subclasses may override this routine to provide 3203 /// different behavior. 3204 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3205 QualType ThisType, 3206 bool isImplicit) { 3207 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3208 } 3209 3210 /// Build a new C++ throw expression. 3211 /// 3212 /// By default, performs semantic analysis to build the new expression. 3213 /// Subclasses may override this routine to provide different behavior. 3214 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3215 bool IsThrownVariableInScope) { 3216 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3217 } 3218 3219 /// Build a new C++ default-argument expression. 3220 /// 3221 /// By default, builds a new default-argument expression, which does not 3222 /// require any semantic analysis. Subclasses may override this routine to 3223 /// provide different behavior. 3224 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param, 3225 Expr *RewrittenExpr) { 3226 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3227 RewrittenExpr, getSema().CurContext); 3228 } 3229 3230 /// Build a new C++11 default-initialization expression. 3231 /// 3232 /// By default, builds a new default field initialization expression, which 3233 /// does not require any semantic analysis. Subclasses may override this 3234 /// routine to provide different behavior. 3235 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3236 FieldDecl *Field) { 3237 return getSema().BuildCXXDefaultInitExpr(Loc, Field); 3238 } 3239 3240 /// Build a new C++ zero-initialization expression. 3241 /// 3242 /// By default, performs semantic analysis to build the new expression. 3243 /// Subclasses may override this routine to provide different behavior. 3244 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3245 SourceLocation LParenLoc, 3246 SourceLocation RParenLoc) { 3247 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, std::nullopt, 3248 RParenLoc, 3249 /*ListInitialization=*/false); 3250 } 3251 3252 /// Build a new C++ "new" expression. 3253 /// 3254 /// By default, performs semantic analysis to build the new expression. 3255 /// Subclasses may override this routine to provide different behavior. 3256 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, bool UseGlobal, 3257 SourceLocation PlacementLParen, 3258 MultiExprArg PlacementArgs, 3259 SourceLocation PlacementRParen, 3260 SourceRange TypeIdParens, QualType AllocatedType, 3261 TypeSourceInfo *AllocatedTypeInfo, 3262 std::optional<Expr *> ArraySize, 3263 SourceRange DirectInitRange, Expr *Initializer) { 3264 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3265 PlacementLParen, 3266 PlacementArgs, 3267 PlacementRParen, 3268 TypeIdParens, 3269 AllocatedType, 3270 AllocatedTypeInfo, 3271 ArraySize, 3272 DirectInitRange, 3273 Initializer); 3274 } 3275 3276 /// Build a new C++ "delete" expression. 3277 /// 3278 /// By default, performs semantic analysis to build the new expression. 3279 /// Subclasses may override this routine to provide different behavior. 3280 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3281 bool IsGlobalDelete, 3282 bool IsArrayForm, 3283 Expr *Operand) { 3284 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3285 Operand); 3286 } 3287 3288 /// Build a new type trait expression. 3289 /// 3290 /// By default, performs semantic analysis to build the new expression. 3291 /// Subclasses may override this routine to provide different behavior. 3292 ExprResult RebuildTypeTrait(TypeTrait Trait, 3293 SourceLocation StartLoc, 3294 ArrayRef<TypeSourceInfo *> Args, 3295 SourceLocation RParenLoc) { 3296 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3297 } 3298 3299 /// Build a new array type trait expression. 3300 /// 3301 /// By default, performs semantic analysis to build the new expression. 3302 /// Subclasses may override this routine to provide different behavior. 3303 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3304 SourceLocation StartLoc, 3305 TypeSourceInfo *TSInfo, 3306 Expr *DimExpr, 3307 SourceLocation RParenLoc) { 3308 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3309 } 3310 3311 /// Build a new expression trait expression. 3312 /// 3313 /// By default, performs semantic analysis to build the new expression. 3314 /// Subclasses may override this routine to provide different behavior. 3315 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3316 SourceLocation StartLoc, 3317 Expr *Queried, 3318 SourceLocation RParenLoc) { 3319 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3320 } 3321 3322 /// Build a new (previously unresolved) declaration reference 3323 /// expression. 3324 /// 3325 /// By default, performs semantic analysis to build the new expression. 3326 /// Subclasses may override this routine to provide different behavior. 3327 ExprResult RebuildDependentScopeDeclRefExpr( 3328 NestedNameSpecifierLoc QualifierLoc, 3329 SourceLocation TemplateKWLoc, 3330 const DeclarationNameInfo &NameInfo, 3331 const TemplateArgumentListInfo *TemplateArgs, 3332 bool IsAddressOfOperand, 3333 TypeSourceInfo **RecoveryTSI) { 3334 CXXScopeSpec SS; 3335 SS.Adopt(QualifierLoc); 3336 3337 if (TemplateArgs || TemplateKWLoc.isValid()) 3338 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3339 TemplateArgs); 3340 3341 return getSema().BuildQualifiedDeclarationNameExpr( 3342 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3343 } 3344 3345 /// Build a new template-id expression. 3346 /// 3347 /// By default, performs semantic analysis to build the new expression. 3348 /// Subclasses may override this routine to provide different behavior. 3349 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3350 SourceLocation TemplateKWLoc, 3351 LookupResult &R, 3352 bool RequiresADL, 3353 const TemplateArgumentListInfo *TemplateArgs) { 3354 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3355 TemplateArgs); 3356 } 3357 3358 /// Build a new object-construction expression. 3359 /// 3360 /// By default, performs semantic analysis to build the new expression. 3361 /// Subclasses may override this routine to provide different behavior. 3362 ExprResult RebuildCXXConstructExpr(QualType T, 3363 SourceLocation Loc, 3364 CXXConstructorDecl *Constructor, 3365 bool IsElidable, 3366 MultiExprArg Args, 3367 bool HadMultipleCandidates, 3368 bool ListInitialization, 3369 bool StdInitListInitialization, 3370 bool RequiresZeroInit, 3371 CXXConstructExpr::ConstructionKind ConstructKind, 3372 SourceRange ParenRange) { 3373 // Reconstruct the constructor we originally found, which might be 3374 // different if this is a call to an inherited constructor. 3375 CXXConstructorDecl *FoundCtor = Constructor; 3376 if (Constructor->isInheritingConstructor()) 3377 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3378 3379 SmallVector<Expr *, 8> ConvertedArgs; 3380 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3381 ConvertedArgs)) 3382 return ExprError(); 3383 3384 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3385 IsElidable, 3386 ConvertedArgs, 3387 HadMultipleCandidates, 3388 ListInitialization, 3389 StdInitListInitialization, 3390 RequiresZeroInit, ConstructKind, 3391 ParenRange); 3392 } 3393 3394 /// Build a new implicit construction via inherited constructor 3395 /// expression. 3396 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3397 CXXConstructorDecl *Constructor, 3398 bool ConstructsVBase, 3399 bool InheritedFromVBase) { 3400 return new (getSema().Context) CXXInheritedCtorInitExpr( 3401 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3402 } 3403 3404 /// Build a new object-construction expression. 3405 /// 3406 /// By default, performs semantic analysis to build the new expression. 3407 /// Subclasses may override this routine to provide different behavior. 3408 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3409 SourceLocation LParenOrBraceLoc, 3410 MultiExprArg Args, 3411 SourceLocation RParenOrBraceLoc, 3412 bool ListInitialization) { 3413 return getSema().BuildCXXTypeConstructExpr( 3414 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3415 } 3416 3417 /// Build a new object-construction expression. 3418 /// 3419 /// By default, performs semantic analysis to build the new expression. 3420 /// Subclasses may override this routine to provide different behavior. 3421 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3422 SourceLocation LParenLoc, 3423 MultiExprArg Args, 3424 SourceLocation RParenLoc, 3425 bool ListInitialization) { 3426 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3427 RParenLoc, ListInitialization); 3428 } 3429 3430 /// Build a new member reference expression. 3431 /// 3432 /// By default, performs semantic analysis to build the new expression. 3433 /// Subclasses may override this routine to provide different behavior. 3434 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3435 QualType BaseType, 3436 bool IsArrow, 3437 SourceLocation OperatorLoc, 3438 NestedNameSpecifierLoc QualifierLoc, 3439 SourceLocation TemplateKWLoc, 3440 NamedDecl *FirstQualifierInScope, 3441 const DeclarationNameInfo &MemberNameInfo, 3442 const TemplateArgumentListInfo *TemplateArgs) { 3443 CXXScopeSpec SS; 3444 SS.Adopt(QualifierLoc); 3445 3446 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3447 OperatorLoc, IsArrow, 3448 SS, TemplateKWLoc, 3449 FirstQualifierInScope, 3450 MemberNameInfo, 3451 TemplateArgs, /*S*/nullptr); 3452 } 3453 3454 /// Build a new member reference expression. 3455 /// 3456 /// By default, performs semantic analysis to build the new expression. 3457 /// Subclasses may override this routine to provide different behavior. 3458 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3459 SourceLocation OperatorLoc, 3460 bool IsArrow, 3461 NestedNameSpecifierLoc QualifierLoc, 3462 SourceLocation TemplateKWLoc, 3463 NamedDecl *FirstQualifierInScope, 3464 LookupResult &R, 3465 const TemplateArgumentListInfo *TemplateArgs) { 3466 CXXScopeSpec SS; 3467 SS.Adopt(QualifierLoc); 3468 3469 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3470 OperatorLoc, IsArrow, 3471 SS, TemplateKWLoc, 3472 FirstQualifierInScope, 3473 R, TemplateArgs, /*S*/nullptr); 3474 } 3475 3476 /// Build a new noexcept expression. 3477 /// 3478 /// By default, performs semantic analysis to build the new expression. 3479 /// Subclasses may override this routine to provide different behavior. 3480 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3481 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3482 } 3483 3484 /// Build a new expression to compute the length of a parameter pack. 3485 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 3486 SourceLocation PackLoc, 3487 SourceLocation RParenLoc, 3488 std::optional<unsigned> Length, 3489 ArrayRef<TemplateArgument> PartialArgs) { 3490 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3491 RParenLoc, Length, PartialArgs); 3492 } 3493 3494 /// Build a new expression representing a call to a source location 3495 /// builtin. 3496 /// 3497 /// By default, performs semantic analysis to build the new expression. 3498 /// Subclasses may override this routine to provide different behavior. 3499 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3500 QualType ResultTy, SourceLocation BuiltinLoc, 3501 SourceLocation RPLoc, 3502 DeclContext *ParentContext) { 3503 return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, 3504 ParentContext); 3505 } 3506 3507 /// Build a new Objective-C boxed expression. 3508 /// 3509 /// By default, performs semantic analysis to build the new expression. 3510 /// Subclasses may override this routine to provide different behavior. 3511 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3512 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3513 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3514 TemplateArgumentListInfo *TALI) { 3515 CXXScopeSpec SS; 3516 SS.Adopt(NNS); 3517 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3518 ConceptNameInfo, 3519 FoundDecl, 3520 NamedConcept, TALI); 3521 if (Result.isInvalid()) 3522 return ExprError(); 3523 return Result; 3524 } 3525 3526 /// \brief Build a new requires expression. 3527 /// 3528 /// By default, performs semantic analysis to build the new expression. 3529 /// Subclasses may override this routine to provide different behavior. 3530 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3531 RequiresExprBodyDecl *Body, 3532 ArrayRef<ParmVarDecl *> LocalParameters, 3533 ArrayRef<concepts::Requirement *> Requirements, 3534 SourceLocation ClosingBraceLoc) { 3535 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3536 LocalParameters, Requirements, ClosingBraceLoc); 3537 } 3538 3539 concepts::TypeRequirement * 3540 RebuildTypeRequirement( 3541 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3542 return SemaRef.BuildTypeRequirement(SubstDiag); 3543 } 3544 3545 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3546 return SemaRef.BuildTypeRequirement(T); 3547 } 3548 3549 concepts::ExprRequirement * 3550 RebuildExprRequirement( 3551 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3552 SourceLocation NoexceptLoc, 3553 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3554 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3555 std::move(Ret)); 3556 } 3557 3558 concepts::ExprRequirement * 3559 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3560 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3561 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3562 std::move(Ret)); 3563 } 3564 3565 concepts::NestedRequirement * 3566 RebuildNestedRequirement(StringRef InvalidConstraintEntity, 3567 const ASTConstraintSatisfaction &Satisfaction) { 3568 return SemaRef.BuildNestedRequirement(InvalidConstraintEntity, 3569 Satisfaction); 3570 } 3571 3572 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3573 return SemaRef.BuildNestedRequirement(Constraint); 3574 } 3575 3576 /// \brief Build a new Objective-C boxed expression. 3577 /// 3578 /// By default, performs semantic analysis to build the new expression. 3579 /// Subclasses may override this routine to provide different behavior. 3580 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3581 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3582 } 3583 3584 /// Build a new Objective-C array literal. 3585 /// 3586 /// By default, performs semantic analysis to build the new expression. 3587 /// Subclasses may override this routine to provide different behavior. 3588 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3589 Expr **Elements, unsigned NumElements) { 3590 return getSema().BuildObjCArrayLiteral(Range, 3591 MultiExprArg(Elements, NumElements)); 3592 } 3593 3594 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3595 Expr *Base, Expr *Key, 3596 ObjCMethodDecl *getterMethod, 3597 ObjCMethodDecl *setterMethod) { 3598 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3599 getterMethod, setterMethod); 3600 } 3601 3602 /// Build a new Objective-C dictionary literal. 3603 /// 3604 /// By default, performs semantic analysis to build the new expression. 3605 /// Subclasses may override this routine to provide different behavior. 3606 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3607 MutableArrayRef<ObjCDictionaryElement> Elements) { 3608 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3609 } 3610 3611 /// Build a new Objective-C \@encode expression. 3612 /// 3613 /// By default, performs semantic analysis to build the new expression. 3614 /// Subclasses may override this routine to provide different behavior. 3615 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3616 TypeSourceInfo *EncodeTypeInfo, 3617 SourceLocation RParenLoc) { 3618 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3619 } 3620 3621 /// Build a new Objective-C class message. 3622 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3623 Selector Sel, 3624 ArrayRef<SourceLocation> SelectorLocs, 3625 ObjCMethodDecl *Method, 3626 SourceLocation LBracLoc, 3627 MultiExprArg Args, 3628 SourceLocation RBracLoc) { 3629 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3630 ReceiverTypeInfo->getType(), 3631 /*SuperLoc=*/SourceLocation(), 3632 Sel, Method, LBracLoc, SelectorLocs, 3633 RBracLoc, Args); 3634 } 3635 3636 /// Build a new Objective-C instance message. 3637 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3638 Selector Sel, 3639 ArrayRef<SourceLocation> SelectorLocs, 3640 ObjCMethodDecl *Method, 3641 SourceLocation LBracLoc, 3642 MultiExprArg Args, 3643 SourceLocation RBracLoc) { 3644 return SemaRef.BuildInstanceMessage(Receiver, 3645 Receiver->getType(), 3646 /*SuperLoc=*/SourceLocation(), 3647 Sel, Method, LBracLoc, SelectorLocs, 3648 RBracLoc, Args); 3649 } 3650 3651 /// Build a new Objective-C instance/class message to 'super'. 3652 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3653 Selector Sel, 3654 ArrayRef<SourceLocation> SelectorLocs, 3655 QualType SuperType, 3656 ObjCMethodDecl *Method, 3657 SourceLocation LBracLoc, 3658 MultiExprArg Args, 3659 SourceLocation RBracLoc) { 3660 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3661 SuperType, 3662 SuperLoc, 3663 Sel, Method, LBracLoc, SelectorLocs, 3664 RBracLoc, Args) 3665 : SemaRef.BuildClassMessage(nullptr, 3666 SuperType, 3667 SuperLoc, 3668 Sel, Method, LBracLoc, SelectorLocs, 3669 RBracLoc, Args); 3670 3671 3672 } 3673 3674 /// Build a new Objective-C ivar reference expression. 3675 /// 3676 /// By default, performs semantic analysis to build the new expression. 3677 /// Subclasses may override this routine to provide different behavior. 3678 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3679 SourceLocation IvarLoc, 3680 bool IsArrow, bool IsFreeIvar) { 3681 CXXScopeSpec SS; 3682 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3683 ExprResult Result = getSema().BuildMemberReferenceExpr( 3684 BaseArg, BaseArg->getType(), 3685 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3686 /*FirstQualifierInScope=*/nullptr, NameInfo, 3687 /*TemplateArgs=*/nullptr, 3688 /*S=*/nullptr); 3689 if (IsFreeIvar && Result.isUsable()) 3690 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3691 return Result; 3692 } 3693 3694 /// Build a new Objective-C property reference expression. 3695 /// 3696 /// By default, performs semantic analysis to build the new expression. 3697 /// Subclasses may override this routine to provide different behavior. 3698 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3699 ObjCPropertyDecl *Property, 3700 SourceLocation PropertyLoc) { 3701 CXXScopeSpec SS; 3702 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3703 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3704 /*FIXME:*/PropertyLoc, 3705 /*IsArrow=*/false, 3706 SS, SourceLocation(), 3707 /*FirstQualifierInScope=*/nullptr, 3708 NameInfo, 3709 /*TemplateArgs=*/nullptr, 3710 /*S=*/nullptr); 3711 } 3712 3713 /// Build a new Objective-C property reference expression. 3714 /// 3715 /// By default, performs semantic analysis to build the new expression. 3716 /// Subclasses may override this routine to provide different behavior. 3717 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3718 ObjCMethodDecl *Getter, 3719 ObjCMethodDecl *Setter, 3720 SourceLocation PropertyLoc) { 3721 // Since these expressions can only be value-dependent, we do not 3722 // need to perform semantic analysis again. 3723 return Owned( 3724 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3725 VK_LValue, OK_ObjCProperty, 3726 PropertyLoc, Base)); 3727 } 3728 3729 /// Build a new Objective-C "isa" expression. 3730 /// 3731 /// By default, performs semantic analysis to build the new expression. 3732 /// Subclasses may override this routine to provide different behavior. 3733 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3734 SourceLocation OpLoc, bool IsArrow) { 3735 CXXScopeSpec SS; 3736 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3737 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3738 OpLoc, IsArrow, 3739 SS, SourceLocation(), 3740 /*FirstQualifierInScope=*/nullptr, 3741 NameInfo, 3742 /*TemplateArgs=*/nullptr, 3743 /*S=*/nullptr); 3744 } 3745 3746 /// Build a new shuffle vector expression. 3747 /// 3748 /// By default, performs semantic analysis to build the new expression. 3749 /// Subclasses may override this routine to provide different behavior. 3750 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3751 MultiExprArg SubExprs, 3752 SourceLocation RParenLoc) { 3753 // Find the declaration for __builtin_shufflevector 3754 const IdentifierInfo &Name 3755 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3756 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3757 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3758 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3759 3760 // Build a reference to the __builtin_shufflevector builtin 3761 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3762 Expr *Callee = new (SemaRef.Context) 3763 DeclRefExpr(SemaRef.Context, Builtin, false, 3764 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3765 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3766 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3767 CK_BuiltinFnToFnPtr).get(); 3768 3769 // Build the CallExpr 3770 ExprResult TheCall = CallExpr::Create( 3771 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3772 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3773 FPOptionsOverride()); 3774 3775 // Type-check the __builtin_shufflevector expression. 3776 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3777 } 3778 3779 /// Build a new convert vector expression. 3780 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3781 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3782 SourceLocation RParenLoc) { 3783 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3784 BuiltinLoc, RParenLoc); 3785 } 3786 3787 /// Build a new template argument pack expansion. 3788 /// 3789 /// By default, performs semantic analysis to build a new pack expansion 3790 /// for a template argument. Subclasses may override this routine to provide 3791 /// different behavior. 3792 TemplateArgumentLoc 3793 RebuildPackExpansion(TemplateArgumentLoc Pattern, SourceLocation EllipsisLoc, 3794 std::optional<unsigned> NumExpansions) { 3795 switch (Pattern.getArgument().getKind()) { 3796 case TemplateArgument::Expression: { 3797 ExprResult Result 3798 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3799 EllipsisLoc, NumExpansions); 3800 if (Result.isInvalid()) 3801 return TemplateArgumentLoc(); 3802 3803 return TemplateArgumentLoc(Result.get(), Result.get()); 3804 } 3805 3806 case TemplateArgument::Template: 3807 return TemplateArgumentLoc( 3808 SemaRef.Context, 3809 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3810 NumExpansions), 3811 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3812 EllipsisLoc); 3813 3814 case TemplateArgument::Null: 3815 case TemplateArgument::Integral: 3816 case TemplateArgument::Declaration: 3817 case TemplateArgument::Pack: 3818 case TemplateArgument::TemplateExpansion: 3819 case TemplateArgument::NullPtr: 3820 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3821 3822 case TemplateArgument::Type: 3823 if (TypeSourceInfo *Expansion 3824 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3825 EllipsisLoc, 3826 NumExpansions)) 3827 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3828 Expansion); 3829 break; 3830 } 3831 3832 return TemplateArgumentLoc(); 3833 } 3834 3835 /// Build a new expression pack expansion. 3836 /// 3837 /// By default, performs semantic analysis to build a new pack expansion 3838 /// for an expression. Subclasses may override this routine to provide 3839 /// different behavior. 3840 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3841 std::optional<unsigned> NumExpansions) { 3842 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3843 } 3844 3845 /// Build a new C++1z fold-expression. 3846 /// 3847 /// By default, performs semantic analysis in order to build a new fold 3848 /// expression. 3849 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3850 SourceLocation LParenLoc, Expr *LHS, 3851 BinaryOperatorKind Operator, 3852 SourceLocation EllipsisLoc, Expr *RHS, 3853 SourceLocation RParenLoc, 3854 std::optional<unsigned> NumExpansions) { 3855 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3856 EllipsisLoc, RHS, RParenLoc, 3857 NumExpansions); 3858 } 3859 3860 /// Build an empty C++1z fold-expression with the given operator. 3861 /// 3862 /// By default, produces the fallback value for the fold-expression, or 3863 /// produce an error if there is no fallback value. 3864 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3865 BinaryOperatorKind Operator) { 3866 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3867 } 3868 3869 ExprResult RebuildCXXParenListInitExpr(ArrayRef<Expr *> Args, QualType T, 3870 unsigned NumUserSpecifiedExprs, 3871 SourceLocation InitLoc, 3872 SourceLocation LParenLoc, 3873 SourceLocation RParenLoc) { 3874 return CXXParenListInitExpr::Create(getSema().Context, Args, T, 3875 NumUserSpecifiedExprs, InitLoc, 3876 LParenLoc, RParenLoc); 3877 } 3878 3879 /// Build a new atomic operation expression. 3880 /// 3881 /// By default, performs semantic analysis to build the new expression. 3882 /// Subclasses may override this routine to provide different behavior. 3883 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3884 AtomicExpr::AtomicOp Op, 3885 SourceLocation RParenLoc) { 3886 // Use this for all of the locations, since we don't know the difference 3887 // between the call and the expr at this point. 3888 SourceRange Range{BuiltinLoc, RParenLoc}; 3889 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3890 Sema::AtomicArgumentOrder::AST); 3891 } 3892 3893 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3894 ArrayRef<Expr *> SubExprs, QualType Type) { 3895 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3896 } 3897 3898 private: 3899 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3900 QualType ObjectType, 3901 NamedDecl *FirstQualifierInScope, 3902 CXXScopeSpec &SS); 3903 3904 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3905 QualType ObjectType, 3906 NamedDecl *FirstQualifierInScope, 3907 CXXScopeSpec &SS); 3908 3909 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3910 NamedDecl *FirstQualifierInScope, 3911 CXXScopeSpec &SS); 3912 3913 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3914 DependentNameTypeLoc TL, 3915 bool DeducibleTSTContext); 3916 }; 3917 3918 template <typename Derived> 3919 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3920 if (!S) 3921 return S; 3922 3923 switch (S->getStmtClass()) { 3924 case Stmt::NoStmtClass: break; 3925 3926 // Transform individual statement nodes 3927 // Pass SDK into statements that can produce a value 3928 #define STMT(Node, Parent) \ 3929 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3930 #define VALUESTMT(Node, Parent) \ 3931 case Stmt::Node##Class: \ 3932 return getDerived().Transform##Node(cast<Node>(S), SDK); 3933 #define ABSTRACT_STMT(Node) 3934 #define EXPR(Node, Parent) 3935 #include "clang/AST/StmtNodes.inc" 3936 3937 // Transform expressions by calling TransformExpr. 3938 #define STMT(Node, Parent) 3939 #define ABSTRACT_STMT(Stmt) 3940 #define EXPR(Node, Parent) case Stmt::Node##Class: 3941 #include "clang/AST/StmtNodes.inc" 3942 { 3943 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3944 3945 if (SDK == SDK_StmtExprResult) 3946 E = getSema().ActOnStmtExprResult(E); 3947 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3948 } 3949 } 3950 3951 return S; 3952 } 3953 3954 template<typename Derived> 3955 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3956 if (!S) 3957 return S; 3958 3959 switch (S->getClauseKind()) { 3960 default: break; 3961 // Transform individual clause nodes 3962 #define GEN_CLANG_CLAUSE_CLASS 3963 #define CLAUSE_CLASS(Enum, Str, Class) \ 3964 case Enum: \ 3965 return getDerived().Transform##Class(cast<Class>(S)); 3966 #include "llvm/Frontend/OpenMP/OMP.inc" 3967 } 3968 3969 return S; 3970 } 3971 3972 3973 template<typename Derived> 3974 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3975 if (!E) 3976 return E; 3977 3978 switch (E->getStmtClass()) { 3979 case Stmt::NoStmtClass: break; 3980 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3981 #define ABSTRACT_STMT(Stmt) 3982 #define EXPR(Node, Parent) \ 3983 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3984 #include "clang/AST/StmtNodes.inc" 3985 } 3986 3987 return E; 3988 } 3989 3990 template<typename Derived> 3991 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3992 bool NotCopyInit) { 3993 // Initializers are instantiated like expressions, except that various outer 3994 // layers are stripped. 3995 if (!Init) 3996 return Init; 3997 3998 if (auto *FE = dyn_cast<FullExpr>(Init)) 3999 Init = FE->getSubExpr(); 4000 4001 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 4002 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 4003 Init = OVE->getSourceExpr(); 4004 } 4005 4006 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 4007 Init = MTE->getSubExpr(); 4008 4009 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 4010 Init = Binder->getSubExpr(); 4011 4012 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 4013 Init = ICE->getSubExprAsWritten(); 4014 4015 if (CXXStdInitializerListExpr *ILE = 4016 dyn_cast<CXXStdInitializerListExpr>(Init)) 4017 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 4018 4019 // If this is copy-initialization, we only need to reconstruct 4020 // InitListExprs. Other forms of copy-initialization will be a no-op if 4021 // the initializer is already the right type. 4022 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 4023 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 4024 return getDerived().TransformExpr(Init); 4025 4026 // Revert value-initialization back to empty parens. 4027 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 4028 SourceRange Parens = VIE->getSourceRange(); 4029 return getDerived().RebuildParenListExpr(Parens.getBegin(), std::nullopt, 4030 Parens.getEnd()); 4031 } 4032 4033 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 4034 if (isa<ImplicitValueInitExpr>(Init)) 4035 return getDerived().RebuildParenListExpr(SourceLocation(), std::nullopt, 4036 SourceLocation()); 4037 4038 // Revert initialization by constructor back to a parenthesized or braced list 4039 // of expressions. Any other form of initializer can just be reused directly. 4040 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 4041 return getDerived().TransformExpr(Init); 4042 4043 // If the initialization implicitly converted an initializer list to a 4044 // std::initializer_list object, unwrap the std::initializer_list too. 4045 if (Construct && Construct->isStdInitListInitialization()) 4046 return TransformInitializer(Construct->getArg(0), NotCopyInit); 4047 4048 // Enter a list-init context if this was list initialization. 4049 EnterExpressionEvaluationContext Context( 4050 getSema(), EnterExpressionEvaluationContext::InitList, 4051 Construct->isListInitialization()); 4052 4053 SmallVector<Expr*, 8> NewArgs; 4054 bool ArgChanged = false; 4055 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 4056 /*IsCall*/true, NewArgs, &ArgChanged)) 4057 return ExprError(); 4058 4059 // If this was list initialization, revert to syntactic list form. 4060 if (Construct->isListInitialization()) 4061 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 4062 Construct->getEndLoc()); 4063 4064 // Build a ParenListExpr to represent anything else. 4065 SourceRange Parens = Construct->getParenOrBraceRange(); 4066 if (Parens.isInvalid()) { 4067 // This was a variable declaration's initialization for which no initializer 4068 // was specified. 4069 assert(NewArgs.empty() && 4070 "no parens or braces but have direct init with arguments?"); 4071 return ExprEmpty(); 4072 } 4073 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 4074 Parens.getEnd()); 4075 } 4076 4077 template<typename Derived> 4078 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 4079 unsigned NumInputs, 4080 bool IsCall, 4081 SmallVectorImpl<Expr *> &Outputs, 4082 bool *ArgChanged) { 4083 for (unsigned I = 0; I != NumInputs; ++I) { 4084 // If requested, drop call arguments that need to be dropped. 4085 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 4086 if (ArgChanged) 4087 *ArgChanged = true; 4088 4089 break; 4090 } 4091 4092 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 4093 Expr *Pattern = Expansion->getPattern(); 4094 4095 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4096 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4097 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4098 4099 // Determine whether the set of unexpanded parameter packs can and should 4100 // be expanded. 4101 bool Expand = true; 4102 bool RetainExpansion = false; 4103 std::optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 4104 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4105 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 4106 Pattern->getSourceRange(), 4107 Unexpanded, 4108 Expand, RetainExpansion, 4109 NumExpansions)) 4110 return true; 4111 4112 if (!Expand) { 4113 // The transform has determined that we should perform a simple 4114 // transformation on the pack expansion, producing another pack 4115 // expansion. 4116 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4117 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 4118 if (OutPattern.isInvalid()) 4119 return true; 4120 4121 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4122 Expansion->getEllipsisLoc(), 4123 NumExpansions); 4124 if (Out.isInvalid()) 4125 return true; 4126 4127 if (ArgChanged) 4128 *ArgChanged = true; 4129 Outputs.push_back(Out.get()); 4130 continue; 4131 } 4132 4133 // Record right away that the argument was changed. This needs 4134 // to happen even if the array expands to nothing. 4135 if (ArgChanged) *ArgChanged = true; 4136 4137 // The transform has determined that we should perform an elementwise 4138 // expansion of the pattern. Do so. 4139 for (unsigned I = 0; I != *NumExpansions; ++I) { 4140 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4141 ExprResult Out = getDerived().TransformExpr(Pattern); 4142 if (Out.isInvalid()) 4143 return true; 4144 4145 if (Out.get()->containsUnexpandedParameterPack()) { 4146 Out = getDerived().RebuildPackExpansion( 4147 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4148 if (Out.isInvalid()) 4149 return true; 4150 } 4151 4152 Outputs.push_back(Out.get()); 4153 } 4154 4155 // If we're supposed to retain a pack expansion, do so by temporarily 4156 // forgetting the partially-substituted parameter pack. 4157 if (RetainExpansion) { 4158 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4159 4160 ExprResult Out = getDerived().TransformExpr(Pattern); 4161 if (Out.isInvalid()) 4162 return true; 4163 4164 Out = getDerived().RebuildPackExpansion( 4165 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4166 if (Out.isInvalid()) 4167 return true; 4168 4169 Outputs.push_back(Out.get()); 4170 } 4171 4172 continue; 4173 } 4174 4175 ExprResult Result = 4176 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4177 : getDerived().TransformExpr(Inputs[I]); 4178 if (Result.isInvalid()) 4179 return true; 4180 4181 if (Result.get() != Inputs[I] && ArgChanged) 4182 *ArgChanged = true; 4183 4184 Outputs.push_back(Result.get()); 4185 } 4186 4187 return false; 4188 } 4189 4190 template <typename Derived> 4191 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4192 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4193 if (Var) { 4194 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4195 getDerived().TransformDefinition(Var->getLocation(), Var)); 4196 4197 if (!ConditionVar) 4198 return Sema::ConditionError(); 4199 4200 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4201 } 4202 4203 if (Expr) { 4204 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4205 4206 if (CondExpr.isInvalid()) 4207 return Sema::ConditionError(); 4208 4209 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4210 /*MissingOK=*/true); 4211 } 4212 4213 return Sema::ConditionResult(); 4214 } 4215 4216 template <typename Derived> 4217 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4218 NestedNameSpecifierLoc NNS, QualType ObjectType, 4219 NamedDecl *FirstQualifierInScope) { 4220 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4221 4222 auto insertNNS = [&Qualifiers](NestedNameSpecifierLoc NNS) { 4223 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4224 Qualifier = Qualifier.getPrefix()) 4225 Qualifiers.push_back(Qualifier); 4226 }; 4227 insertNNS(NNS); 4228 4229 CXXScopeSpec SS; 4230 while (!Qualifiers.empty()) { 4231 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4232 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4233 4234 switch (QNNS->getKind()) { 4235 case NestedNameSpecifier::Identifier: { 4236 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4237 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4238 ObjectType); 4239 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4240 SS, FirstQualifierInScope, false)) 4241 return NestedNameSpecifierLoc(); 4242 break; 4243 } 4244 4245 case NestedNameSpecifier::Namespace: { 4246 NamespaceDecl *NS = 4247 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4248 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4249 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4250 break; 4251 } 4252 4253 case NestedNameSpecifier::NamespaceAlias: { 4254 NamespaceAliasDecl *Alias = 4255 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4256 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4257 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4258 Q.getLocalEndLoc()); 4259 break; 4260 } 4261 4262 case NestedNameSpecifier::Global: 4263 // There is no meaningful transformation that one could perform on the 4264 // global scope. 4265 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4266 break; 4267 4268 case NestedNameSpecifier::Super: { 4269 CXXRecordDecl *RD = 4270 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4271 SourceLocation(), QNNS->getAsRecordDecl())); 4272 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4273 break; 4274 } 4275 4276 case NestedNameSpecifier::TypeSpecWithTemplate: 4277 case NestedNameSpecifier::TypeSpec: { 4278 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4279 FirstQualifierInScope, SS); 4280 4281 if (!TL) 4282 return NestedNameSpecifierLoc(); 4283 4284 QualType T = TL.getType(); 4285 if (T->isDependentType() || T->isRecordType() || 4286 (SemaRef.getLangOpts().CPlusPlus11 && T->isEnumeralType())) { 4287 if (T->isEnumeralType()) 4288 SemaRef.Diag(TL.getBeginLoc(), 4289 diag::warn_cxx98_compat_enum_nested_name_spec); 4290 4291 if (const auto ETL = TL.getAs<ElaboratedTypeLoc>()) { 4292 SS.Adopt(ETL.getQualifierLoc()); 4293 TL = ETL.getNamedTypeLoc(); 4294 } 4295 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4296 Q.getLocalEndLoc()); 4297 break; 4298 } 4299 // If the nested-name-specifier is an invalid type def, don't emit an 4300 // error because a previous error should have already been emitted. 4301 TypedefTypeLoc TTL = TL.getAsAdjusted<TypedefTypeLoc>(); 4302 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4303 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4304 << T << SS.getRange(); 4305 } 4306 return NestedNameSpecifierLoc(); 4307 } 4308 } 4309 4310 // The qualifier-in-scope and object type only apply to the leftmost entity. 4311 FirstQualifierInScope = nullptr; 4312 ObjectType = QualType(); 4313 } 4314 4315 // Don't rebuild the nested-name-specifier if we don't have to. 4316 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4317 !getDerived().AlwaysRebuild()) 4318 return NNS; 4319 4320 // If we can re-use the source-location data from the original 4321 // nested-name-specifier, do so. 4322 if (SS.location_size() == NNS.getDataLength() && 4323 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4324 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4325 4326 // Allocate new nested-name-specifier location information. 4327 return SS.getWithLocInContext(SemaRef.Context); 4328 } 4329 4330 template<typename Derived> 4331 DeclarationNameInfo 4332 TreeTransform<Derived> 4333 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4334 DeclarationName Name = NameInfo.getName(); 4335 if (!Name) 4336 return DeclarationNameInfo(); 4337 4338 switch (Name.getNameKind()) { 4339 case DeclarationName::Identifier: 4340 case DeclarationName::ObjCZeroArgSelector: 4341 case DeclarationName::ObjCOneArgSelector: 4342 case DeclarationName::ObjCMultiArgSelector: 4343 case DeclarationName::CXXOperatorName: 4344 case DeclarationName::CXXLiteralOperatorName: 4345 case DeclarationName::CXXUsingDirective: 4346 return NameInfo; 4347 4348 case DeclarationName::CXXDeductionGuideName: { 4349 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4350 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4351 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4352 if (!NewTemplate) 4353 return DeclarationNameInfo(); 4354 4355 DeclarationNameInfo NewNameInfo(NameInfo); 4356 NewNameInfo.setName( 4357 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4358 return NewNameInfo; 4359 } 4360 4361 case DeclarationName::CXXConstructorName: 4362 case DeclarationName::CXXDestructorName: 4363 case DeclarationName::CXXConversionFunctionName: { 4364 TypeSourceInfo *NewTInfo; 4365 CanQualType NewCanTy; 4366 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4367 NewTInfo = getDerived().TransformType(OldTInfo); 4368 if (!NewTInfo) 4369 return DeclarationNameInfo(); 4370 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4371 } 4372 else { 4373 NewTInfo = nullptr; 4374 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4375 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4376 if (NewT.isNull()) 4377 return DeclarationNameInfo(); 4378 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4379 } 4380 4381 DeclarationName NewName 4382 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4383 NewCanTy); 4384 DeclarationNameInfo NewNameInfo(NameInfo); 4385 NewNameInfo.setName(NewName); 4386 NewNameInfo.setNamedTypeInfo(NewTInfo); 4387 return NewNameInfo; 4388 } 4389 } 4390 4391 llvm_unreachable("Unknown name kind."); 4392 } 4393 4394 template<typename Derived> 4395 TemplateName 4396 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4397 TemplateName Name, 4398 SourceLocation NameLoc, 4399 QualType ObjectType, 4400 NamedDecl *FirstQualifierInScope, 4401 bool AllowInjectedClassName) { 4402 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4403 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl(); 4404 assert(Template && "qualified template name must refer to a template"); 4405 4406 TemplateDecl *TransTemplate 4407 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4408 Template)); 4409 if (!TransTemplate) 4410 return TemplateName(); 4411 4412 if (!getDerived().AlwaysRebuild() && 4413 SS.getScopeRep() == QTN->getQualifier() && 4414 TransTemplate == Template) 4415 return Name; 4416 4417 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4418 TransTemplate); 4419 } 4420 4421 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4422 if (SS.getScopeRep()) { 4423 // These apply to the scope specifier, not the template. 4424 ObjectType = QualType(); 4425 FirstQualifierInScope = nullptr; 4426 } 4427 4428 if (!getDerived().AlwaysRebuild() && 4429 SS.getScopeRep() == DTN->getQualifier() && 4430 ObjectType.isNull()) 4431 return Name; 4432 4433 // FIXME: Preserve the location of the "template" keyword. 4434 SourceLocation TemplateKWLoc = NameLoc; 4435 4436 if (DTN->isIdentifier()) { 4437 return getDerived().RebuildTemplateName(SS, 4438 TemplateKWLoc, 4439 *DTN->getIdentifier(), 4440 NameLoc, 4441 ObjectType, 4442 FirstQualifierInScope, 4443 AllowInjectedClassName); 4444 } 4445 4446 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4447 DTN->getOperator(), NameLoc, 4448 ObjectType, AllowInjectedClassName); 4449 } 4450 4451 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4452 TemplateDecl *TransTemplate 4453 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4454 Template)); 4455 if (!TransTemplate) 4456 return TemplateName(); 4457 4458 if (!getDerived().AlwaysRebuild() && 4459 TransTemplate == Template) 4460 return Name; 4461 4462 return TemplateName(TransTemplate); 4463 } 4464 4465 if (SubstTemplateTemplateParmPackStorage *SubstPack 4466 = Name.getAsSubstTemplateTemplateParmPack()) { 4467 return getDerived().RebuildTemplateName( 4468 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(), 4469 SubstPack->getIndex(), SubstPack->getFinal()); 4470 } 4471 4472 // These should be getting filtered out before they reach the AST. 4473 llvm_unreachable("overloaded function decl survived to here"); 4474 } 4475 4476 template<typename Derived> 4477 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4478 const TemplateArgument &Arg, 4479 TemplateArgumentLoc &Output) { 4480 Output = getSema().getTrivialTemplateArgumentLoc( 4481 Arg, QualType(), getDerived().getBaseLocation()); 4482 } 4483 4484 template <typename Derived> 4485 bool TreeTransform<Derived>::TransformTemplateArgument( 4486 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4487 bool Uneval) { 4488 const TemplateArgument &Arg = Input.getArgument(); 4489 switch (Arg.getKind()) { 4490 case TemplateArgument::Null: 4491 case TemplateArgument::Pack: 4492 llvm_unreachable("Unexpected TemplateArgument"); 4493 4494 case TemplateArgument::Integral: 4495 case TemplateArgument::NullPtr: 4496 case TemplateArgument::Declaration: { 4497 // Transform a resolved template argument straight to a resolved template 4498 // argument. We get here when substituting into an already-substituted 4499 // template type argument during concept satisfaction checking. 4500 QualType T = Arg.getNonTypeTemplateArgumentType(); 4501 QualType NewT = getDerived().TransformType(T); 4502 if (NewT.isNull()) 4503 return true; 4504 4505 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4506 ? Arg.getAsDecl() 4507 : nullptr; 4508 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4509 getDerived().getBaseLocation(), D)) 4510 : nullptr; 4511 if (D && !NewD) 4512 return true; 4513 4514 if (NewT == T && D == NewD) 4515 Output = Input; 4516 else if (Arg.getKind() == TemplateArgument::Integral) 4517 Output = TemplateArgumentLoc( 4518 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4519 TemplateArgumentLocInfo()); 4520 else if (Arg.getKind() == TemplateArgument::NullPtr) 4521 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4522 TemplateArgumentLocInfo()); 4523 else 4524 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4525 TemplateArgumentLocInfo()); 4526 4527 return false; 4528 } 4529 4530 case TemplateArgument::Type: { 4531 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4532 if (!DI) 4533 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4534 4535 DI = getDerived().TransformType(DI); 4536 if (!DI) 4537 return true; 4538 4539 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4540 return false; 4541 } 4542 4543 case TemplateArgument::Template: { 4544 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4545 if (QualifierLoc) { 4546 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4547 if (!QualifierLoc) 4548 return true; 4549 } 4550 4551 CXXScopeSpec SS; 4552 SS.Adopt(QualifierLoc); 4553 TemplateName Template = getDerived().TransformTemplateName( 4554 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4555 if (Template.isNull()) 4556 return true; 4557 4558 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4559 QualifierLoc, Input.getTemplateNameLoc()); 4560 return false; 4561 } 4562 4563 case TemplateArgument::TemplateExpansion: 4564 llvm_unreachable("Caller should expand pack expansions"); 4565 4566 case TemplateArgument::Expression: { 4567 // Template argument expressions are constant expressions. 4568 EnterExpressionEvaluationContext Unevaluated( 4569 getSema(), 4570 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4571 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4572 Sema::ReuseLambdaContextDecl, /*ExprContext=*/ 4573 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4574 4575 Expr *InputExpr = Input.getSourceExpression(); 4576 if (!InputExpr) 4577 InputExpr = Input.getArgument().getAsExpr(); 4578 4579 ExprResult E = getDerived().TransformExpr(InputExpr); 4580 E = SemaRef.ActOnConstantExpression(E); 4581 if (E.isInvalid()) 4582 return true; 4583 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4584 return false; 4585 } 4586 } 4587 4588 // Work around bogus GCC warning 4589 return true; 4590 } 4591 4592 /// Iterator adaptor that invents template argument location information 4593 /// for each of the template arguments in its underlying iterator. 4594 template<typename Derived, typename InputIterator> 4595 class TemplateArgumentLocInventIterator { 4596 TreeTransform<Derived> &Self; 4597 InputIterator Iter; 4598 4599 public: 4600 typedef TemplateArgumentLoc value_type; 4601 typedef TemplateArgumentLoc reference; 4602 typedef typename std::iterator_traits<InputIterator>::difference_type 4603 difference_type; 4604 typedef std::input_iterator_tag iterator_category; 4605 4606 class pointer { 4607 TemplateArgumentLoc Arg; 4608 4609 public: 4610 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4611 4612 const TemplateArgumentLoc *operator->() const { return &Arg; } 4613 }; 4614 4615 TemplateArgumentLocInventIterator() { } 4616 4617 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4618 InputIterator Iter) 4619 : Self(Self), Iter(Iter) { } 4620 4621 TemplateArgumentLocInventIterator &operator++() { 4622 ++Iter; 4623 return *this; 4624 } 4625 4626 TemplateArgumentLocInventIterator operator++(int) { 4627 TemplateArgumentLocInventIterator Old(*this); 4628 ++(*this); 4629 return Old; 4630 } 4631 4632 reference operator*() const { 4633 TemplateArgumentLoc Result; 4634 Self.InventTemplateArgumentLoc(*Iter, Result); 4635 return Result; 4636 } 4637 4638 pointer operator->() const { return pointer(**this); } 4639 4640 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4641 const TemplateArgumentLocInventIterator &Y) { 4642 return X.Iter == Y.Iter; 4643 } 4644 4645 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4646 const TemplateArgumentLocInventIterator &Y) { 4647 return X.Iter != Y.Iter; 4648 } 4649 }; 4650 4651 template<typename Derived> 4652 template<typename InputIterator> 4653 bool TreeTransform<Derived>::TransformTemplateArguments( 4654 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4655 bool Uneval) { 4656 for (; First != Last; ++First) { 4657 TemplateArgumentLoc Out; 4658 TemplateArgumentLoc In = *First; 4659 4660 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4661 // Unpack argument packs, which we translate them into separate 4662 // arguments. 4663 // FIXME: We could do much better if we could guarantee that the 4664 // TemplateArgumentLocInfo for the pack expansion would be usable for 4665 // all of the template arguments in the argument pack. 4666 typedef TemplateArgumentLocInventIterator<Derived, 4667 TemplateArgument::pack_iterator> 4668 PackLocIterator; 4669 if (TransformTemplateArguments(PackLocIterator(*this, 4670 In.getArgument().pack_begin()), 4671 PackLocIterator(*this, 4672 In.getArgument().pack_end()), 4673 Outputs, Uneval)) 4674 return true; 4675 4676 continue; 4677 } 4678 4679 if (In.getArgument().isPackExpansion()) { 4680 // We have a pack expansion, for which we will be substituting into 4681 // the pattern. 4682 SourceLocation Ellipsis; 4683 std::optional<unsigned> OrigNumExpansions; 4684 TemplateArgumentLoc Pattern 4685 = getSema().getTemplateArgumentPackExpansionPattern( 4686 In, Ellipsis, OrigNumExpansions); 4687 4688 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4689 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4690 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4691 4692 // Determine whether the set of unexpanded parameter packs can and should 4693 // be expanded. 4694 bool Expand = true; 4695 bool RetainExpansion = false; 4696 std::optional<unsigned> NumExpansions = OrigNumExpansions; 4697 if (getDerived().TryExpandParameterPacks(Ellipsis, 4698 Pattern.getSourceRange(), 4699 Unexpanded, 4700 Expand, 4701 RetainExpansion, 4702 NumExpansions)) 4703 return true; 4704 4705 if (!Expand) { 4706 // The transform has determined that we should perform a simple 4707 // transformation on the pack expansion, producing another pack 4708 // expansion. 4709 TemplateArgumentLoc OutPattern; 4710 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4711 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4712 return true; 4713 4714 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4715 NumExpansions); 4716 if (Out.getArgument().isNull()) 4717 return true; 4718 4719 Outputs.addArgument(Out); 4720 continue; 4721 } 4722 4723 // The transform has determined that we should perform an elementwise 4724 // expansion of the pattern. Do so. 4725 for (unsigned I = 0; I != *NumExpansions; ++I) { 4726 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4727 4728 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4729 return true; 4730 4731 if (Out.getArgument().containsUnexpandedParameterPack()) { 4732 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4733 OrigNumExpansions); 4734 if (Out.getArgument().isNull()) 4735 return true; 4736 } 4737 4738 Outputs.addArgument(Out); 4739 } 4740 4741 // If we're supposed to retain a pack expansion, do so by temporarily 4742 // forgetting the partially-substituted parameter pack. 4743 if (RetainExpansion) { 4744 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4745 4746 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4747 return true; 4748 4749 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4750 OrigNumExpansions); 4751 if (Out.getArgument().isNull()) 4752 return true; 4753 4754 Outputs.addArgument(Out); 4755 } 4756 4757 continue; 4758 } 4759 4760 // The simple case: 4761 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4762 return true; 4763 4764 Outputs.addArgument(Out); 4765 } 4766 4767 return false; 4768 4769 } 4770 4771 //===----------------------------------------------------------------------===// 4772 // Type transformation 4773 //===----------------------------------------------------------------------===// 4774 4775 template<typename Derived> 4776 QualType TreeTransform<Derived>::TransformType(QualType T) { 4777 if (getDerived().AlreadyTransformed(T)) 4778 return T; 4779 4780 // Temporary workaround. All of these transformations should 4781 // eventually turn into transformations on TypeLocs. 4782 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4783 getDerived().getBaseLocation()); 4784 4785 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4786 4787 if (!NewDI) 4788 return QualType(); 4789 4790 return NewDI->getType(); 4791 } 4792 4793 template<typename Derived> 4794 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4795 // Refine the base location to the type's location. 4796 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4797 getDerived().getBaseEntity()); 4798 if (getDerived().AlreadyTransformed(DI->getType())) 4799 return DI; 4800 4801 TypeLocBuilder TLB; 4802 4803 TypeLoc TL = DI->getTypeLoc(); 4804 TLB.reserve(TL.getFullDataSize()); 4805 4806 QualType Result = getDerived().TransformType(TLB, TL); 4807 if (Result.isNull()) 4808 return nullptr; 4809 4810 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4811 } 4812 4813 template<typename Derived> 4814 QualType 4815 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4816 switch (T.getTypeLocClass()) { 4817 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4818 #define TYPELOC(CLASS, PARENT) \ 4819 case TypeLoc::CLASS: \ 4820 return getDerived().Transform##CLASS##Type(TLB, \ 4821 T.castAs<CLASS##TypeLoc>()); 4822 #include "clang/AST/TypeLocNodes.def" 4823 } 4824 4825 llvm_unreachable("unhandled type loc!"); 4826 } 4827 4828 template<typename Derived> 4829 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4830 if (!isa<DependentNameType>(T)) 4831 return TransformType(T); 4832 4833 if (getDerived().AlreadyTransformed(T)) 4834 return T; 4835 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4836 getDerived().getBaseLocation()); 4837 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4838 return NewDI ? NewDI->getType() : QualType(); 4839 } 4840 4841 template<typename Derived> 4842 TypeSourceInfo * 4843 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4844 if (!isa<DependentNameType>(DI->getType())) 4845 return TransformType(DI); 4846 4847 // Refine the base location to the type's location. 4848 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4849 getDerived().getBaseEntity()); 4850 if (getDerived().AlreadyTransformed(DI->getType())) 4851 return DI; 4852 4853 TypeLocBuilder TLB; 4854 4855 TypeLoc TL = DI->getTypeLoc(); 4856 TLB.reserve(TL.getFullDataSize()); 4857 4858 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4859 if (QTL) 4860 TL = QTL.getUnqualifiedLoc(); 4861 4862 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4863 4864 QualType Result = getDerived().TransformDependentNameType( 4865 TLB, DNTL, /*DeducedTSTContext*/true); 4866 if (Result.isNull()) 4867 return nullptr; 4868 4869 if (QTL) { 4870 Result = getDerived().RebuildQualifiedType(Result, QTL); 4871 if (Result.isNull()) 4872 return nullptr; 4873 TLB.TypeWasModifiedSafely(Result); 4874 } 4875 4876 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4877 } 4878 4879 template<typename Derived> 4880 QualType 4881 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4882 QualifiedTypeLoc T) { 4883 QualType Result; 4884 TypeLoc UnqualTL = T.getUnqualifiedLoc(); 4885 auto SuppressObjCLifetime = 4886 T.getType().getLocalQualifiers().hasObjCLifetime(); 4887 if (auto TTP = UnqualTL.getAs<TemplateTypeParmTypeLoc>()) { 4888 Result = getDerived().TransformTemplateTypeParmType(TLB, TTP, 4889 SuppressObjCLifetime); 4890 } else if (auto STTP = UnqualTL.getAs<SubstTemplateTypeParmPackTypeLoc>()) { 4891 Result = getDerived().TransformSubstTemplateTypeParmPackType( 4892 TLB, STTP, SuppressObjCLifetime); 4893 } else { 4894 Result = getDerived().TransformType(TLB, UnqualTL); 4895 } 4896 4897 if (Result.isNull()) 4898 return QualType(); 4899 4900 Result = getDerived().RebuildQualifiedType(Result, T); 4901 4902 if (Result.isNull()) 4903 return QualType(); 4904 4905 // RebuildQualifiedType might have updated the type, but not in a way 4906 // that invalidates the TypeLoc. (There's no location information for 4907 // qualifiers.) 4908 TLB.TypeWasModifiedSafely(Result); 4909 4910 return Result; 4911 } 4912 4913 template <typename Derived> 4914 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4915 QualifiedTypeLoc TL) { 4916 4917 SourceLocation Loc = TL.getBeginLoc(); 4918 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4919 4920 if ((T.getAddressSpace() != LangAS::Default && 4921 Quals.getAddressSpace() != LangAS::Default) && 4922 T.getAddressSpace() != Quals.getAddressSpace()) { 4923 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4924 << TL.getType() << T; 4925 return QualType(); 4926 } 4927 4928 // C++ [dcl.fct]p7: 4929 // [When] adding cv-qualifications on top of the function type [...] the 4930 // cv-qualifiers are ignored. 4931 if (T->isFunctionType()) { 4932 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4933 Quals.getAddressSpace()); 4934 return T; 4935 } 4936 4937 // C++ [dcl.ref]p1: 4938 // when the cv-qualifiers are introduced through the use of a typedef-name 4939 // or decltype-specifier [...] the cv-qualifiers are ignored. 4940 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4941 // applied to a reference type. 4942 if (T->isReferenceType()) { 4943 // The only qualifier that applies to a reference type is restrict. 4944 if (!Quals.hasRestrict()) 4945 return T; 4946 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4947 } 4948 4949 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4950 // resulting type. 4951 if (Quals.hasObjCLifetime()) { 4952 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4953 Quals.removeObjCLifetime(); 4954 else if (T.getObjCLifetime()) { 4955 // Objective-C ARC: 4956 // A lifetime qualifier applied to a substituted template parameter 4957 // overrides the lifetime qualifier from the template argument. 4958 const AutoType *AutoTy; 4959 if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4960 // 'auto' types behave the same way as template parameters. 4961 QualType Deduced = AutoTy->getDeducedType(); 4962 Qualifiers Qs = Deduced.getQualifiers(); 4963 Qs.removeObjCLifetime(); 4964 Deduced = 4965 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4966 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4967 AutoTy->isDependentType(), 4968 /*isPack=*/false, 4969 AutoTy->getTypeConstraintConcept(), 4970 AutoTy->getTypeConstraintArguments()); 4971 } else { 4972 // Otherwise, complain about the addition of a qualifier to an 4973 // already-qualified type. 4974 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4975 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4976 Quals.removeObjCLifetime(); 4977 } 4978 } 4979 } 4980 4981 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4982 } 4983 4984 template<typename Derived> 4985 TypeLoc 4986 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4987 QualType ObjectType, 4988 NamedDecl *UnqualLookup, 4989 CXXScopeSpec &SS) { 4990 if (getDerived().AlreadyTransformed(TL.getType())) 4991 return TL; 4992 4993 TypeSourceInfo *TSI = 4994 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4995 if (TSI) 4996 return TSI->getTypeLoc(); 4997 return TypeLoc(); 4998 } 4999 5000 template<typename Derived> 5001 TypeSourceInfo * 5002 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 5003 QualType ObjectType, 5004 NamedDecl *UnqualLookup, 5005 CXXScopeSpec &SS) { 5006 if (getDerived().AlreadyTransformed(TSInfo->getType())) 5007 return TSInfo; 5008 5009 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 5010 UnqualLookup, SS); 5011 } 5012 5013 template <typename Derived> 5014 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 5015 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 5016 CXXScopeSpec &SS) { 5017 QualType T = TL.getType(); 5018 assert(!getDerived().AlreadyTransformed(T)); 5019 5020 TypeLocBuilder TLB; 5021 QualType Result; 5022 5023 if (isa<TemplateSpecializationType>(T)) { 5024 TemplateSpecializationTypeLoc SpecTL = 5025 TL.castAs<TemplateSpecializationTypeLoc>(); 5026 5027 TemplateName Template = getDerived().TransformTemplateName( 5028 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 5029 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 5030 if (Template.isNull()) 5031 return nullptr; 5032 5033 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 5034 Template); 5035 } else if (isa<DependentTemplateSpecializationType>(T)) { 5036 DependentTemplateSpecializationTypeLoc SpecTL = 5037 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 5038 5039 TemplateName Template 5040 = getDerived().RebuildTemplateName(SS, 5041 SpecTL.getTemplateKeywordLoc(), 5042 *SpecTL.getTypePtr()->getIdentifier(), 5043 SpecTL.getTemplateNameLoc(), 5044 ObjectType, UnqualLookup, 5045 /*AllowInjectedClassName*/true); 5046 if (Template.isNull()) 5047 return nullptr; 5048 5049 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 5050 SpecTL, 5051 Template, 5052 SS); 5053 } else { 5054 // Nothing special needs to be done for these. 5055 Result = getDerived().TransformType(TLB, TL); 5056 } 5057 5058 if (Result.isNull()) 5059 return nullptr; 5060 5061 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 5062 } 5063 5064 template <class TyLoc> static inline 5065 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 5066 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 5067 NewT.setNameLoc(T.getNameLoc()); 5068 return T.getType(); 5069 } 5070 5071 template<typename Derived> 5072 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 5073 BuiltinTypeLoc T) { 5074 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 5075 NewT.setBuiltinLoc(T.getBuiltinLoc()); 5076 if (T.needsExtraLocalData()) 5077 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 5078 return T.getType(); 5079 } 5080 5081 template<typename Derived> 5082 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 5083 ComplexTypeLoc T) { 5084 // FIXME: recurse? 5085 return TransformTypeSpecType(TLB, T); 5086 } 5087 5088 template <typename Derived> 5089 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 5090 AdjustedTypeLoc TL) { 5091 // Adjustments applied during transformation are handled elsewhere. 5092 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 5093 } 5094 5095 template<typename Derived> 5096 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 5097 DecayedTypeLoc TL) { 5098 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 5099 if (OriginalType.isNull()) 5100 return QualType(); 5101 5102 QualType Result = TL.getType(); 5103 if (getDerived().AlwaysRebuild() || 5104 OriginalType != TL.getOriginalLoc().getType()) 5105 Result = SemaRef.Context.getDecayedType(OriginalType); 5106 TLB.push<DecayedTypeLoc>(Result); 5107 // Nothing to set for DecayedTypeLoc. 5108 return Result; 5109 } 5110 5111 template<typename Derived> 5112 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 5113 PointerTypeLoc TL) { 5114 QualType PointeeType 5115 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5116 if (PointeeType.isNull()) 5117 return QualType(); 5118 5119 QualType Result = TL.getType(); 5120 if (PointeeType->getAs<ObjCObjectType>()) { 5121 // A dependent pointer type 'T *' has is being transformed such 5122 // that an Objective-C class type is being replaced for 'T'. The 5123 // resulting pointer type is an ObjCObjectPointerType, not a 5124 // PointerType. 5125 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5126 5127 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5128 NewT.setStarLoc(TL.getStarLoc()); 5129 return Result; 5130 } 5131 5132 if (getDerived().AlwaysRebuild() || 5133 PointeeType != TL.getPointeeLoc().getType()) { 5134 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5135 if (Result.isNull()) 5136 return QualType(); 5137 } 5138 5139 // Objective-C ARC can add lifetime qualifiers to the type that we're 5140 // pointing to. 5141 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5142 5143 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5144 NewT.setSigilLoc(TL.getSigilLoc()); 5145 return Result; 5146 } 5147 5148 template<typename Derived> 5149 QualType 5150 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5151 BlockPointerTypeLoc TL) { 5152 QualType PointeeType 5153 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5154 if (PointeeType.isNull()) 5155 return QualType(); 5156 5157 QualType Result = TL.getType(); 5158 if (getDerived().AlwaysRebuild() || 5159 PointeeType != TL.getPointeeLoc().getType()) { 5160 Result = getDerived().RebuildBlockPointerType(PointeeType, 5161 TL.getSigilLoc()); 5162 if (Result.isNull()) 5163 return QualType(); 5164 } 5165 5166 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5167 NewT.setSigilLoc(TL.getSigilLoc()); 5168 return Result; 5169 } 5170 5171 /// Transforms a reference type. Note that somewhat paradoxically we 5172 /// don't care whether the type itself is an l-value type or an r-value 5173 /// type; we only care if the type was *written* as an l-value type 5174 /// or an r-value type. 5175 template<typename Derived> 5176 QualType 5177 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5178 ReferenceTypeLoc TL) { 5179 const ReferenceType *T = TL.getTypePtr(); 5180 5181 // Note that this works with the pointee-as-written. 5182 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5183 if (PointeeType.isNull()) 5184 return QualType(); 5185 5186 QualType Result = TL.getType(); 5187 if (getDerived().AlwaysRebuild() || 5188 PointeeType != T->getPointeeTypeAsWritten()) { 5189 Result = getDerived().RebuildReferenceType(PointeeType, 5190 T->isSpelledAsLValue(), 5191 TL.getSigilLoc()); 5192 if (Result.isNull()) 5193 return QualType(); 5194 } 5195 5196 // Objective-C ARC can add lifetime qualifiers to the type that we're 5197 // referring to. 5198 TLB.TypeWasModifiedSafely( 5199 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5200 5201 // r-value references can be rebuilt as l-value references. 5202 ReferenceTypeLoc NewTL; 5203 if (isa<LValueReferenceType>(Result)) 5204 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5205 else 5206 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5207 NewTL.setSigilLoc(TL.getSigilLoc()); 5208 5209 return Result; 5210 } 5211 5212 template<typename Derived> 5213 QualType 5214 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5215 LValueReferenceTypeLoc TL) { 5216 return TransformReferenceType(TLB, TL); 5217 } 5218 5219 template<typename Derived> 5220 QualType 5221 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5222 RValueReferenceTypeLoc TL) { 5223 return TransformReferenceType(TLB, TL); 5224 } 5225 5226 template<typename Derived> 5227 QualType 5228 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5229 MemberPointerTypeLoc TL) { 5230 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5231 if (PointeeType.isNull()) 5232 return QualType(); 5233 5234 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5235 TypeSourceInfo *NewClsTInfo = nullptr; 5236 if (OldClsTInfo) { 5237 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5238 if (!NewClsTInfo) 5239 return QualType(); 5240 } 5241 5242 const MemberPointerType *T = TL.getTypePtr(); 5243 QualType OldClsType = QualType(T->getClass(), 0); 5244 QualType NewClsType; 5245 if (NewClsTInfo) 5246 NewClsType = NewClsTInfo->getType(); 5247 else { 5248 NewClsType = getDerived().TransformType(OldClsType); 5249 if (NewClsType.isNull()) 5250 return QualType(); 5251 } 5252 5253 QualType Result = TL.getType(); 5254 if (getDerived().AlwaysRebuild() || 5255 PointeeType != T->getPointeeType() || 5256 NewClsType != OldClsType) { 5257 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5258 TL.getStarLoc()); 5259 if (Result.isNull()) 5260 return QualType(); 5261 } 5262 5263 // If we had to adjust the pointee type when building a member pointer, make 5264 // sure to push TypeLoc info for it. 5265 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5266 if (MPT && PointeeType != MPT->getPointeeType()) { 5267 assert(isa<AdjustedType>(MPT->getPointeeType())); 5268 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5269 } 5270 5271 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5272 NewTL.setSigilLoc(TL.getSigilLoc()); 5273 NewTL.setClassTInfo(NewClsTInfo); 5274 5275 return Result; 5276 } 5277 5278 template<typename Derived> 5279 QualType 5280 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5281 ConstantArrayTypeLoc TL) { 5282 const ConstantArrayType *T = TL.getTypePtr(); 5283 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5284 if (ElementType.isNull()) 5285 return QualType(); 5286 5287 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5288 Expr *OldSize = TL.getSizeExpr(); 5289 if (!OldSize) 5290 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5291 Expr *NewSize = nullptr; 5292 if (OldSize) { 5293 EnterExpressionEvaluationContext Unevaluated( 5294 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5295 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5296 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5297 } 5298 5299 QualType Result = TL.getType(); 5300 if (getDerived().AlwaysRebuild() || 5301 ElementType != T->getElementType() || 5302 (T->getSizeExpr() && NewSize != OldSize)) { 5303 Result = getDerived().RebuildConstantArrayType(ElementType, 5304 T->getSizeModifier(), 5305 T->getSize(), NewSize, 5306 T->getIndexTypeCVRQualifiers(), 5307 TL.getBracketsRange()); 5308 if (Result.isNull()) 5309 return QualType(); 5310 } 5311 5312 // We might have either a ConstantArrayType or a VariableArrayType now: 5313 // a ConstantArrayType is allowed to have an element type which is a 5314 // VariableArrayType if the type is dependent. Fortunately, all array 5315 // types have the same location layout. 5316 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5317 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5318 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5319 NewTL.setSizeExpr(NewSize); 5320 5321 return Result; 5322 } 5323 5324 template<typename Derived> 5325 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5326 TypeLocBuilder &TLB, 5327 IncompleteArrayTypeLoc TL) { 5328 const IncompleteArrayType *T = TL.getTypePtr(); 5329 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5330 if (ElementType.isNull()) 5331 return QualType(); 5332 5333 QualType Result = TL.getType(); 5334 if (getDerived().AlwaysRebuild() || 5335 ElementType != T->getElementType()) { 5336 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5337 T->getSizeModifier(), 5338 T->getIndexTypeCVRQualifiers(), 5339 TL.getBracketsRange()); 5340 if (Result.isNull()) 5341 return QualType(); 5342 } 5343 5344 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5345 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5346 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5347 NewTL.setSizeExpr(nullptr); 5348 5349 return Result; 5350 } 5351 5352 template<typename Derived> 5353 QualType 5354 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5355 VariableArrayTypeLoc TL) { 5356 const VariableArrayType *T = TL.getTypePtr(); 5357 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5358 if (ElementType.isNull()) 5359 return QualType(); 5360 5361 ExprResult SizeResult; 5362 { 5363 EnterExpressionEvaluationContext Context( 5364 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5365 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5366 } 5367 if (SizeResult.isInvalid()) 5368 return QualType(); 5369 SizeResult = 5370 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5371 if (SizeResult.isInvalid()) 5372 return QualType(); 5373 5374 Expr *Size = SizeResult.get(); 5375 5376 QualType Result = TL.getType(); 5377 if (getDerived().AlwaysRebuild() || 5378 ElementType != T->getElementType() || 5379 Size != T->getSizeExpr()) { 5380 Result = getDerived().RebuildVariableArrayType(ElementType, 5381 T->getSizeModifier(), 5382 Size, 5383 T->getIndexTypeCVRQualifiers(), 5384 TL.getBracketsRange()); 5385 if (Result.isNull()) 5386 return QualType(); 5387 } 5388 5389 // We might have constant size array now, but fortunately it has the same 5390 // location layout. 5391 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5392 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5393 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5394 NewTL.setSizeExpr(Size); 5395 5396 return Result; 5397 } 5398 5399 template<typename Derived> 5400 QualType 5401 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5402 DependentSizedArrayTypeLoc TL) { 5403 const DependentSizedArrayType *T = TL.getTypePtr(); 5404 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5405 if (ElementType.isNull()) 5406 return QualType(); 5407 5408 // Array bounds are constant expressions. 5409 EnterExpressionEvaluationContext Unevaluated( 5410 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5411 5412 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5413 Expr *origSize = TL.getSizeExpr(); 5414 if (!origSize) origSize = T->getSizeExpr(); 5415 5416 ExprResult sizeResult 5417 = getDerived().TransformExpr(origSize); 5418 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5419 if (sizeResult.isInvalid()) 5420 return QualType(); 5421 5422 Expr *size = sizeResult.get(); 5423 5424 QualType Result = TL.getType(); 5425 if (getDerived().AlwaysRebuild() || 5426 ElementType != T->getElementType() || 5427 size != origSize) { 5428 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5429 T->getSizeModifier(), 5430 size, 5431 T->getIndexTypeCVRQualifiers(), 5432 TL.getBracketsRange()); 5433 if (Result.isNull()) 5434 return QualType(); 5435 } 5436 5437 // We might have any sort of array type now, but fortunately they 5438 // all have the same location layout. 5439 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5440 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5441 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5442 NewTL.setSizeExpr(size); 5443 5444 return Result; 5445 } 5446 5447 template <typename Derived> 5448 QualType TreeTransform<Derived>::TransformDependentVectorType( 5449 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5450 const DependentVectorType *T = TL.getTypePtr(); 5451 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5452 if (ElementType.isNull()) 5453 return QualType(); 5454 5455 EnterExpressionEvaluationContext Unevaluated( 5456 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5457 5458 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5459 Size = SemaRef.ActOnConstantExpression(Size); 5460 if (Size.isInvalid()) 5461 return QualType(); 5462 5463 QualType Result = TL.getType(); 5464 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5465 Size.get() != T->getSizeExpr()) { 5466 Result = getDerived().RebuildDependentVectorType( 5467 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5468 if (Result.isNull()) 5469 return QualType(); 5470 } 5471 5472 // Result might be dependent or not. 5473 if (isa<DependentVectorType>(Result)) { 5474 DependentVectorTypeLoc NewTL = 5475 TLB.push<DependentVectorTypeLoc>(Result); 5476 NewTL.setNameLoc(TL.getNameLoc()); 5477 } else { 5478 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5479 NewTL.setNameLoc(TL.getNameLoc()); 5480 } 5481 5482 return Result; 5483 } 5484 5485 template<typename Derived> 5486 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5487 TypeLocBuilder &TLB, 5488 DependentSizedExtVectorTypeLoc TL) { 5489 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5490 5491 // FIXME: ext vector locs should be nested 5492 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5493 if (ElementType.isNull()) 5494 return QualType(); 5495 5496 // Vector sizes are constant expressions. 5497 EnterExpressionEvaluationContext Unevaluated( 5498 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5499 5500 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5501 Size = SemaRef.ActOnConstantExpression(Size); 5502 if (Size.isInvalid()) 5503 return QualType(); 5504 5505 QualType Result = TL.getType(); 5506 if (getDerived().AlwaysRebuild() || 5507 ElementType != T->getElementType() || 5508 Size.get() != T->getSizeExpr()) { 5509 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5510 Size.get(), 5511 T->getAttributeLoc()); 5512 if (Result.isNull()) 5513 return QualType(); 5514 } 5515 5516 // Result might be dependent or not. 5517 if (isa<DependentSizedExtVectorType>(Result)) { 5518 DependentSizedExtVectorTypeLoc NewTL 5519 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5520 NewTL.setNameLoc(TL.getNameLoc()); 5521 } else { 5522 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5523 NewTL.setNameLoc(TL.getNameLoc()); 5524 } 5525 5526 return Result; 5527 } 5528 5529 template <typename Derived> 5530 QualType 5531 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5532 ConstantMatrixTypeLoc TL) { 5533 const ConstantMatrixType *T = TL.getTypePtr(); 5534 QualType ElementType = getDerived().TransformType(T->getElementType()); 5535 if (ElementType.isNull()) 5536 return QualType(); 5537 5538 QualType Result = TL.getType(); 5539 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5540 Result = getDerived().RebuildConstantMatrixType( 5541 ElementType, T->getNumRows(), T->getNumColumns()); 5542 if (Result.isNull()) 5543 return QualType(); 5544 } 5545 5546 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5547 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5548 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5549 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5550 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5551 5552 return Result; 5553 } 5554 5555 template <typename Derived> 5556 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5557 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5558 const DependentSizedMatrixType *T = TL.getTypePtr(); 5559 5560 QualType ElementType = getDerived().TransformType(T->getElementType()); 5561 if (ElementType.isNull()) { 5562 return QualType(); 5563 } 5564 5565 // Matrix dimensions are constant expressions. 5566 EnterExpressionEvaluationContext Unevaluated( 5567 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5568 5569 Expr *origRows = TL.getAttrRowOperand(); 5570 if (!origRows) 5571 origRows = T->getRowExpr(); 5572 Expr *origColumns = TL.getAttrColumnOperand(); 5573 if (!origColumns) 5574 origColumns = T->getColumnExpr(); 5575 5576 ExprResult rowResult = getDerived().TransformExpr(origRows); 5577 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5578 if (rowResult.isInvalid()) 5579 return QualType(); 5580 5581 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5582 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5583 if (columnResult.isInvalid()) 5584 return QualType(); 5585 5586 Expr *rows = rowResult.get(); 5587 Expr *columns = columnResult.get(); 5588 5589 QualType Result = TL.getType(); 5590 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5591 rows != origRows || columns != origColumns) { 5592 Result = getDerived().RebuildDependentSizedMatrixType( 5593 ElementType, rows, columns, T->getAttributeLoc()); 5594 5595 if (Result.isNull()) 5596 return QualType(); 5597 } 5598 5599 // We might have any sort of matrix type now, but fortunately they 5600 // all have the same location layout. 5601 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5602 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5603 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5604 NewTL.setAttrRowOperand(rows); 5605 NewTL.setAttrColumnOperand(columns); 5606 return Result; 5607 } 5608 5609 template <typename Derived> 5610 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5611 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5612 const DependentAddressSpaceType *T = TL.getTypePtr(); 5613 5614 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5615 5616 if (pointeeType.isNull()) 5617 return QualType(); 5618 5619 // Address spaces are constant expressions. 5620 EnterExpressionEvaluationContext Unevaluated( 5621 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5622 5623 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5624 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5625 if (AddrSpace.isInvalid()) 5626 return QualType(); 5627 5628 QualType Result = TL.getType(); 5629 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5630 AddrSpace.get() != T->getAddrSpaceExpr()) { 5631 Result = getDerived().RebuildDependentAddressSpaceType( 5632 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5633 if (Result.isNull()) 5634 return QualType(); 5635 } 5636 5637 // Result might be dependent or not. 5638 if (isa<DependentAddressSpaceType>(Result)) { 5639 DependentAddressSpaceTypeLoc NewTL = 5640 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5641 5642 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5643 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5644 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5645 5646 } else { 5647 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5648 Result, getDerived().getBaseLocation()); 5649 TransformType(TLB, DI->getTypeLoc()); 5650 } 5651 5652 return Result; 5653 } 5654 5655 template <typename Derived> 5656 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5657 VectorTypeLoc TL) { 5658 const VectorType *T = TL.getTypePtr(); 5659 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5660 if (ElementType.isNull()) 5661 return QualType(); 5662 5663 QualType Result = TL.getType(); 5664 if (getDerived().AlwaysRebuild() || 5665 ElementType != T->getElementType()) { 5666 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5667 T->getVectorKind()); 5668 if (Result.isNull()) 5669 return QualType(); 5670 } 5671 5672 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5673 NewTL.setNameLoc(TL.getNameLoc()); 5674 5675 return Result; 5676 } 5677 5678 template<typename Derived> 5679 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5680 ExtVectorTypeLoc TL) { 5681 const VectorType *T = TL.getTypePtr(); 5682 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5683 if (ElementType.isNull()) 5684 return QualType(); 5685 5686 QualType Result = TL.getType(); 5687 if (getDerived().AlwaysRebuild() || 5688 ElementType != T->getElementType()) { 5689 Result = getDerived().RebuildExtVectorType(ElementType, 5690 T->getNumElements(), 5691 /*FIXME*/ SourceLocation()); 5692 if (Result.isNull()) 5693 return QualType(); 5694 } 5695 5696 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5697 NewTL.setNameLoc(TL.getNameLoc()); 5698 5699 return Result; 5700 } 5701 5702 template <typename Derived> 5703 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5704 ParmVarDecl *OldParm, int indexAdjustment, 5705 std::optional<unsigned> NumExpansions, bool ExpectParameterPack) { 5706 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5707 TypeSourceInfo *NewDI = nullptr; 5708 5709 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5710 // If we're substituting into a pack expansion type and we know the 5711 // length we want to expand to, just substitute for the pattern. 5712 TypeLoc OldTL = OldDI->getTypeLoc(); 5713 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5714 5715 TypeLocBuilder TLB; 5716 TypeLoc NewTL = OldDI->getTypeLoc(); 5717 TLB.reserve(NewTL.getFullDataSize()); 5718 5719 QualType Result = getDerived().TransformType(TLB, 5720 OldExpansionTL.getPatternLoc()); 5721 if (Result.isNull()) 5722 return nullptr; 5723 5724 Result = RebuildPackExpansionType(Result, 5725 OldExpansionTL.getPatternLoc().getSourceRange(), 5726 OldExpansionTL.getEllipsisLoc(), 5727 NumExpansions); 5728 if (Result.isNull()) 5729 return nullptr; 5730 5731 PackExpansionTypeLoc NewExpansionTL 5732 = TLB.push<PackExpansionTypeLoc>(Result); 5733 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5734 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5735 } else 5736 NewDI = getDerived().TransformType(OldDI); 5737 if (!NewDI) 5738 return nullptr; 5739 5740 if (NewDI == OldDI && indexAdjustment == 0) 5741 return OldParm; 5742 5743 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5744 OldParm->getDeclContext(), 5745 OldParm->getInnerLocStart(), 5746 OldParm->getLocation(), 5747 OldParm->getIdentifier(), 5748 NewDI->getType(), 5749 NewDI, 5750 OldParm->getStorageClass(), 5751 /* DefArg */ nullptr); 5752 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5753 OldParm->getFunctionScopeIndex() + indexAdjustment); 5754 transformedLocalDecl(OldParm, {newParm}); 5755 return newParm; 5756 } 5757 5758 template <typename Derived> 5759 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5760 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5761 const QualType *ParamTypes, 5762 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5763 SmallVectorImpl<QualType> &OutParamTypes, 5764 SmallVectorImpl<ParmVarDecl *> *PVars, 5765 Sema::ExtParameterInfoBuilder &PInfos, 5766 unsigned *LastParamTransformed) { 5767 int indexAdjustment = 0; 5768 5769 unsigned NumParams = Params.size(); 5770 for (unsigned i = 0; i != NumParams; ++i) { 5771 if (LastParamTransformed) 5772 *LastParamTransformed = i; 5773 if (ParmVarDecl *OldParm = Params[i]) { 5774 assert(OldParm->getFunctionScopeIndex() == i); 5775 5776 std::optional<unsigned> NumExpansions; 5777 ParmVarDecl *NewParm = nullptr; 5778 if (OldParm->isParameterPack()) { 5779 // We have a function parameter pack that may need to be expanded. 5780 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5781 5782 // Find the parameter packs that could be expanded. 5783 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5784 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5785 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5786 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5787 5788 // Determine whether we should expand the parameter packs. 5789 bool ShouldExpand = false; 5790 bool RetainExpansion = false; 5791 std::optional<unsigned> OrigNumExpansions; 5792 if (Unexpanded.size() > 0) { 5793 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5794 NumExpansions = OrigNumExpansions; 5795 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5796 Pattern.getSourceRange(), 5797 Unexpanded, 5798 ShouldExpand, 5799 RetainExpansion, 5800 NumExpansions)) { 5801 return true; 5802 } 5803 } else { 5804 #ifndef NDEBUG 5805 const AutoType *AT = 5806 Pattern.getType().getTypePtr()->getContainedAutoType(); 5807 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5808 "Could not find parameter packs or undeduced auto type!"); 5809 #endif 5810 } 5811 5812 if (ShouldExpand) { 5813 // Expand the function parameter pack into multiple, separate 5814 // parameters. 5815 getDerived().ExpandingFunctionParameterPack(OldParm); 5816 for (unsigned I = 0; I != *NumExpansions; ++I) { 5817 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5818 ParmVarDecl *NewParm 5819 = getDerived().TransformFunctionTypeParam(OldParm, 5820 indexAdjustment++, 5821 OrigNumExpansions, 5822 /*ExpectParameterPack=*/false); 5823 if (!NewParm) 5824 return true; 5825 5826 if (ParamInfos) 5827 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5828 OutParamTypes.push_back(NewParm->getType()); 5829 if (PVars) 5830 PVars->push_back(NewParm); 5831 } 5832 5833 // If we're supposed to retain a pack expansion, do so by temporarily 5834 // forgetting the partially-substituted parameter pack. 5835 if (RetainExpansion) { 5836 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5837 ParmVarDecl *NewParm 5838 = getDerived().TransformFunctionTypeParam(OldParm, 5839 indexAdjustment++, 5840 OrigNumExpansions, 5841 /*ExpectParameterPack=*/false); 5842 if (!NewParm) 5843 return true; 5844 5845 if (ParamInfos) 5846 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5847 OutParamTypes.push_back(NewParm->getType()); 5848 if (PVars) 5849 PVars->push_back(NewParm); 5850 } 5851 5852 // The next parameter should have the same adjustment as the 5853 // last thing we pushed, but we post-incremented indexAdjustment 5854 // on every push. Also, if we push nothing, the adjustment should 5855 // go down by one. 5856 indexAdjustment--; 5857 5858 // We're done with the pack expansion. 5859 continue; 5860 } 5861 5862 // We'll substitute the parameter now without expanding the pack 5863 // expansion. 5864 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5865 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5866 indexAdjustment, 5867 NumExpansions, 5868 /*ExpectParameterPack=*/true); 5869 assert(NewParm->isParameterPack() && 5870 "Parameter pack no longer a parameter pack after " 5871 "transformation."); 5872 } else { 5873 NewParm = getDerived().TransformFunctionTypeParam( 5874 OldParm, indexAdjustment, std::nullopt, 5875 /*ExpectParameterPack=*/false); 5876 } 5877 5878 if (!NewParm) 5879 return true; 5880 5881 if (ParamInfos) 5882 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5883 OutParamTypes.push_back(NewParm->getType()); 5884 if (PVars) 5885 PVars->push_back(NewParm); 5886 continue; 5887 } 5888 5889 // Deal with the possibility that we don't have a parameter 5890 // declaration for this parameter. 5891 assert(ParamTypes); 5892 QualType OldType = ParamTypes[i]; 5893 bool IsPackExpansion = false; 5894 std::optional<unsigned> NumExpansions; 5895 QualType NewType; 5896 if (const PackExpansionType *Expansion 5897 = dyn_cast<PackExpansionType>(OldType)) { 5898 // We have a function parameter pack that may need to be expanded. 5899 QualType Pattern = Expansion->getPattern(); 5900 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5901 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5902 5903 // Determine whether we should expand the parameter packs. 5904 bool ShouldExpand = false; 5905 bool RetainExpansion = false; 5906 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5907 Unexpanded, 5908 ShouldExpand, 5909 RetainExpansion, 5910 NumExpansions)) { 5911 return true; 5912 } 5913 5914 if (ShouldExpand) { 5915 // Expand the function parameter pack into multiple, separate 5916 // parameters. 5917 for (unsigned I = 0; I != *NumExpansions; ++I) { 5918 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5919 QualType NewType = getDerived().TransformType(Pattern); 5920 if (NewType.isNull()) 5921 return true; 5922 5923 if (NewType->containsUnexpandedParameterPack()) { 5924 NewType = getSema().getASTContext().getPackExpansionType( 5925 NewType, std::nullopt); 5926 5927 if (NewType.isNull()) 5928 return true; 5929 } 5930 5931 if (ParamInfos) 5932 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5933 OutParamTypes.push_back(NewType); 5934 if (PVars) 5935 PVars->push_back(nullptr); 5936 } 5937 5938 // We're done with the pack expansion. 5939 continue; 5940 } 5941 5942 // If we're supposed to retain a pack expansion, do so by temporarily 5943 // forgetting the partially-substituted parameter pack. 5944 if (RetainExpansion) { 5945 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5946 QualType NewType = getDerived().TransformType(Pattern); 5947 if (NewType.isNull()) 5948 return true; 5949 5950 if (ParamInfos) 5951 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5952 OutParamTypes.push_back(NewType); 5953 if (PVars) 5954 PVars->push_back(nullptr); 5955 } 5956 5957 // We'll substitute the parameter now without expanding the pack 5958 // expansion. 5959 OldType = Expansion->getPattern(); 5960 IsPackExpansion = true; 5961 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5962 NewType = getDerived().TransformType(OldType); 5963 } else { 5964 NewType = getDerived().TransformType(OldType); 5965 } 5966 5967 if (NewType.isNull()) 5968 return true; 5969 5970 if (IsPackExpansion) 5971 NewType = getSema().Context.getPackExpansionType(NewType, 5972 NumExpansions); 5973 5974 if (ParamInfos) 5975 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5976 OutParamTypes.push_back(NewType); 5977 if (PVars) 5978 PVars->push_back(nullptr); 5979 } 5980 5981 #ifndef NDEBUG 5982 if (PVars) { 5983 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5984 if (ParmVarDecl *parm = (*PVars)[i]) 5985 assert(parm->getFunctionScopeIndex() == i); 5986 } 5987 #endif 5988 5989 return false; 5990 } 5991 5992 template<typename Derived> 5993 QualType 5994 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5995 FunctionProtoTypeLoc TL) { 5996 SmallVector<QualType, 4> ExceptionStorage; 5997 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5998 return getDerived().TransformFunctionProtoType( 5999 TLB, TL, nullptr, Qualifiers(), 6000 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 6001 return This->getDerived().TransformExceptionSpec( 6002 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 6003 }); 6004 } 6005 6006 template<typename Derived> template<typename Fn> 6007 QualType TreeTransform<Derived>::TransformFunctionProtoType( 6008 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 6009 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 6010 6011 // Transform the parameters and return type. 6012 // 6013 // We are required to instantiate the params and return type in source order. 6014 // When the function has a trailing return type, we instantiate the 6015 // parameters before the return type, since the return type can then refer 6016 // to the parameters themselves (via decltype, sizeof, etc.). 6017 // 6018 SmallVector<QualType, 4> ParamTypes; 6019 SmallVector<ParmVarDecl*, 4> ParamDecls; 6020 Sema::ExtParameterInfoBuilder ExtParamInfos; 6021 const FunctionProtoType *T = TL.getTypePtr(); 6022 6023 QualType ResultType; 6024 6025 if (T->hasTrailingReturn()) { 6026 if (getDerived().TransformFunctionTypeParams( 6027 TL.getBeginLoc(), TL.getParams(), 6028 TL.getTypePtr()->param_type_begin(), 6029 T->getExtParameterInfosOrNull(), 6030 ParamTypes, &ParamDecls, ExtParamInfos)) 6031 return QualType(); 6032 6033 { 6034 // C++11 [expr.prim.general]p3: 6035 // If a declaration declares a member function or member function 6036 // template of a class X, the expression this is a prvalue of type 6037 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 6038 // and the end of the function-definition, member-declarator, or 6039 // declarator. 6040 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 6041 6042 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6043 if (ResultType.isNull()) 6044 return QualType(); 6045 } 6046 } 6047 else { 6048 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6049 if (ResultType.isNull()) 6050 return QualType(); 6051 6052 if (getDerived().TransformFunctionTypeParams( 6053 TL.getBeginLoc(), TL.getParams(), 6054 TL.getTypePtr()->param_type_begin(), 6055 T->getExtParameterInfosOrNull(), 6056 ParamTypes, &ParamDecls, ExtParamInfos)) 6057 return QualType(); 6058 } 6059 6060 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 6061 6062 bool EPIChanged = false; 6063 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 6064 return QualType(); 6065 6066 // Handle extended parameter information. 6067 if (auto NewExtParamInfos = 6068 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 6069 if (!EPI.ExtParameterInfos || 6070 llvm::ArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) != 6071 llvm::ArrayRef(NewExtParamInfos, ParamTypes.size())) { 6072 EPIChanged = true; 6073 } 6074 EPI.ExtParameterInfos = NewExtParamInfos; 6075 } else if (EPI.ExtParameterInfos) { 6076 EPIChanged = true; 6077 EPI.ExtParameterInfos = nullptr; 6078 } 6079 6080 QualType Result = TL.getType(); 6081 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 6082 T->getParamTypes() != llvm::ArrayRef(ParamTypes) || EPIChanged) { 6083 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 6084 if (Result.isNull()) 6085 return QualType(); 6086 } 6087 6088 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 6089 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6090 NewTL.setLParenLoc(TL.getLParenLoc()); 6091 NewTL.setRParenLoc(TL.getRParenLoc()); 6092 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 6093 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6094 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 6095 NewTL.setParam(i, ParamDecls[i]); 6096 6097 return Result; 6098 } 6099 6100 template<typename Derived> 6101 bool TreeTransform<Derived>::TransformExceptionSpec( 6102 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 6103 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 6104 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 6105 6106 // Instantiate a dynamic noexcept expression, if any. 6107 if (isComputedNoexcept(ESI.Type)) { 6108 EnterExpressionEvaluationContext Unevaluated( 6109 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 6110 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 6111 if (NoexceptExpr.isInvalid()) 6112 return true; 6113 6114 ExceptionSpecificationType EST = ESI.Type; 6115 NoexceptExpr = 6116 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 6117 if (NoexceptExpr.isInvalid()) 6118 return true; 6119 6120 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 6121 Changed = true; 6122 ESI.NoexceptExpr = NoexceptExpr.get(); 6123 ESI.Type = EST; 6124 } 6125 6126 if (ESI.Type != EST_Dynamic) 6127 return false; 6128 6129 // Instantiate a dynamic exception specification's type. 6130 for (QualType T : ESI.Exceptions) { 6131 if (const PackExpansionType *PackExpansion = 6132 T->getAs<PackExpansionType>()) { 6133 Changed = true; 6134 6135 // We have a pack expansion. Instantiate it. 6136 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6137 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6138 Unexpanded); 6139 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6140 6141 // Determine whether the set of unexpanded parameter packs can and 6142 // should 6143 // be expanded. 6144 bool Expand = false; 6145 bool RetainExpansion = false; 6146 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6147 // FIXME: Track the location of the ellipsis (and track source location 6148 // information for the types in the exception specification in general). 6149 if (getDerived().TryExpandParameterPacks( 6150 Loc, SourceRange(), Unexpanded, Expand, 6151 RetainExpansion, NumExpansions)) 6152 return true; 6153 6154 if (!Expand) { 6155 // We can't expand this pack expansion into separate arguments yet; 6156 // just substitute into the pattern and create a new pack expansion 6157 // type. 6158 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6159 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6160 if (U.isNull()) 6161 return true; 6162 6163 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6164 Exceptions.push_back(U); 6165 continue; 6166 } 6167 6168 // Substitute into the pack expansion pattern for each slice of the 6169 // pack. 6170 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6171 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6172 6173 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6174 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6175 return true; 6176 6177 Exceptions.push_back(U); 6178 } 6179 } else { 6180 QualType U = getDerived().TransformType(T); 6181 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6182 return true; 6183 if (T != U) 6184 Changed = true; 6185 6186 Exceptions.push_back(U); 6187 } 6188 } 6189 6190 ESI.Exceptions = Exceptions; 6191 if (ESI.Exceptions.empty()) 6192 ESI.Type = EST_DynamicNone; 6193 return false; 6194 } 6195 6196 template<typename Derived> 6197 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6198 TypeLocBuilder &TLB, 6199 FunctionNoProtoTypeLoc TL) { 6200 const FunctionNoProtoType *T = TL.getTypePtr(); 6201 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6202 if (ResultType.isNull()) 6203 return QualType(); 6204 6205 QualType Result = TL.getType(); 6206 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6207 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6208 6209 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6210 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6211 NewTL.setLParenLoc(TL.getLParenLoc()); 6212 NewTL.setRParenLoc(TL.getRParenLoc()); 6213 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6214 6215 return Result; 6216 } 6217 6218 template <typename Derived> 6219 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6220 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6221 const UnresolvedUsingType *T = TL.getTypePtr(); 6222 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6223 if (!D) 6224 return QualType(); 6225 6226 QualType Result = TL.getType(); 6227 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6228 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6229 if (Result.isNull()) 6230 return QualType(); 6231 } 6232 6233 // We might get an arbitrary type spec type back. We should at 6234 // least always get a type spec type, though. 6235 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6236 NewTL.setNameLoc(TL.getNameLoc()); 6237 6238 return Result; 6239 } 6240 6241 template <typename Derived> 6242 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6243 UsingTypeLoc TL) { 6244 const UsingType *T = TL.getTypePtr(); 6245 6246 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6247 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6248 if (!Found) 6249 return QualType(); 6250 6251 QualType Underlying = getDerived().TransformType(T->desugar()); 6252 if (Underlying.isNull()) 6253 return QualType(); 6254 6255 QualType Result = TL.getType(); 6256 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6257 Underlying != T->getUnderlyingType()) { 6258 Result = getDerived().RebuildUsingType(Found, Underlying); 6259 if (Result.isNull()) 6260 return QualType(); 6261 } 6262 6263 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6264 return Result; 6265 } 6266 6267 template<typename Derived> 6268 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6269 TypedefTypeLoc TL) { 6270 const TypedefType *T = TL.getTypePtr(); 6271 TypedefNameDecl *Typedef 6272 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6273 T->getDecl())); 6274 if (!Typedef) 6275 return QualType(); 6276 6277 QualType Result = TL.getType(); 6278 if (getDerived().AlwaysRebuild() || 6279 Typedef != T->getDecl()) { 6280 Result = getDerived().RebuildTypedefType(Typedef); 6281 if (Result.isNull()) 6282 return QualType(); 6283 } 6284 6285 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6286 NewTL.setNameLoc(TL.getNameLoc()); 6287 6288 return Result; 6289 } 6290 6291 template<typename Derived> 6292 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6293 TypeOfExprTypeLoc TL) { 6294 // typeof expressions are not potentially evaluated contexts 6295 EnterExpressionEvaluationContext Unevaluated( 6296 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6297 Sema::ReuseLambdaContextDecl); 6298 6299 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6300 if (E.isInvalid()) 6301 return QualType(); 6302 6303 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6304 if (E.isInvalid()) 6305 return QualType(); 6306 6307 QualType Result = TL.getType(); 6308 TypeOfKind Kind = Result->getAs<TypeOfExprType>()->getKind(); 6309 if (getDerived().AlwaysRebuild() || E.get() != TL.getUnderlyingExpr()) { 6310 Result = 6311 getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc(), Kind); 6312 if (Result.isNull()) 6313 return QualType(); 6314 } 6315 6316 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6317 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6318 NewTL.setLParenLoc(TL.getLParenLoc()); 6319 NewTL.setRParenLoc(TL.getRParenLoc()); 6320 6321 return Result; 6322 } 6323 6324 template<typename Derived> 6325 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6326 TypeOfTypeLoc TL) { 6327 TypeSourceInfo* Old_Under_TI = TL.getUnmodifiedTInfo(); 6328 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6329 if (!New_Under_TI) 6330 return QualType(); 6331 6332 QualType Result = TL.getType(); 6333 TypeOfKind Kind = Result->getAs<TypeOfType>()->getKind(); 6334 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6335 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType(), Kind); 6336 if (Result.isNull()) 6337 return QualType(); 6338 } 6339 6340 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6341 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6342 NewTL.setLParenLoc(TL.getLParenLoc()); 6343 NewTL.setRParenLoc(TL.getRParenLoc()); 6344 NewTL.setUnmodifiedTInfo(New_Under_TI); 6345 6346 return Result; 6347 } 6348 6349 template<typename Derived> 6350 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6351 DecltypeTypeLoc TL) { 6352 const DecltypeType *T = TL.getTypePtr(); 6353 6354 // decltype expressions are not potentially evaluated contexts 6355 EnterExpressionEvaluationContext Unevaluated( 6356 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6357 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6358 6359 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6360 if (E.isInvalid()) 6361 return QualType(); 6362 6363 E = getSema().ActOnDecltypeExpression(E.get()); 6364 if (E.isInvalid()) 6365 return QualType(); 6366 6367 QualType Result = TL.getType(); 6368 if (getDerived().AlwaysRebuild() || 6369 E.get() != T->getUnderlyingExpr()) { 6370 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6371 if (Result.isNull()) 6372 return QualType(); 6373 } 6374 else E.get(); 6375 6376 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6377 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6378 NewTL.setRParenLoc(TL.getRParenLoc()); 6379 return Result; 6380 } 6381 6382 template<typename Derived> 6383 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6384 TypeLocBuilder &TLB, 6385 UnaryTransformTypeLoc TL) { 6386 QualType Result = TL.getType(); 6387 if (Result->isDependentType()) { 6388 const UnaryTransformType *T = TL.getTypePtr(); 6389 QualType NewBase = 6390 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6391 Result = getDerived().RebuildUnaryTransformType(NewBase, 6392 T->getUTTKind(), 6393 TL.getKWLoc()); 6394 if (Result.isNull()) 6395 return QualType(); 6396 } 6397 6398 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6399 NewTL.setKWLoc(TL.getKWLoc()); 6400 NewTL.setParensRange(TL.getParensRange()); 6401 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6402 return Result; 6403 } 6404 6405 template<typename Derived> 6406 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6407 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6408 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6409 6410 CXXScopeSpec SS; 6411 TemplateName TemplateName = getDerived().TransformTemplateName( 6412 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6413 if (TemplateName.isNull()) 6414 return QualType(); 6415 6416 QualType OldDeduced = T->getDeducedType(); 6417 QualType NewDeduced; 6418 if (!OldDeduced.isNull()) { 6419 NewDeduced = getDerived().TransformType(OldDeduced); 6420 if (NewDeduced.isNull()) 6421 return QualType(); 6422 } 6423 6424 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6425 TemplateName, NewDeduced); 6426 if (Result.isNull()) 6427 return QualType(); 6428 6429 DeducedTemplateSpecializationTypeLoc NewTL = 6430 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6431 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6432 6433 return Result; 6434 } 6435 6436 template<typename Derived> 6437 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6438 RecordTypeLoc TL) { 6439 const RecordType *T = TL.getTypePtr(); 6440 RecordDecl *Record 6441 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6442 T->getDecl())); 6443 if (!Record) 6444 return QualType(); 6445 6446 QualType Result = TL.getType(); 6447 if (getDerived().AlwaysRebuild() || 6448 Record != T->getDecl()) { 6449 Result = getDerived().RebuildRecordType(Record); 6450 if (Result.isNull()) 6451 return QualType(); 6452 } 6453 6454 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6455 NewTL.setNameLoc(TL.getNameLoc()); 6456 6457 return Result; 6458 } 6459 6460 template<typename Derived> 6461 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6462 EnumTypeLoc TL) { 6463 const EnumType *T = TL.getTypePtr(); 6464 EnumDecl *Enum 6465 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6466 T->getDecl())); 6467 if (!Enum) 6468 return QualType(); 6469 6470 QualType Result = TL.getType(); 6471 if (getDerived().AlwaysRebuild() || 6472 Enum != T->getDecl()) { 6473 Result = getDerived().RebuildEnumType(Enum); 6474 if (Result.isNull()) 6475 return QualType(); 6476 } 6477 6478 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6479 NewTL.setNameLoc(TL.getNameLoc()); 6480 6481 return Result; 6482 } 6483 6484 template<typename Derived> 6485 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6486 TypeLocBuilder &TLB, 6487 InjectedClassNameTypeLoc TL) { 6488 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6489 TL.getTypePtr()->getDecl()); 6490 if (!D) return QualType(); 6491 6492 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6493 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6494 return T; 6495 } 6496 6497 template<typename Derived> 6498 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6499 TypeLocBuilder &TLB, 6500 TemplateTypeParmTypeLoc TL) { 6501 return getDerived().TransformTemplateTypeParmType( 6502 TLB, TL, 6503 /*SuppressObjCLifetime=*/false); 6504 } 6505 6506 template <typename Derived> 6507 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6508 TypeLocBuilder &TLB, TemplateTypeParmTypeLoc TL, bool) { 6509 return TransformTypeSpecType(TLB, TL); 6510 } 6511 6512 template<typename Derived> 6513 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6514 TypeLocBuilder &TLB, 6515 SubstTemplateTypeParmTypeLoc TL) { 6516 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6517 6518 Decl *NewReplaced = 6519 getDerived().TransformDecl(TL.getNameLoc(), T->getAssociatedDecl()); 6520 6521 // Substitute into the replacement type, which itself might involve something 6522 // that needs to be transformed. This only tends to occur with default 6523 // template arguments of template template parameters. 6524 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6525 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6526 if (Replacement.isNull()) 6527 return QualType(); 6528 6529 QualType Result = SemaRef.Context.getSubstTemplateTypeParmType( 6530 Replacement, NewReplaced, T->getIndex(), T->getPackIndex()); 6531 6532 // Propagate type-source information. 6533 SubstTemplateTypeParmTypeLoc NewTL 6534 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6535 NewTL.setNameLoc(TL.getNameLoc()); 6536 return Result; 6537 6538 } 6539 6540 template<typename Derived> 6541 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6542 TypeLocBuilder &TLB, 6543 SubstTemplateTypeParmPackTypeLoc TL) { 6544 return getDerived().TransformSubstTemplateTypeParmPackType( 6545 TLB, TL, /*SuppressObjCLifetime=*/false); 6546 } 6547 6548 template <typename Derived> 6549 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6550 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, bool) { 6551 return TransformTypeSpecType(TLB, TL); 6552 } 6553 6554 template<typename Derived> 6555 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6556 TypeLocBuilder &TLB, 6557 TemplateSpecializationTypeLoc TL) { 6558 const TemplateSpecializationType *T = TL.getTypePtr(); 6559 6560 // The nested-name-specifier never matters in a TemplateSpecializationType, 6561 // because we can't have a dependent nested-name-specifier anyway. 6562 CXXScopeSpec SS; 6563 TemplateName Template 6564 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6565 TL.getTemplateNameLoc()); 6566 if (Template.isNull()) 6567 return QualType(); 6568 6569 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6570 } 6571 6572 template<typename Derived> 6573 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6574 AtomicTypeLoc TL) { 6575 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6576 if (ValueType.isNull()) 6577 return QualType(); 6578 6579 QualType Result = TL.getType(); 6580 if (getDerived().AlwaysRebuild() || 6581 ValueType != TL.getValueLoc().getType()) { 6582 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6583 if (Result.isNull()) 6584 return QualType(); 6585 } 6586 6587 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6588 NewTL.setKWLoc(TL.getKWLoc()); 6589 NewTL.setLParenLoc(TL.getLParenLoc()); 6590 NewTL.setRParenLoc(TL.getRParenLoc()); 6591 6592 return Result; 6593 } 6594 6595 template <typename Derived> 6596 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6597 PipeTypeLoc TL) { 6598 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6599 if (ValueType.isNull()) 6600 return QualType(); 6601 6602 QualType Result = TL.getType(); 6603 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6604 const PipeType *PT = Result->castAs<PipeType>(); 6605 bool isReadPipe = PT->isReadOnly(); 6606 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6607 if (Result.isNull()) 6608 return QualType(); 6609 } 6610 6611 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6612 NewTL.setKWLoc(TL.getKWLoc()); 6613 6614 return Result; 6615 } 6616 6617 template <typename Derived> 6618 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6619 BitIntTypeLoc TL) { 6620 const BitIntType *EIT = TL.getTypePtr(); 6621 QualType Result = TL.getType(); 6622 6623 if (getDerived().AlwaysRebuild()) { 6624 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6625 EIT->getNumBits(), TL.getNameLoc()); 6626 if (Result.isNull()) 6627 return QualType(); 6628 } 6629 6630 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6631 NewTL.setNameLoc(TL.getNameLoc()); 6632 return Result; 6633 } 6634 6635 template <typename Derived> 6636 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6637 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6638 const DependentBitIntType *EIT = TL.getTypePtr(); 6639 6640 EnterExpressionEvaluationContext Unevaluated( 6641 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6642 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6643 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6644 6645 if (BitsExpr.isInvalid()) 6646 return QualType(); 6647 6648 QualType Result = TL.getType(); 6649 6650 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6651 Result = getDerived().RebuildDependentBitIntType( 6652 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6653 6654 if (Result.isNull()) 6655 return QualType(); 6656 } 6657 6658 if (isa<DependentBitIntType>(Result)) { 6659 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6660 NewTL.setNameLoc(TL.getNameLoc()); 6661 } else { 6662 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6663 NewTL.setNameLoc(TL.getNameLoc()); 6664 } 6665 return Result; 6666 } 6667 6668 /// Simple iterator that traverses the template arguments in a 6669 /// container that provides a \c getArgLoc() member function. 6670 /// 6671 /// This iterator is intended to be used with the iterator form of 6672 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6673 template<typename ArgLocContainer> 6674 class TemplateArgumentLocContainerIterator { 6675 ArgLocContainer *Container; 6676 unsigned Index; 6677 6678 public: 6679 typedef TemplateArgumentLoc value_type; 6680 typedef TemplateArgumentLoc reference; 6681 typedef int difference_type; 6682 typedef std::input_iterator_tag iterator_category; 6683 6684 class pointer { 6685 TemplateArgumentLoc Arg; 6686 6687 public: 6688 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6689 6690 const TemplateArgumentLoc *operator->() const { 6691 return &Arg; 6692 } 6693 }; 6694 6695 6696 TemplateArgumentLocContainerIterator() {} 6697 6698 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6699 unsigned Index) 6700 : Container(&Container), Index(Index) { } 6701 6702 TemplateArgumentLocContainerIterator &operator++() { 6703 ++Index; 6704 return *this; 6705 } 6706 6707 TemplateArgumentLocContainerIterator operator++(int) { 6708 TemplateArgumentLocContainerIterator Old(*this); 6709 ++(*this); 6710 return Old; 6711 } 6712 6713 TemplateArgumentLoc operator*() const { 6714 return Container->getArgLoc(Index); 6715 } 6716 6717 pointer operator->() const { 6718 return pointer(Container->getArgLoc(Index)); 6719 } 6720 6721 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6722 const TemplateArgumentLocContainerIterator &Y) { 6723 return X.Container == Y.Container && X.Index == Y.Index; 6724 } 6725 6726 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6727 const TemplateArgumentLocContainerIterator &Y) { 6728 return !(X == Y); 6729 } 6730 }; 6731 6732 template<typename Derived> 6733 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6734 AutoTypeLoc TL) { 6735 const AutoType *T = TL.getTypePtr(); 6736 QualType OldDeduced = T->getDeducedType(); 6737 QualType NewDeduced; 6738 if (!OldDeduced.isNull()) { 6739 NewDeduced = getDerived().TransformType(OldDeduced); 6740 if (NewDeduced.isNull()) 6741 return QualType(); 6742 } 6743 6744 ConceptDecl *NewCD = nullptr; 6745 TemplateArgumentListInfo NewTemplateArgs; 6746 NestedNameSpecifierLoc NewNestedNameSpec; 6747 if (T->isConstrained()) { 6748 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6749 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6750 6751 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6752 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6753 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6754 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6755 ArgIterator(TL, 6756 TL.getNumArgs()), 6757 NewTemplateArgs)) 6758 return QualType(); 6759 6760 if (TL.getNestedNameSpecifierLoc()) { 6761 NewNestedNameSpec 6762 = getDerived().TransformNestedNameSpecifierLoc( 6763 TL.getNestedNameSpecifierLoc()); 6764 if (!NewNestedNameSpec) 6765 return QualType(); 6766 } 6767 } 6768 6769 QualType Result = TL.getType(); 6770 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6771 T->isDependentType() || T->isConstrained()) { 6772 // FIXME: Maybe don't rebuild if all template arguments are the same. 6773 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6774 NewArgList.reserve(NewTemplateArgs.size()); 6775 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6776 NewArgList.push_back(ArgLoc.getArgument()); 6777 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6778 NewArgList); 6779 if (Result.isNull()) 6780 return QualType(); 6781 } 6782 6783 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6784 NewTL.setNameLoc(TL.getNameLoc()); 6785 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6786 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6787 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6788 NewTL.setFoundDecl(TL.getFoundDecl()); 6789 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6790 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6791 NewTL.setRParenLoc(TL.getRParenLoc()); 6792 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6793 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6794 6795 return Result; 6796 } 6797 6798 template <typename Derived> 6799 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6800 TypeLocBuilder &TLB, 6801 TemplateSpecializationTypeLoc TL, 6802 TemplateName Template) { 6803 TemplateArgumentListInfo NewTemplateArgs; 6804 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6805 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6806 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6807 ArgIterator; 6808 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6809 ArgIterator(TL, TL.getNumArgs()), 6810 NewTemplateArgs)) 6811 return QualType(); 6812 6813 // FIXME: maybe don't rebuild if all the template arguments are the same. 6814 6815 QualType Result = 6816 getDerived().RebuildTemplateSpecializationType(Template, 6817 TL.getTemplateNameLoc(), 6818 NewTemplateArgs); 6819 6820 if (!Result.isNull()) { 6821 // Specializations of template template parameters are represented as 6822 // TemplateSpecializationTypes, and substitution of type alias templates 6823 // within a dependent context can transform them into 6824 // DependentTemplateSpecializationTypes. 6825 if (isa<DependentTemplateSpecializationType>(Result)) { 6826 DependentTemplateSpecializationTypeLoc NewTL 6827 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6828 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6829 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6830 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6831 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6832 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6833 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6834 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6835 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6836 return Result; 6837 } 6838 6839 TemplateSpecializationTypeLoc NewTL 6840 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6841 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6842 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6843 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6844 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6845 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6846 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6847 } 6848 6849 return Result; 6850 } 6851 6852 template <typename Derived> 6853 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6854 TypeLocBuilder &TLB, 6855 DependentTemplateSpecializationTypeLoc TL, 6856 TemplateName Template, 6857 CXXScopeSpec &SS) { 6858 TemplateArgumentListInfo NewTemplateArgs; 6859 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6860 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6861 typedef TemplateArgumentLocContainerIterator< 6862 DependentTemplateSpecializationTypeLoc> ArgIterator; 6863 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6864 ArgIterator(TL, TL.getNumArgs()), 6865 NewTemplateArgs)) 6866 return QualType(); 6867 6868 // FIXME: maybe don't rebuild if all the template arguments are the same. 6869 6870 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6871 QualType Result = getSema().Context.getDependentTemplateSpecializationType( 6872 TL.getTypePtr()->getKeyword(), DTN->getQualifier(), 6873 DTN->getIdentifier(), NewTemplateArgs.arguments()); 6874 6875 DependentTemplateSpecializationTypeLoc NewTL 6876 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6877 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6878 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6879 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6880 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6881 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6882 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6883 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6884 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6885 return Result; 6886 } 6887 6888 QualType Result 6889 = getDerived().RebuildTemplateSpecializationType(Template, 6890 TL.getTemplateNameLoc(), 6891 NewTemplateArgs); 6892 6893 if (!Result.isNull()) { 6894 /// FIXME: Wrap this in an elaborated-type-specifier? 6895 TemplateSpecializationTypeLoc NewTL 6896 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6897 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6898 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6899 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6900 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6901 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6902 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6903 } 6904 6905 return Result; 6906 } 6907 6908 template<typename Derived> 6909 QualType 6910 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6911 ElaboratedTypeLoc TL) { 6912 const ElaboratedType *T = TL.getTypePtr(); 6913 6914 NestedNameSpecifierLoc QualifierLoc; 6915 // NOTE: the qualifier in an ElaboratedType is optional. 6916 if (TL.getQualifierLoc()) { 6917 QualifierLoc 6918 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6919 if (!QualifierLoc) 6920 return QualType(); 6921 } 6922 6923 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6924 if (NamedT.isNull()) 6925 return QualType(); 6926 6927 // C++0x [dcl.type.elab]p2: 6928 // If the identifier resolves to a typedef-name or the simple-template-id 6929 // resolves to an alias template specialization, the 6930 // elaborated-type-specifier is ill-formed. 6931 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6932 if (const TemplateSpecializationType *TST = 6933 NamedT->getAs<TemplateSpecializationType>()) { 6934 TemplateName Template = TST->getTemplateName(); 6935 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6936 Template.getAsTemplateDecl())) { 6937 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6938 diag::err_tag_reference_non_tag) 6939 << TAT << Sema::NTK_TypeAliasTemplate 6940 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6941 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6942 } 6943 } 6944 } 6945 6946 QualType Result = TL.getType(); 6947 if (getDerived().AlwaysRebuild() || 6948 QualifierLoc != TL.getQualifierLoc() || 6949 NamedT != T->getNamedType()) { 6950 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6951 T->getKeyword(), 6952 QualifierLoc, NamedT); 6953 if (Result.isNull()) 6954 return QualType(); 6955 } 6956 6957 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6958 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6959 NewTL.setQualifierLoc(QualifierLoc); 6960 return Result; 6961 } 6962 6963 template<typename Derived> 6964 QualType TreeTransform<Derived>::TransformAttributedType( 6965 TypeLocBuilder &TLB, 6966 AttributedTypeLoc TL) { 6967 const AttributedType *oldType = TL.getTypePtr(); 6968 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6969 if (modifiedType.isNull()) 6970 return QualType(); 6971 6972 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6973 const Attr *oldAttr = TL.getAttr(); 6974 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6975 if (oldAttr && !newAttr) 6976 return QualType(); 6977 6978 QualType result = TL.getType(); 6979 6980 // FIXME: dependent operand expressions? 6981 if (getDerived().AlwaysRebuild() || 6982 modifiedType != oldType->getModifiedType()) { 6983 // TODO: this is really lame; we should really be rebuilding the 6984 // equivalent type from first principles. 6985 QualType equivalentType 6986 = getDerived().TransformType(oldType->getEquivalentType()); 6987 if (equivalentType.isNull()) 6988 return QualType(); 6989 6990 // Check whether we can add nullability; it is only represented as 6991 // type sugar, and therefore cannot be diagnosed in any other way. 6992 if (auto nullability = oldType->getImmediateNullability()) { 6993 if (!modifiedType->canHaveNullability()) { 6994 SemaRef.Diag(TL.getAttr()->getLocation(), 6995 diag::err_nullability_nonpointer) 6996 << DiagNullabilityKind(*nullability, false) << modifiedType; 6997 return QualType(); 6998 } 6999 } 7000 7001 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 7002 modifiedType, 7003 equivalentType); 7004 } 7005 7006 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 7007 newTL.setAttr(newAttr); 7008 return result; 7009 } 7010 7011 template <typename Derived> 7012 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 7013 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 7014 // The BTFTagAttributedType is available for C only. 7015 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 7016 } 7017 7018 template<typename Derived> 7019 QualType 7020 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 7021 ParenTypeLoc TL) { 7022 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7023 if (Inner.isNull()) 7024 return QualType(); 7025 7026 QualType Result = TL.getType(); 7027 if (getDerived().AlwaysRebuild() || 7028 Inner != TL.getInnerLoc().getType()) { 7029 Result = getDerived().RebuildParenType(Inner); 7030 if (Result.isNull()) 7031 return QualType(); 7032 } 7033 7034 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 7035 NewTL.setLParenLoc(TL.getLParenLoc()); 7036 NewTL.setRParenLoc(TL.getRParenLoc()); 7037 return Result; 7038 } 7039 7040 template <typename Derived> 7041 QualType 7042 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 7043 MacroQualifiedTypeLoc TL) { 7044 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 7045 if (Inner.isNull()) 7046 return QualType(); 7047 7048 QualType Result = TL.getType(); 7049 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 7050 Result = 7051 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 7052 if (Result.isNull()) 7053 return QualType(); 7054 } 7055 7056 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 7057 NewTL.setExpansionLoc(TL.getExpansionLoc()); 7058 return Result; 7059 } 7060 7061 template<typename Derived> 7062 QualType TreeTransform<Derived>::TransformDependentNameType( 7063 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 7064 return TransformDependentNameType(TLB, TL, false); 7065 } 7066 7067 template<typename Derived> 7068 QualType TreeTransform<Derived>::TransformDependentNameType( 7069 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 7070 const DependentNameType *T = TL.getTypePtr(); 7071 7072 NestedNameSpecifierLoc QualifierLoc 7073 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7074 if (!QualifierLoc) 7075 return QualType(); 7076 7077 QualType Result 7078 = getDerived().RebuildDependentNameType(T->getKeyword(), 7079 TL.getElaboratedKeywordLoc(), 7080 QualifierLoc, 7081 T->getIdentifier(), 7082 TL.getNameLoc(), 7083 DeducedTSTContext); 7084 if (Result.isNull()) 7085 return QualType(); 7086 7087 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 7088 QualType NamedT = ElabT->getNamedType(); 7089 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 7090 7091 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7092 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7093 NewTL.setQualifierLoc(QualifierLoc); 7094 } else { 7095 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 7096 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7097 NewTL.setQualifierLoc(QualifierLoc); 7098 NewTL.setNameLoc(TL.getNameLoc()); 7099 } 7100 return Result; 7101 } 7102 7103 template<typename Derived> 7104 QualType TreeTransform<Derived>:: 7105 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7106 DependentTemplateSpecializationTypeLoc TL) { 7107 NestedNameSpecifierLoc QualifierLoc; 7108 if (TL.getQualifierLoc()) { 7109 QualifierLoc 7110 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 7111 if (!QualifierLoc) 7112 return QualType(); 7113 } 7114 7115 return getDerived() 7116 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 7117 } 7118 7119 template<typename Derived> 7120 QualType TreeTransform<Derived>:: 7121 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 7122 DependentTemplateSpecializationTypeLoc TL, 7123 NestedNameSpecifierLoc QualifierLoc) { 7124 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 7125 7126 TemplateArgumentListInfo NewTemplateArgs; 7127 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 7128 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 7129 7130 typedef TemplateArgumentLocContainerIterator< 7131 DependentTemplateSpecializationTypeLoc> ArgIterator; 7132 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 7133 ArgIterator(TL, TL.getNumArgs()), 7134 NewTemplateArgs)) 7135 return QualType(); 7136 7137 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 7138 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 7139 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 7140 /*AllowInjectedClassName*/ false); 7141 if (Result.isNull()) 7142 return QualType(); 7143 7144 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7145 QualType NamedT = ElabT->getNamedType(); 7146 7147 // Copy information relevant to the template specialization. 7148 TemplateSpecializationTypeLoc NamedTL 7149 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7150 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7151 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7152 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7153 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7154 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7155 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7156 7157 // Copy information relevant to the elaborated type. 7158 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7159 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7160 NewTL.setQualifierLoc(QualifierLoc); 7161 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7162 DependentTemplateSpecializationTypeLoc SpecTL 7163 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7164 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7165 SpecTL.setQualifierLoc(QualifierLoc); 7166 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7167 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7168 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7169 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7170 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7171 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7172 } else { 7173 TemplateSpecializationTypeLoc SpecTL 7174 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7175 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7176 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7177 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7178 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7179 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7180 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7181 } 7182 return Result; 7183 } 7184 7185 template<typename Derived> 7186 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7187 PackExpansionTypeLoc TL) { 7188 QualType Pattern 7189 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7190 if (Pattern.isNull()) 7191 return QualType(); 7192 7193 QualType Result = TL.getType(); 7194 if (getDerived().AlwaysRebuild() || 7195 Pattern != TL.getPatternLoc().getType()) { 7196 Result = getDerived().RebuildPackExpansionType(Pattern, 7197 TL.getPatternLoc().getSourceRange(), 7198 TL.getEllipsisLoc(), 7199 TL.getTypePtr()->getNumExpansions()); 7200 if (Result.isNull()) 7201 return QualType(); 7202 } 7203 7204 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7205 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7206 return Result; 7207 } 7208 7209 template<typename Derived> 7210 QualType 7211 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7212 ObjCInterfaceTypeLoc TL) { 7213 // ObjCInterfaceType is never dependent. 7214 TLB.pushFullCopy(TL); 7215 return TL.getType(); 7216 } 7217 7218 template<typename Derived> 7219 QualType 7220 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7221 ObjCTypeParamTypeLoc TL) { 7222 const ObjCTypeParamType *T = TL.getTypePtr(); 7223 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7224 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7225 if (!OTP) 7226 return QualType(); 7227 7228 QualType Result = TL.getType(); 7229 if (getDerived().AlwaysRebuild() || 7230 OTP != T->getDecl()) { 7231 Result = getDerived().RebuildObjCTypeParamType( 7232 OTP, TL.getProtocolLAngleLoc(), 7233 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7234 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7235 if (Result.isNull()) 7236 return QualType(); 7237 } 7238 7239 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7240 if (TL.getNumProtocols()) { 7241 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7242 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7243 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7244 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7245 } 7246 return Result; 7247 } 7248 7249 template<typename Derived> 7250 QualType 7251 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7252 ObjCObjectTypeLoc TL) { 7253 // Transform base type. 7254 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7255 if (BaseType.isNull()) 7256 return QualType(); 7257 7258 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7259 7260 // Transform type arguments. 7261 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7262 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7263 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7264 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7265 QualType TypeArg = TypeArgInfo->getType(); 7266 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7267 AnyChanged = true; 7268 7269 // We have a pack expansion. Instantiate it. 7270 const auto *PackExpansion = PackExpansionLoc.getType() 7271 ->castAs<PackExpansionType>(); 7272 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7273 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7274 Unexpanded); 7275 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7276 7277 // Determine whether the set of unexpanded parameter packs can 7278 // and should be expanded. 7279 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7280 bool Expand = false; 7281 bool RetainExpansion = false; 7282 std::optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7283 if (getDerived().TryExpandParameterPacks( 7284 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7285 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7286 return QualType(); 7287 7288 if (!Expand) { 7289 // We can't expand this pack expansion into separate arguments yet; 7290 // just substitute into the pattern and create a new pack expansion 7291 // type. 7292 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7293 7294 TypeLocBuilder TypeArgBuilder; 7295 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7296 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7297 PatternLoc); 7298 if (NewPatternType.isNull()) 7299 return QualType(); 7300 7301 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7302 NewPatternType, NumExpansions); 7303 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7304 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7305 NewTypeArgInfos.push_back( 7306 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7307 continue; 7308 } 7309 7310 // Substitute into the pack expansion pattern for each slice of the 7311 // pack. 7312 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7313 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7314 7315 TypeLocBuilder TypeArgBuilder; 7316 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7317 7318 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7319 PatternLoc); 7320 if (NewTypeArg.isNull()) 7321 return QualType(); 7322 7323 NewTypeArgInfos.push_back( 7324 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7325 } 7326 7327 continue; 7328 } 7329 7330 TypeLocBuilder TypeArgBuilder; 7331 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7332 QualType NewTypeArg = 7333 getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7334 if (NewTypeArg.isNull()) 7335 return QualType(); 7336 7337 // If nothing changed, just keep the old TypeSourceInfo. 7338 if (NewTypeArg == TypeArg) { 7339 NewTypeArgInfos.push_back(TypeArgInfo); 7340 continue; 7341 } 7342 7343 NewTypeArgInfos.push_back( 7344 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7345 AnyChanged = true; 7346 } 7347 7348 QualType Result = TL.getType(); 7349 if (getDerived().AlwaysRebuild() || AnyChanged) { 7350 // Rebuild the type. 7351 Result = getDerived().RebuildObjCObjectType( 7352 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7353 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7354 llvm::ArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7355 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7356 7357 if (Result.isNull()) 7358 return QualType(); 7359 } 7360 7361 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7362 NewT.setHasBaseTypeAsWritten(true); 7363 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7364 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7365 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7366 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7367 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7368 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7369 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7370 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7371 return Result; 7372 } 7373 7374 template<typename Derived> 7375 QualType 7376 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7377 ObjCObjectPointerTypeLoc TL) { 7378 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7379 if (PointeeType.isNull()) 7380 return QualType(); 7381 7382 QualType Result = TL.getType(); 7383 if (getDerived().AlwaysRebuild() || 7384 PointeeType != TL.getPointeeLoc().getType()) { 7385 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7386 TL.getStarLoc()); 7387 if (Result.isNull()) 7388 return QualType(); 7389 } 7390 7391 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7392 NewT.setStarLoc(TL.getStarLoc()); 7393 return Result; 7394 } 7395 7396 //===----------------------------------------------------------------------===// 7397 // Statement transformation 7398 //===----------------------------------------------------------------------===// 7399 template<typename Derived> 7400 StmtResult 7401 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7402 return S; 7403 } 7404 7405 template<typename Derived> 7406 StmtResult 7407 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7408 return getDerived().TransformCompoundStmt(S, false); 7409 } 7410 7411 template<typename Derived> 7412 StmtResult 7413 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7414 bool IsStmtExpr) { 7415 Sema::CompoundScopeRAII CompoundScope(getSema()); 7416 7417 const Stmt *ExprResult = S->getStmtExprResult(); 7418 bool SubStmtInvalid = false; 7419 bool SubStmtChanged = false; 7420 SmallVector<Stmt*, 8> Statements; 7421 for (auto *B : S->body()) { 7422 StmtResult Result = getDerived().TransformStmt( 7423 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7424 7425 if (Result.isInvalid()) { 7426 // Immediately fail if this was a DeclStmt, since it's very 7427 // likely that this will cause problems for future statements. 7428 if (isa<DeclStmt>(B)) 7429 return StmtError(); 7430 7431 // Otherwise, just keep processing substatements and fail later. 7432 SubStmtInvalid = true; 7433 continue; 7434 } 7435 7436 SubStmtChanged = SubStmtChanged || Result.get() != B; 7437 Statements.push_back(Result.getAs<Stmt>()); 7438 } 7439 7440 if (SubStmtInvalid) 7441 return StmtError(); 7442 7443 if (!getDerived().AlwaysRebuild() && 7444 !SubStmtChanged) 7445 return S; 7446 7447 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7448 Statements, 7449 S->getRBracLoc(), 7450 IsStmtExpr); 7451 } 7452 7453 template<typename Derived> 7454 StmtResult 7455 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7456 ExprResult LHS, RHS; 7457 { 7458 EnterExpressionEvaluationContext Unevaluated( 7459 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7460 7461 // Transform the left-hand case value. 7462 LHS = getDerived().TransformExpr(S->getLHS()); 7463 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7464 if (LHS.isInvalid()) 7465 return StmtError(); 7466 7467 // Transform the right-hand case value (for the GNU case-range extension). 7468 RHS = getDerived().TransformExpr(S->getRHS()); 7469 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7470 if (RHS.isInvalid()) 7471 return StmtError(); 7472 } 7473 7474 // Build the case statement. 7475 // Case statements are always rebuilt so that they will attached to their 7476 // transformed switch statement. 7477 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7478 LHS.get(), 7479 S->getEllipsisLoc(), 7480 RHS.get(), 7481 S->getColonLoc()); 7482 if (Case.isInvalid()) 7483 return StmtError(); 7484 7485 // Transform the statement following the case 7486 StmtResult SubStmt = 7487 getDerived().TransformStmt(S->getSubStmt()); 7488 if (SubStmt.isInvalid()) 7489 return StmtError(); 7490 7491 // Attach the body to the case statement 7492 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7493 } 7494 7495 template <typename Derived> 7496 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7497 // Transform the statement following the default case 7498 StmtResult SubStmt = 7499 getDerived().TransformStmt(S->getSubStmt()); 7500 if (SubStmt.isInvalid()) 7501 return StmtError(); 7502 7503 // Default statements are always rebuilt 7504 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7505 SubStmt.get()); 7506 } 7507 7508 template<typename Derived> 7509 StmtResult 7510 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7511 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7512 if (SubStmt.isInvalid()) 7513 return StmtError(); 7514 7515 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7516 S->getDecl()); 7517 if (!LD) 7518 return StmtError(); 7519 7520 // If we're transforming "in-place" (we're not creating new local 7521 // declarations), assume we're replacing the old label statement 7522 // and clear out the reference to it. 7523 if (LD == S->getDecl()) 7524 S->getDecl()->setStmt(nullptr); 7525 7526 // FIXME: Pass the real colon location in. 7527 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7528 cast<LabelDecl>(LD), SourceLocation(), 7529 SubStmt.get()); 7530 } 7531 7532 template <typename Derived> 7533 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7534 if (!R) 7535 return R; 7536 7537 switch (R->getKind()) { 7538 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7539 #define ATTR(X) 7540 #define PRAGMA_SPELLING_ATTR(X) \ 7541 case attr::X: \ 7542 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7543 #include "clang/Basic/AttrList.inc" 7544 default: 7545 return R; 7546 } 7547 } 7548 7549 template <typename Derived> 7550 StmtResult 7551 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7552 StmtDiscardKind SDK) { 7553 bool AttrsChanged = false; 7554 SmallVector<const Attr *, 1> Attrs; 7555 7556 // Visit attributes and keep track if any are transformed. 7557 for (const auto *I : S->getAttrs()) { 7558 const Attr *R = getDerived().TransformAttr(I); 7559 AttrsChanged |= (I != R); 7560 if (R) 7561 Attrs.push_back(R); 7562 } 7563 7564 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7565 if (SubStmt.isInvalid()) 7566 return StmtError(); 7567 7568 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7569 return S; 7570 7571 // If transforming the attributes failed for all of the attributes in the 7572 // statement, don't make an AttributedStmt without attributes. 7573 if (Attrs.empty()) 7574 return SubStmt; 7575 7576 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7577 SubStmt.get()); 7578 } 7579 7580 template<typename Derived> 7581 StmtResult 7582 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7583 // Transform the initialization statement 7584 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7585 if (Init.isInvalid()) 7586 return StmtError(); 7587 7588 Sema::ConditionResult Cond; 7589 if (!S->isConsteval()) { 7590 // Transform the condition 7591 Cond = getDerived().TransformCondition( 7592 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7593 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7594 : Sema::ConditionKind::Boolean); 7595 if (Cond.isInvalid()) 7596 return StmtError(); 7597 } 7598 7599 // If this is a constexpr if, determine which arm we should instantiate. 7600 std::optional<bool> ConstexprConditionValue; 7601 if (S->isConstexpr()) 7602 ConstexprConditionValue = Cond.getKnownValue(); 7603 7604 // Transform the "then" branch. 7605 StmtResult Then; 7606 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7607 Then = getDerived().TransformStmt(S->getThen()); 7608 if (Then.isInvalid()) 7609 return StmtError(); 7610 } else { 7611 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7612 } 7613 7614 // Transform the "else" branch. 7615 StmtResult Else; 7616 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7617 Else = getDerived().TransformStmt(S->getElse()); 7618 if (Else.isInvalid()) 7619 return StmtError(); 7620 } 7621 7622 if (!getDerived().AlwaysRebuild() && 7623 Init.get() == S->getInit() && 7624 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7625 Then.get() == S->getThen() && 7626 Else.get() == S->getElse()) 7627 return S; 7628 7629 return getDerived().RebuildIfStmt( 7630 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7631 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7632 } 7633 7634 template<typename Derived> 7635 StmtResult 7636 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7637 // Transform the initialization statement 7638 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7639 if (Init.isInvalid()) 7640 return StmtError(); 7641 7642 // Transform the condition. 7643 Sema::ConditionResult Cond = getDerived().TransformCondition( 7644 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7645 Sema::ConditionKind::Switch); 7646 if (Cond.isInvalid()) 7647 return StmtError(); 7648 7649 // Rebuild the switch statement. 7650 StmtResult Switch = 7651 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7652 Init.get(), Cond, S->getRParenLoc()); 7653 if (Switch.isInvalid()) 7654 return StmtError(); 7655 7656 // Transform the body of the switch statement. 7657 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7658 if (Body.isInvalid()) 7659 return StmtError(); 7660 7661 // Complete the switch statement. 7662 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7663 Body.get()); 7664 } 7665 7666 template<typename Derived> 7667 StmtResult 7668 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7669 // Transform the condition 7670 Sema::ConditionResult Cond = getDerived().TransformCondition( 7671 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7672 Sema::ConditionKind::Boolean); 7673 if (Cond.isInvalid()) 7674 return StmtError(); 7675 7676 // Transform the body 7677 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7678 if (Body.isInvalid()) 7679 return StmtError(); 7680 7681 if (!getDerived().AlwaysRebuild() && 7682 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7683 Body.get() == S->getBody()) 7684 return Owned(S); 7685 7686 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7687 Cond, S->getRParenLoc(), Body.get()); 7688 } 7689 7690 template<typename Derived> 7691 StmtResult 7692 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7693 // Transform the body 7694 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7695 if (Body.isInvalid()) 7696 return StmtError(); 7697 7698 // Transform the condition 7699 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7700 if (Cond.isInvalid()) 7701 return StmtError(); 7702 7703 if (!getDerived().AlwaysRebuild() && 7704 Cond.get() == S->getCond() && 7705 Body.get() == S->getBody()) 7706 return S; 7707 7708 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7709 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7710 S->getRParenLoc()); 7711 } 7712 7713 template<typename Derived> 7714 StmtResult 7715 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7716 if (getSema().getLangOpts().OpenMP) 7717 getSema().startOpenMPLoop(); 7718 7719 // Transform the initialization statement 7720 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7721 if (Init.isInvalid()) 7722 return StmtError(); 7723 7724 // In OpenMP loop region loop control variable must be captured and be 7725 // private. Perform analysis of first part (if any). 7726 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7727 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7728 7729 // Transform the condition 7730 Sema::ConditionResult Cond = getDerived().TransformCondition( 7731 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7732 Sema::ConditionKind::Boolean); 7733 if (Cond.isInvalid()) 7734 return StmtError(); 7735 7736 // Transform the increment 7737 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7738 if (Inc.isInvalid()) 7739 return StmtError(); 7740 7741 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7742 if (S->getInc() && !FullInc.get()) 7743 return StmtError(); 7744 7745 // Transform the body 7746 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7747 if (Body.isInvalid()) 7748 return StmtError(); 7749 7750 if (!getDerived().AlwaysRebuild() && 7751 Init.get() == S->getInit() && 7752 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7753 Inc.get() == S->getInc() && 7754 Body.get() == S->getBody()) 7755 return S; 7756 7757 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7758 Init.get(), Cond, FullInc, 7759 S->getRParenLoc(), Body.get()); 7760 } 7761 7762 template<typename Derived> 7763 StmtResult 7764 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7765 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7766 S->getLabel()); 7767 if (!LD) 7768 return StmtError(); 7769 7770 // Goto statements must always be rebuilt, to resolve the label. 7771 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7772 cast<LabelDecl>(LD)); 7773 } 7774 7775 template<typename Derived> 7776 StmtResult 7777 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7778 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7779 if (Target.isInvalid()) 7780 return StmtError(); 7781 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7782 7783 if (!getDerived().AlwaysRebuild() && 7784 Target.get() == S->getTarget()) 7785 return S; 7786 7787 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7788 Target.get()); 7789 } 7790 7791 template<typename Derived> 7792 StmtResult 7793 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7794 return S; 7795 } 7796 7797 template<typename Derived> 7798 StmtResult 7799 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7800 return S; 7801 } 7802 7803 template<typename Derived> 7804 StmtResult 7805 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7806 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7807 /*NotCopyInit*/false); 7808 if (Result.isInvalid()) 7809 return StmtError(); 7810 7811 // FIXME: We always rebuild the return statement because there is no way 7812 // to tell whether the return type of the function has changed. 7813 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7814 } 7815 7816 template<typename Derived> 7817 StmtResult 7818 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7819 bool DeclChanged = false; 7820 SmallVector<Decl *, 4> Decls; 7821 for (auto *D : S->decls()) { 7822 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7823 if (!Transformed) 7824 return StmtError(); 7825 7826 if (Transformed != D) 7827 DeclChanged = true; 7828 7829 Decls.push_back(Transformed); 7830 } 7831 7832 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7833 return S; 7834 7835 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7836 } 7837 7838 template<typename Derived> 7839 StmtResult 7840 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7841 7842 SmallVector<Expr*, 8> Constraints; 7843 SmallVector<Expr*, 8> Exprs; 7844 SmallVector<IdentifierInfo *, 4> Names; 7845 7846 ExprResult AsmString; 7847 SmallVector<Expr*, 8> Clobbers; 7848 7849 bool ExprsChanged = false; 7850 7851 // Go through the outputs. 7852 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7853 Names.push_back(S->getOutputIdentifier(I)); 7854 7855 // No need to transform the constraint literal. 7856 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7857 7858 // Transform the output expr. 7859 Expr *OutputExpr = S->getOutputExpr(I); 7860 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7861 if (Result.isInvalid()) 7862 return StmtError(); 7863 7864 ExprsChanged |= Result.get() != OutputExpr; 7865 7866 Exprs.push_back(Result.get()); 7867 } 7868 7869 // Go through the inputs. 7870 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7871 Names.push_back(S->getInputIdentifier(I)); 7872 7873 // No need to transform the constraint literal. 7874 Constraints.push_back(S->getInputConstraintLiteral(I)); 7875 7876 // Transform the input expr. 7877 Expr *InputExpr = S->getInputExpr(I); 7878 ExprResult Result = getDerived().TransformExpr(InputExpr); 7879 if (Result.isInvalid()) 7880 return StmtError(); 7881 7882 ExprsChanged |= Result.get() != InputExpr; 7883 7884 Exprs.push_back(Result.get()); 7885 } 7886 7887 // Go through the Labels. 7888 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7889 Names.push_back(S->getLabelIdentifier(I)); 7890 7891 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7892 if (Result.isInvalid()) 7893 return StmtError(); 7894 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7895 Exprs.push_back(Result.get()); 7896 } 7897 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7898 return S; 7899 7900 // Go through the clobbers. 7901 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7902 Clobbers.push_back(S->getClobberStringLiteral(I)); 7903 7904 // No need to transform the asm string literal. 7905 AsmString = S->getAsmString(); 7906 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7907 S->isVolatile(), S->getNumOutputs(), 7908 S->getNumInputs(), Names.data(), 7909 Constraints, Exprs, AsmString.get(), 7910 Clobbers, S->getNumLabels(), 7911 S->getRParenLoc()); 7912 } 7913 7914 template<typename Derived> 7915 StmtResult 7916 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7917 ArrayRef<Token> AsmToks = llvm::ArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7918 7919 bool HadError = false, HadChange = false; 7920 7921 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7922 SmallVector<Expr*, 8> TransformedExprs; 7923 TransformedExprs.reserve(SrcExprs.size()); 7924 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7925 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7926 if (!Result.isUsable()) { 7927 HadError = true; 7928 } else { 7929 HadChange |= (Result.get() != SrcExprs[i]); 7930 TransformedExprs.push_back(Result.get()); 7931 } 7932 } 7933 7934 if (HadError) return StmtError(); 7935 if (!HadChange && !getDerived().AlwaysRebuild()) 7936 return Owned(S); 7937 7938 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7939 AsmToks, S->getAsmString(), 7940 S->getNumOutputs(), S->getNumInputs(), 7941 S->getAllConstraints(), S->getClobbers(), 7942 TransformedExprs, S->getEndLoc()); 7943 } 7944 7945 // C++ Coroutines TS 7946 7947 template<typename Derived> 7948 StmtResult 7949 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7950 auto *ScopeInfo = SemaRef.getCurFunction(); 7951 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7952 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7953 ScopeInfo->NeedsCoroutineSuspends && 7954 ScopeInfo->CoroutineSuspends.first == nullptr && 7955 ScopeInfo->CoroutineSuspends.second == nullptr && 7956 "expected clean scope info"); 7957 7958 // Set that we have (possibly-invalid) suspend points before we do anything 7959 // that may fail. 7960 ScopeInfo->setNeedsCoroutineSuspends(false); 7961 7962 // We re-build the coroutine promise object (and the coroutine parameters its 7963 // type and constructor depend on) based on the types used in our current 7964 // function. We must do so, and set it on the current FunctionScopeInfo, 7965 // before attempting to transform the other parts of the coroutine body 7966 // statement, such as the implicit suspend statements (because those 7967 // statements reference the FunctionScopeInfo::CoroutinePromise). 7968 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7969 return StmtError(); 7970 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7971 if (!Promise) 7972 return StmtError(); 7973 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7974 ScopeInfo->CoroutinePromise = Promise; 7975 7976 // Transform the implicit coroutine statements constructed using dependent 7977 // types during the previous parse: initial and final suspensions, the return 7978 // object, and others. We also transform the coroutine function's body. 7979 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7980 if (InitSuspend.isInvalid()) 7981 return StmtError(); 7982 StmtResult FinalSuspend = 7983 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7984 if (FinalSuspend.isInvalid() || 7985 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7986 return StmtError(); 7987 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7988 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7989 7990 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7991 if (BodyRes.isInvalid()) 7992 return StmtError(); 7993 7994 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7995 if (Builder.isInvalid()) 7996 return StmtError(); 7997 7998 Expr *ReturnObject = S->getReturnValueInit(); 7999 assert(ReturnObject && "the return object is expected to be valid"); 8000 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 8001 /*NoCopyInit*/ false); 8002 if (Res.isInvalid()) 8003 return StmtError(); 8004 Builder.ReturnValue = Res.get(); 8005 8006 // If during the previous parse the coroutine still had a dependent promise 8007 // statement, we may need to build some implicit coroutine statements 8008 // (such as exception and fallthrough handlers) for the first time. 8009 if (S->hasDependentPromiseType()) { 8010 // We can only build these statements, however, if the current promise type 8011 // is not dependent. 8012 if (!Promise->getType()->isDependentType()) { 8013 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 8014 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 8015 "these nodes should not have been built yet"); 8016 if (!Builder.buildDependentStatements()) 8017 return StmtError(); 8018 } 8019 } else { 8020 if (auto *OnFallthrough = S->getFallthroughHandler()) { 8021 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 8022 if (Res.isInvalid()) 8023 return StmtError(); 8024 Builder.OnFallthrough = Res.get(); 8025 } 8026 8027 if (auto *OnException = S->getExceptionHandler()) { 8028 StmtResult Res = getDerived().TransformStmt(OnException); 8029 if (Res.isInvalid()) 8030 return StmtError(); 8031 Builder.OnException = Res.get(); 8032 } 8033 8034 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 8035 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 8036 if (Res.isInvalid()) 8037 return StmtError(); 8038 Builder.ReturnStmtOnAllocFailure = Res.get(); 8039 } 8040 8041 // Transform any additional statements we may have already built 8042 assert(S->getAllocate() && S->getDeallocate() && 8043 "allocation and deallocation calls must already be built"); 8044 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 8045 if (AllocRes.isInvalid()) 8046 return StmtError(); 8047 Builder.Allocate = AllocRes.get(); 8048 8049 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 8050 if (DeallocRes.isInvalid()) 8051 return StmtError(); 8052 Builder.Deallocate = DeallocRes.get(); 8053 8054 if (auto *ReturnStmt = S->getReturnStmt()) { 8055 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 8056 if (Res.isInvalid()) 8057 return StmtError(); 8058 Builder.ReturnStmt = Res.get(); 8059 } 8060 } 8061 8062 return getDerived().RebuildCoroutineBodyStmt(Builder); 8063 } 8064 8065 template<typename Derived> 8066 StmtResult 8067 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 8068 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 8069 /*NotCopyInit*/false); 8070 if (Result.isInvalid()) 8071 return StmtError(); 8072 8073 // Always rebuild; we don't know if this needs to be injected into a new 8074 // context or if the promise type has changed. 8075 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 8076 S->isImplicit()); 8077 } 8078 8079 template <typename Derived> 8080 ExprResult TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 8081 ExprResult Operand = getDerived().TransformInitializer(E->getOperand(), 8082 /*NotCopyInit*/ false); 8083 if (Operand.isInvalid()) 8084 return ExprError(); 8085 8086 // Rebuild the common-expr from the operand rather than transforming it 8087 // separately. 8088 8089 // FIXME: getCurScope() should not be used during template instantiation. 8090 // We should pick up the set of unqualified lookup results for operator 8091 // co_await during the initial parse. 8092 ExprResult Lookup = getSema().BuildOperatorCoawaitLookupExpr( 8093 getSema().getCurScope(), E->getKeywordLoc()); 8094 8095 // Always rebuild; we don't know if this needs to be injected into a new 8096 // context or if the promise type has changed. 8097 return getDerived().RebuildCoawaitExpr( 8098 E->getKeywordLoc(), Operand.get(), 8099 cast<UnresolvedLookupExpr>(Lookup.get()), E->isImplicit()); 8100 } 8101 8102 template <typename Derived> 8103 ExprResult 8104 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 8105 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 8106 /*NotCopyInit*/ false); 8107 if (OperandResult.isInvalid()) 8108 return ExprError(); 8109 8110 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 8111 E->getOperatorCoawaitLookup()); 8112 8113 if (LookupResult.isInvalid()) 8114 return ExprError(); 8115 8116 // Always rebuild; we don't know if this needs to be injected into a new 8117 // context or if the promise type has changed. 8118 return getDerived().RebuildDependentCoawaitExpr( 8119 E->getKeywordLoc(), OperandResult.get(), 8120 cast<UnresolvedLookupExpr>(LookupResult.get())); 8121 } 8122 8123 template<typename Derived> 8124 ExprResult 8125 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 8126 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 8127 /*NotCopyInit*/false); 8128 if (Result.isInvalid()) 8129 return ExprError(); 8130 8131 // Always rebuild; we don't know if this needs to be injected into a new 8132 // context or if the promise type has changed. 8133 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 8134 } 8135 8136 // Objective-C Statements. 8137 8138 template<typename Derived> 8139 StmtResult 8140 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 8141 // Transform the body of the @try. 8142 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 8143 if (TryBody.isInvalid()) 8144 return StmtError(); 8145 8146 // Transform the @catch statements (if present). 8147 bool AnyCatchChanged = false; 8148 SmallVector<Stmt*, 8> CatchStmts; 8149 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8150 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8151 if (Catch.isInvalid()) 8152 return StmtError(); 8153 if (Catch.get() != S->getCatchStmt(I)) 8154 AnyCatchChanged = true; 8155 CatchStmts.push_back(Catch.get()); 8156 } 8157 8158 // Transform the @finally statement (if present). 8159 StmtResult Finally; 8160 if (S->getFinallyStmt()) { 8161 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8162 if (Finally.isInvalid()) 8163 return StmtError(); 8164 } 8165 8166 // If nothing changed, just retain this statement. 8167 if (!getDerived().AlwaysRebuild() && 8168 TryBody.get() == S->getTryBody() && 8169 !AnyCatchChanged && 8170 Finally.get() == S->getFinallyStmt()) 8171 return S; 8172 8173 // Build a new statement. 8174 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8175 CatchStmts, Finally.get()); 8176 } 8177 8178 template<typename Derived> 8179 StmtResult 8180 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8181 // Transform the @catch parameter, if there is one. 8182 VarDecl *Var = nullptr; 8183 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8184 TypeSourceInfo *TSInfo = nullptr; 8185 if (FromVar->getTypeSourceInfo()) { 8186 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8187 if (!TSInfo) 8188 return StmtError(); 8189 } 8190 8191 QualType T; 8192 if (TSInfo) 8193 T = TSInfo->getType(); 8194 else { 8195 T = getDerived().TransformType(FromVar->getType()); 8196 if (T.isNull()) 8197 return StmtError(); 8198 } 8199 8200 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8201 if (!Var) 8202 return StmtError(); 8203 } 8204 8205 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8206 if (Body.isInvalid()) 8207 return StmtError(); 8208 8209 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8210 S->getRParenLoc(), 8211 Var, Body.get()); 8212 } 8213 8214 template<typename Derived> 8215 StmtResult 8216 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8217 // Transform the body. 8218 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8219 if (Body.isInvalid()) 8220 return StmtError(); 8221 8222 // If nothing changed, just retain this statement. 8223 if (!getDerived().AlwaysRebuild() && 8224 Body.get() == S->getFinallyBody()) 8225 return S; 8226 8227 // Build a new statement. 8228 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8229 Body.get()); 8230 } 8231 8232 template<typename Derived> 8233 StmtResult 8234 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8235 ExprResult Operand; 8236 if (S->getThrowExpr()) { 8237 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8238 if (Operand.isInvalid()) 8239 return StmtError(); 8240 } 8241 8242 if (!getDerived().AlwaysRebuild() && 8243 Operand.get() == S->getThrowExpr()) 8244 return S; 8245 8246 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8247 } 8248 8249 template<typename Derived> 8250 StmtResult 8251 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8252 ObjCAtSynchronizedStmt *S) { 8253 // Transform the object we are locking. 8254 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8255 if (Object.isInvalid()) 8256 return StmtError(); 8257 Object = 8258 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8259 Object.get()); 8260 if (Object.isInvalid()) 8261 return StmtError(); 8262 8263 // Transform the body. 8264 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8265 if (Body.isInvalid()) 8266 return StmtError(); 8267 8268 // If nothing change, just retain the current statement. 8269 if (!getDerived().AlwaysRebuild() && 8270 Object.get() == S->getSynchExpr() && 8271 Body.get() == S->getSynchBody()) 8272 return S; 8273 8274 // Build a new statement. 8275 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8276 Object.get(), Body.get()); 8277 } 8278 8279 template<typename Derived> 8280 StmtResult 8281 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8282 ObjCAutoreleasePoolStmt *S) { 8283 // Transform the body. 8284 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8285 if (Body.isInvalid()) 8286 return StmtError(); 8287 8288 // If nothing changed, just retain this statement. 8289 if (!getDerived().AlwaysRebuild() && 8290 Body.get() == S->getSubStmt()) 8291 return S; 8292 8293 // Build a new statement. 8294 return getDerived().RebuildObjCAutoreleasePoolStmt( 8295 S->getAtLoc(), Body.get()); 8296 } 8297 8298 template<typename Derived> 8299 StmtResult 8300 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8301 ObjCForCollectionStmt *S) { 8302 // Transform the element statement. 8303 StmtResult Element = 8304 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8305 if (Element.isInvalid()) 8306 return StmtError(); 8307 8308 // Transform the collection expression. 8309 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8310 if (Collection.isInvalid()) 8311 return StmtError(); 8312 8313 // Transform the body. 8314 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8315 if (Body.isInvalid()) 8316 return StmtError(); 8317 8318 // If nothing changed, just retain this statement. 8319 if (!getDerived().AlwaysRebuild() && 8320 Element.get() == S->getElement() && 8321 Collection.get() == S->getCollection() && 8322 Body.get() == S->getBody()) 8323 return S; 8324 8325 // Build a new statement. 8326 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8327 Element.get(), 8328 Collection.get(), 8329 S->getRParenLoc(), 8330 Body.get()); 8331 } 8332 8333 template <typename Derived> 8334 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8335 // Transform the exception declaration, if any. 8336 VarDecl *Var = nullptr; 8337 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8338 TypeSourceInfo *T = 8339 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8340 if (!T) 8341 return StmtError(); 8342 8343 Var = getDerived().RebuildExceptionDecl( 8344 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8345 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8346 if (!Var || Var->isInvalidDecl()) 8347 return StmtError(); 8348 } 8349 8350 // Transform the actual exception handler. 8351 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8352 if (Handler.isInvalid()) 8353 return StmtError(); 8354 8355 if (!getDerived().AlwaysRebuild() && !Var && 8356 Handler.get() == S->getHandlerBlock()) 8357 return S; 8358 8359 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8360 } 8361 8362 template <typename Derived> 8363 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8364 // Transform the try block itself. 8365 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8366 if (TryBlock.isInvalid()) 8367 return StmtError(); 8368 8369 // Transform the handlers. 8370 bool HandlerChanged = false; 8371 SmallVector<Stmt *, 8> Handlers; 8372 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8373 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8374 if (Handler.isInvalid()) 8375 return StmtError(); 8376 8377 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8378 Handlers.push_back(Handler.getAs<Stmt>()); 8379 } 8380 8381 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8382 !HandlerChanged) 8383 return S; 8384 8385 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8386 Handlers); 8387 } 8388 8389 template<typename Derived> 8390 StmtResult 8391 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8392 StmtResult Init = 8393 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8394 if (Init.isInvalid()) 8395 return StmtError(); 8396 8397 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8398 if (Range.isInvalid()) 8399 return StmtError(); 8400 8401 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8402 if (Begin.isInvalid()) 8403 return StmtError(); 8404 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8405 if (End.isInvalid()) 8406 return StmtError(); 8407 8408 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8409 if (Cond.isInvalid()) 8410 return StmtError(); 8411 if (Cond.get()) 8412 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8413 if (Cond.isInvalid()) 8414 return StmtError(); 8415 if (Cond.get()) 8416 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8417 8418 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8419 if (Inc.isInvalid()) 8420 return StmtError(); 8421 if (Inc.get()) 8422 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8423 8424 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8425 if (LoopVar.isInvalid()) 8426 return StmtError(); 8427 8428 StmtResult NewStmt = S; 8429 if (getDerived().AlwaysRebuild() || 8430 Init.get() != S->getInit() || 8431 Range.get() != S->getRangeStmt() || 8432 Begin.get() != S->getBeginStmt() || 8433 End.get() != S->getEndStmt() || 8434 Cond.get() != S->getCond() || 8435 Inc.get() != S->getInc() || 8436 LoopVar.get() != S->getLoopVarStmt()) { 8437 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8438 S->getCoawaitLoc(), Init.get(), 8439 S->getColonLoc(), Range.get(), 8440 Begin.get(), End.get(), 8441 Cond.get(), 8442 Inc.get(), LoopVar.get(), 8443 S->getRParenLoc()); 8444 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8445 // Might not have attached any initializer to the loop variable. 8446 getSema().ActOnInitializerError( 8447 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8448 return StmtError(); 8449 } 8450 } 8451 8452 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8453 if (Body.isInvalid()) 8454 return StmtError(); 8455 8456 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8457 // it now so we have a new statement to attach the body to. 8458 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8459 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8460 S->getCoawaitLoc(), Init.get(), 8461 S->getColonLoc(), Range.get(), 8462 Begin.get(), End.get(), 8463 Cond.get(), 8464 Inc.get(), LoopVar.get(), 8465 S->getRParenLoc()); 8466 if (NewStmt.isInvalid()) 8467 return StmtError(); 8468 } 8469 8470 if (NewStmt.get() == S) 8471 return S; 8472 8473 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8474 } 8475 8476 template<typename Derived> 8477 StmtResult 8478 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8479 MSDependentExistsStmt *S) { 8480 // Transform the nested-name-specifier, if any. 8481 NestedNameSpecifierLoc QualifierLoc; 8482 if (S->getQualifierLoc()) { 8483 QualifierLoc 8484 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8485 if (!QualifierLoc) 8486 return StmtError(); 8487 } 8488 8489 // Transform the declaration name. 8490 DeclarationNameInfo NameInfo = S->getNameInfo(); 8491 if (NameInfo.getName()) { 8492 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8493 if (!NameInfo.getName()) 8494 return StmtError(); 8495 } 8496 8497 // Check whether anything changed. 8498 if (!getDerived().AlwaysRebuild() && 8499 QualifierLoc == S->getQualifierLoc() && 8500 NameInfo.getName() == S->getNameInfo().getName()) 8501 return S; 8502 8503 // Determine whether this name exists, if we can. 8504 CXXScopeSpec SS; 8505 SS.Adopt(QualifierLoc); 8506 bool Dependent = false; 8507 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8508 case Sema::IER_Exists: 8509 if (S->isIfExists()) 8510 break; 8511 8512 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8513 8514 case Sema::IER_DoesNotExist: 8515 if (S->isIfNotExists()) 8516 break; 8517 8518 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8519 8520 case Sema::IER_Dependent: 8521 Dependent = true; 8522 break; 8523 8524 case Sema::IER_Error: 8525 return StmtError(); 8526 } 8527 8528 // We need to continue with the instantiation, so do so now. 8529 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8530 if (SubStmt.isInvalid()) 8531 return StmtError(); 8532 8533 // If we have resolved the name, just transform to the substatement. 8534 if (!Dependent) 8535 return SubStmt; 8536 8537 // The name is still dependent, so build a dependent expression again. 8538 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8539 S->isIfExists(), 8540 QualifierLoc, 8541 NameInfo, 8542 SubStmt.get()); 8543 } 8544 8545 template<typename Derived> 8546 ExprResult 8547 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8548 NestedNameSpecifierLoc QualifierLoc; 8549 if (E->getQualifierLoc()) { 8550 QualifierLoc 8551 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8552 if (!QualifierLoc) 8553 return ExprError(); 8554 } 8555 8556 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8557 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8558 if (!PD) 8559 return ExprError(); 8560 8561 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8562 if (Base.isInvalid()) 8563 return ExprError(); 8564 8565 return new (SemaRef.getASTContext()) 8566 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8567 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8568 QualifierLoc, E->getMemberLoc()); 8569 } 8570 8571 template <typename Derived> 8572 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8573 MSPropertySubscriptExpr *E) { 8574 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8575 if (BaseRes.isInvalid()) 8576 return ExprError(); 8577 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8578 if (IdxRes.isInvalid()) 8579 return ExprError(); 8580 8581 if (!getDerived().AlwaysRebuild() && 8582 BaseRes.get() == E->getBase() && 8583 IdxRes.get() == E->getIdx()) 8584 return E; 8585 8586 return getDerived().RebuildArraySubscriptExpr( 8587 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8588 } 8589 8590 template <typename Derived> 8591 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8592 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8593 if (TryBlock.isInvalid()) 8594 return StmtError(); 8595 8596 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8597 if (Handler.isInvalid()) 8598 return StmtError(); 8599 8600 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8601 Handler.get() == S->getHandler()) 8602 return S; 8603 8604 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8605 TryBlock.get(), Handler.get()); 8606 } 8607 8608 template <typename Derived> 8609 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8610 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8611 if (Block.isInvalid()) 8612 return StmtError(); 8613 8614 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8615 } 8616 8617 template <typename Derived> 8618 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8619 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8620 if (FilterExpr.isInvalid()) 8621 return StmtError(); 8622 8623 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8624 if (Block.isInvalid()) 8625 return StmtError(); 8626 8627 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8628 Block.get()); 8629 } 8630 8631 template <typename Derived> 8632 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8633 if (isa<SEHFinallyStmt>(Handler)) 8634 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8635 else 8636 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8637 } 8638 8639 template<typename Derived> 8640 StmtResult 8641 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8642 return S; 8643 } 8644 8645 //===----------------------------------------------------------------------===// 8646 // OpenMP directive transformation 8647 //===----------------------------------------------------------------------===// 8648 8649 template <typename Derived> 8650 StmtResult 8651 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8652 // OMPCanonicalLoops are eliminated during transformation, since they will be 8653 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8654 // after transformation. 8655 return getDerived().TransformStmt(L->getLoopStmt()); 8656 } 8657 8658 template <typename Derived> 8659 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8660 OMPExecutableDirective *D) { 8661 8662 // Transform the clauses 8663 llvm::SmallVector<OMPClause *, 16> TClauses; 8664 ArrayRef<OMPClause *> Clauses = D->clauses(); 8665 TClauses.reserve(Clauses.size()); 8666 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8667 I != E; ++I) { 8668 if (*I) { 8669 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8670 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8671 getDerived().getSema().EndOpenMPClause(); 8672 if (Clause) 8673 TClauses.push_back(Clause); 8674 } else { 8675 TClauses.push_back(nullptr); 8676 } 8677 } 8678 StmtResult AssociatedStmt; 8679 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8680 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8681 /*CurScope=*/nullptr); 8682 StmtResult Body; 8683 { 8684 Sema::CompoundScopeRAII CompoundScope(getSema()); 8685 Stmt *CS; 8686 if (D->getDirectiveKind() == OMPD_atomic || 8687 D->getDirectiveKind() == OMPD_critical || 8688 D->getDirectiveKind() == OMPD_section || 8689 D->getDirectiveKind() == OMPD_master) 8690 CS = D->getAssociatedStmt(); 8691 else 8692 CS = D->getRawStmt(); 8693 Body = getDerived().TransformStmt(CS); 8694 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8695 getSema().getLangOpts().OpenMPIRBuilder) 8696 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8697 } 8698 AssociatedStmt = 8699 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8700 if (AssociatedStmt.isInvalid()) { 8701 return StmtError(); 8702 } 8703 } 8704 if (TClauses.size() != Clauses.size()) { 8705 return StmtError(); 8706 } 8707 8708 // Transform directive name for 'omp critical' directive. 8709 DeclarationNameInfo DirName; 8710 if (D->getDirectiveKind() == OMPD_critical) { 8711 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8712 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8713 } 8714 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8715 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8716 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8717 } else if (D->getDirectiveKind() == OMPD_cancel) { 8718 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8719 } 8720 8721 return getDerived().RebuildOMPExecutableDirective( 8722 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8723 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8724 } 8725 8726 template <typename Derived> 8727 StmtResult 8728 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8729 // TODO: Fix This 8730 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8731 << getOpenMPDirectiveName(D->getDirectiveKind()); 8732 return StmtError(); 8733 } 8734 8735 template <typename Derived> 8736 StmtResult 8737 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8738 DeclarationNameInfo DirName; 8739 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8740 D->getBeginLoc()); 8741 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8742 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8743 return Res; 8744 } 8745 8746 template <typename Derived> 8747 StmtResult 8748 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8749 DeclarationNameInfo DirName; 8750 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8751 D->getBeginLoc()); 8752 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8753 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8754 return Res; 8755 } 8756 8757 template <typename Derived> 8758 StmtResult 8759 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8760 DeclarationNameInfo DirName; 8761 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8762 nullptr, D->getBeginLoc()); 8763 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8764 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8765 return Res; 8766 } 8767 8768 template <typename Derived> 8769 StmtResult 8770 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8771 DeclarationNameInfo DirName; 8772 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8773 nullptr, D->getBeginLoc()); 8774 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8775 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8776 return Res; 8777 } 8778 8779 template <typename Derived> 8780 StmtResult 8781 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8782 DeclarationNameInfo DirName; 8783 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8784 D->getBeginLoc()); 8785 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8786 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8787 return Res; 8788 } 8789 8790 template <typename Derived> 8791 StmtResult 8792 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8793 DeclarationNameInfo DirName; 8794 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8795 D->getBeginLoc()); 8796 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8797 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8798 return Res; 8799 } 8800 8801 template <typename Derived> 8802 StmtResult 8803 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8804 DeclarationNameInfo DirName; 8805 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8806 D->getBeginLoc()); 8807 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8808 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8809 return Res; 8810 } 8811 8812 template <typename Derived> 8813 StmtResult 8814 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8815 DeclarationNameInfo DirName; 8816 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8817 D->getBeginLoc()); 8818 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8819 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8820 return Res; 8821 } 8822 8823 template <typename Derived> 8824 StmtResult 8825 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8826 DeclarationNameInfo DirName; 8827 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8828 D->getBeginLoc()); 8829 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8830 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8831 return Res; 8832 } 8833 8834 template <typename Derived> 8835 StmtResult 8836 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8837 DeclarationNameInfo DirName; 8838 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8839 D->getBeginLoc()); 8840 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8841 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8842 return Res; 8843 } 8844 8845 template <typename Derived> 8846 StmtResult 8847 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8848 getDerived().getSema().StartOpenMPDSABlock( 8849 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8850 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8851 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8852 return Res; 8853 } 8854 8855 template <typename Derived> 8856 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8857 OMPParallelForDirective *D) { 8858 DeclarationNameInfo DirName; 8859 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8860 nullptr, D->getBeginLoc()); 8861 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8862 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8863 return Res; 8864 } 8865 8866 template <typename Derived> 8867 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8868 OMPParallelForSimdDirective *D) { 8869 DeclarationNameInfo DirName; 8870 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8871 nullptr, D->getBeginLoc()); 8872 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8873 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8874 return Res; 8875 } 8876 8877 template <typename Derived> 8878 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8879 OMPParallelMasterDirective *D) { 8880 DeclarationNameInfo DirName; 8881 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8882 nullptr, D->getBeginLoc()); 8883 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8884 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8885 return Res; 8886 } 8887 8888 template <typename Derived> 8889 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedDirective( 8890 OMPParallelMaskedDirective *D) { 8891 DeclarationNameInfo DirName; 8892 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_masked, DirName, 8893 nullptr, D->getBeginLoc()); 8894 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8895 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8896 return Res; 8897 } 8898 8899 template <typename Derived> 8900 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8901 OMPParallelSectionsDirective *D) { 8902 DeclarationNameInfo DirName; 8903 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8904 nullptr, D->getBeginLoc()); 8905 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8906 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8907 return Res; 8908 } 8909 8910 template <typename Derived> 8911 StmtResult 8912 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8913 DeclarationNameInfo DirName; 8914 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8915 D->getBeginLoc()); 8916 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8917 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8918 return Res; 8919 } 8920 8921 template <typename Derived> 8922 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8923 OMPTaskyieldDirective *D) { 8924 DeclarationNameInfo DirName; 8925 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8926 D->getBeginLoc()); 8927 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8928 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8929 return Res; 8930 } 8931 8932 template <typename Derived> 8933 StmtResult 8934 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8935 DeclarationNameInfo DirName; 8936 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8937 D->getBeginLoc()); 8938 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8939 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8940 return Res; 8941 } 8942 8943 template <typename Derived> 8944 StmtResult 8945 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8946 DeclarationNameInfo DirName; 8947 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8948 D->getBeginLoc()); 8949 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8950 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8951 return Res; 8952 } 8953 8954 template <typename Derived> 8955 StmtResult 8956 TreeTransform<Derived>::TransformOMPErrorDirective(OMPErrorDirective *D) { 8957 DeclarationNameInfo DirName; 8958 getDerived().getSema().StartOpenMPDSABlock(OMPD_error, DirName, nullptr, 8959 D->getBeginLoc()); 8960 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8961 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8962 return Res; 8963 } 8964 8965 template <typename Derived> 8966 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8967 OMPTaskgroupDirective *D) { 8968 DeclarationNameInfo DirName; 8969 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8970 D->getBeginLoc()); 8971 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8972 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8973 return Res; 8974 } 8975 8976 template <typename Derived> 8977 StmtResult 8978 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8979 DeclarationNameInfo DirName; 8980 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8981 D->getBeginLoc()); 8982 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8983 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8984 return Res; 8985 } 8986 8987 template <typename Derived> 8988 StmtResult 8989 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8990 DeclarationNameInfo DirName; 8991 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8992 D->getBeginLoc()); 8993 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8994 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8995 return Res; 8996 } 8997 8998 template <typename Derived> 8999 StmtResult 9000 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 9001 DeclarationNameInfo DirName; 9002 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 9003 D->getBeginLoc()); 9004 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9005 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9006 return Res; 9007 } 9008 9009 template <typename Derived> 9010 StmtResult 9011 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 9012 DeclarationNameInfo DirName; 9013 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 9014 D->getBeginLoc()); 9015 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9016 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9017 return Res; 9018 } 9019 9020 template <typename Derived> 9021 StmtResult 9022 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 9023 DeclarationNameInfo DirName; 9024 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 9025 D->getBeginLoc()); 9026 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9027 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9028 return Res; 9029 } 9030 9031 template <typename Derived> 9032 StmtResult 9033 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 9034 DeclarationNameInfo DirName; 9035 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 9036 D->getBeginLoc()); 9037 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9038 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9039 return Res; 9040 } 9041 9042 template <typename Derived> 9043 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 9044 OMPTargetDataDirective *D) { 9045 DeclarationNameInfo DirName; 9046 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 9047 D->getBeginLoc()); 9048 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9049 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9050 return Res; 9051 } 9052 9053 template <typename Derived> 9054 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 9055 OMPTargetEnterDataDirective *D) { 9056 DeclarationNameInfo DirName; 9057 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 9058 nullptr, D->getBeginLoc()); 9059 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9060 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9061 return Res; 9062 } 9063 9064 template <typename Derived> 9065 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 9066 OMPTargetExitDataDirective *D) { 9067 DeclarationNameInfo DirName; 9068 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 9069 nullptr, D->getBeginLoc()); 9070 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9071 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9072 return Res; 9073 } 9074 9075 template <typename Derived> 9076 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 9077 OMPTargetParallelDirective *D) { 9078 DeclarationNameInfo DirName; 9079 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 9080 nullptr, D->getBeginLoc()); 9081 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9082 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9083 return Res; 9084 } 9085 9086 template <typename Derived> 9087 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 9088 OMPTargetParallelForDirective *D) { 9089 DeclarationNameInfo DirName; 9090 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 9091 nullptr, D->getBeginLoc()); 9092 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9093 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9094 return Res; 9095 } 9096 9097 template <typename Derived> 9098 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 9099 OMPTargetUpdateDirective *D) { 9100 DeclarationNameInfo DirName; 9101 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 9102 nullptr, D->getBeginLoc()); 9103 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9104 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9105 return Res; 9106 } 9107 9108 template <typename Derived> 9109 StmtResult 9110 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 9111 DeclarationNameInfo DirName; 9112 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 9113 D->getBeginLoc()); 9114 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9115 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9116 return Res; 9117 } 9118 9119 template <typename Derived> 9120 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 9121 OMPCancellationPointDirective *D) { 9122 DeclarationNameInfo DirName; 9123 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 9124 nullptr, D->getBeginLoc()); 9125 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9126 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9127 return Res; 9128 } 9129 9130 template <typename Derived> 9131 StmtResult 9132 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 9133 DeclarationNameInfo DirName; 9134 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 9135 D->getBeginLoc()); 9136 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9137 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9138 return Res; 9139 } 9140 9141 template <typename Derived> 9142 StmtResult 9143 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 9144 DeclarationNameInfo DirName; 9145 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 9146 D->getBeginLoc()); 9147 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9148 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9149 return Res; 9150 } 9151 9152 template <typename Derived> 9153 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 9154 OMPTaskLoopSimdDirective *D) { 9155 DeclarationNameInfo DirName; 9156 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 9157 nullptr, D->getBeginLoc()); 9158 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9159 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9160 return Res; 9161 } 9162 9163 template <typename Derived> 9164 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 9165 OMPMasterTaskLoopDirective *D) { 9166 DeclarationNameInfo DirName; 9167 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 9168 nullptr, D->getBeginLoc()); 9169 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9170 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9171 return Res; 9172 } 9173 9174 template <typename Derived> 9175 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopDirective( 9176 OMPMaskedTaskLoopDirective *D) { 9177 DeclarationNameInfo DirName; 9178 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop, DirName, 9179 nullptr, D->getBeginLoc()); 9180 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9181 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9182 return Res; 9183 } 9184 9185 template <typename Derived> 9186 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9187 OMPMasterTaskLoopSimdDirective *D) { 9188 DeclarationNameInfo DirName; 9189 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9190 nullptr, D->getBeginLoc()); 9191 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9192 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9193 return Res; 9194 } 9195 9196 template <typename Derived> 9197 StmtResult TreeTransform<Derived>::TransformOMPMaskedTaskLoopSimdDirective( 9198 OMPMaskedTaskLoopSimdDirective *D) { 9199 DeclarationNameInfo DirName; 9200 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked_taskloop_simd, DirName, 9201 nullptr, D->getBeginLoc()); 9202 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9203 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9204 return Res; 9205 } 9206 9207 template <typename Derived> 9208 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9209 OMPParallelMasterTaskLoopDirective *D) { 9210 DeclarationNameInfo DirName; 9211 getDerived().getSema().StartOpenMPDSABlock( 9212 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9213 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9214 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9215 return Res; 9216 } 9217 9218 template <typename Derived> 9219 StmtResult TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopDirective( 9220 OMPParallelMaskedTaskLoopDirective *D) { 9221 DeclarationNameInfo DirName; 9222 getDerived().getSema().StartOpenMPDSABlock( 9223 OMPD_parallel_masked_taskloop, DirName, nullptr, D->getBeginLoc()); 9224 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9225 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9226 return Res; 9227 } 9228 9229 template <typename Derived> 9230 StmtResult 9231 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9232 OMPParallelMasterTaskLoopSimdDirective *D) { 9233 DeclarationNameInfo DirName; 9234 getDerived().getSema().StartOpenMPDSABlock( 9235 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9236 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9237 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9238 return Res; 9239 } 9240 9241 template <typename Derived> 9242 StmtResult 9243 TreeTransform<Derived>::TransformOMPParallelMaskedTaskLoopSimdDirective( 9244 OMPParallelMaskedTaskLoopSimdDirective *D) { 9245 DeclarationNameInfo DirName; 9246 getDerived().getSema().StartOpenMPDSABlock( 9247 OMPD_parallel_masked_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9248 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9249 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9250 return Res; 9251 } 9252 9253 template <typename Derived> 9254 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9255 OMPDistributeDirective *D) { 9256 DeclarationNameInfo DirName; 9257 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9258 D->getBeginLoc()); 9259 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9260 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9261 return Res; 9262 } 9263 9264 template <typename Derived> 9265 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9266 OMPDistributeParallelForDirective *D) { 9267 DeclarationNameInfo DirName; 9268 getDerived().getSema().StartOpenMPDSABlock( 9269 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9270 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9271 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9272 return Res; 9273 } 9274 9275 template <typename Derived> 9276 StmtResult 9277 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9278 OMPDistributeParallelForSimdDirective *D) { 9279 DeclarationNameInfo DirName; 9280 getDerived().getSema().StartOpenMPDSABlock( 9281 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9282 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9283 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9284 return Res; 9285 } 9286 9287 template <typename Derived> 9288 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9289 OMPDistributeSimdDirective *D) { 9290 DeclarationNameInfo DirName; 9291 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9292 nullptr, D->getBeginLoc()); 9293 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9294 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9295 return Res; 9296 } 9297 9298 template <typename Derived> 9299 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9300 OMPTargetParallelForSimdDirective *D) { 9301 DeclarationNameInfo DirName; 9302 getDerived().getSema().StartOpenMPDSABlock( 9303 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9304 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9305 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9306 return Res; 9307 } 9308 9309 template <typename Derived> 9310 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9311 OMPTargetSimdDirective *D) { 9312 DeclarationNameInfo DirName; 9313 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9314 D->getBeginLoc()); 9315 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9316 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9317 return Res; 9318 } 9319 9320 template <typename Derived> 9321 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9322 OMPTeamsDistributeDirective *D) { 9323 DeclarationNameInfo DirName; 9324 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9325 nullptr, D->getBeginLoc()); 9326 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9327 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9328 return Res; 9329 } 9330 9331 template <typename Derived> 9332 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9333 OMPTeamsDistributeSimdDirective *D) { 9334 DeclarationNameInfo DirName; 9335 getDerived().getSema().StartOpenMPDSABlock( 9336 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9337 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9338 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9339 return Res; 9340 } 9341 9342 template <typename Derived> 9343 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9344 OMPTeamsDistributeParallelForSimdDirective *D) { 9345 DeclarationNameInfo DirName; 9346 getDerived().getSema().StartOpenMPDSABlock( 9347 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9348 D->getBeginLoc()); 9349 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9350 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9351 return Res; 9352 } 9353 9354 template <typename Derived> 9355 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9356 OMPTeamsDistributeParallelForDirective *D) { 9357 DeclarationNameInfo DirName; 9358 getDerived().getSema().StartOpenMPDSABlock( 9359 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9360 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9361 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9362 return Res; 9363 } 9364 9365 template <typename Derived> 9366 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9367 OMPTargetTeamsDirective *D) { 9368 DeclarationNameInfo DirName; 9369 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9370 nullptr, D->getBeginLoc()); 9371 auto Res = getDerived().TransformOMPExecutableDirective(D); 9372 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9373 return Res; 9374 } 9375 9376 template <typename Derived> 9377 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9378 OMPTargetTeamsDistributeDirective *D) { 9379 DeclarationNameInfo DirName; 9380 getDerived().getSema().StartOpenMPDSABlock( 9381 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9382 auto Res = getDerived().TransformOMPExecutableDirective(D); 9383 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9384 return Res; 9385 } 9386 9387 template <typename Derived> 9388 StmtResult 9389 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9390 OMPTargetTeamsDistributeParallelForDirective *D) { 9391 DeclarationNameInfo DirName; 9392 getDerived().getSema().StartOpenMPDSABlock( 9393 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9394 D->getBeginLoc()); 9395 auto Res = getDerived().TransformOMPExecutableDirective(D); 9396 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9397 return Res; 9398 } 9399 9400 template <typename Derived> 9401 StmtResult TreeTransform<Derived>:: 9402 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9403 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9404 DeclarationNameInfo DirName; 9405 getDerived().getSema().StartOpenMPDSABlock( 9406 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9407 D->getBeginLoc()); 9408 auto Res = getDerived().TransformOMPExecutableDirective(D); 9409 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9410 return Res; 9411 } 9412 9413 template <typename Derived> 9414 StmtResult 9415 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9416 OMPTargetTeamsDistributeSimdDirective *D) { 9417 DeclarationNameInfo DirName; 9418 getDerived().getSema().StartOpenMPDSABlock( 9419 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9420 auto Res = getDerived().TransformOMPExecutableDirective(D); 9421 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9422 return Res; 9423 } 9424 9425 template <typename Derived> 9426 StmtResult 9427 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9428 DeclarationNameInfo DirName; 9429 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9430 D->getBeginLoc()); 9431 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9432 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9433 return Res; 9434 } 9435 9436 template <typename Derived> 9437 StmtResult 9438 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9439 DeclarationNameInfo DirName; 9440 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9441 D->getBeginLoc()); 9442 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9443 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9444 return Res; 9445 } 9446 9447 template <typename Derived> 9448 StmtResult 9449 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9450 DeclarationNameInfo DirName; 9451 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9452 D->getBeginLoc()); 9453 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9454 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9455 return Res; 9456 } 9457 9458 template <typename Derived> 9459 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9460 OMPGenericLoopDirective *D) { 9461 DeclarationNameInfo DirName; 9462 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9463 D->getBeginLoc()); 9464 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9465 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9466 return Res; 9467 } 9468 9469 template <typename Derived> 9470 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9471 OMPTeamsGenericLoopDirective *D) { 9472 DeclarationNameInfo DirName; 9473 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9474 D->getBeginLoc()); 9475 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9476 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9477 return Res; 9478 } 9479 9480 template <typename Derived> 9481 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9482 OMPTargetTeamsGenericLoopDirective *D) { 9483 DeclarationNameInfo DirName; 9484 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9485 nullptr, D->getBeginLoc()); 9486 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9487 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9488 return Res; 9489 } 9490 9491 template <typename Derived> 9492 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9493 OMPParallelGenericLoopDirective *D) { 9494 DeclarationNameInfo DirName; 9495 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9496 nullptr, D->getBeginLoc()); 9497 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9498 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9499 return Res; 9500 } 9501 9502 template <typename Derived> 9503 StmtResult 9504 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9505 OMPTargetParallelGenericLoopDirective *D) { 9506 DeclarationNameInfo DirName; 9507 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9508 nullptr, D->getBeginLoc()); 9509 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9510 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9511 return Res; 9512 } 9513 9514 //===----------------------------------------------------------------------===// 9515 // OpenMP clause transformation 9516 //===----------------------------------------------------------------------===// 9517 template <typename Derived> 9518 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9519 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9520 if (Cond.isInvalid()) 9521 return nullptr; 9522 return getDerived().RebuildOMPIfClause( 9523 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9524 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9525 } 9526 9527 template <typename Derived> 9528 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9529 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9530 if (Cond.isInvalid()) 9531 return nullptr; 9532 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9533 C->getLParenLoc(), C->getEndLoc()); 9534 } 9535 9536 template <typename Derived> 9537 OMPClause * 9538 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9539 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9540 if (NumThreads.isInvalid()) 9541 return nullptr; 9542 return getDerived().RebuildOMPNumThreadsClause( 9543 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9544 } 9545 9546 template <typename Derived> 9547 OMPClause * 9548 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9549 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9550 if (E.isInvalid()) 9551 return nullptr; 9552 return getDerived().RebuildOMPSafelenClause( 9553 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9554 } 9555 9556 template <typename Derived> 9557 OMPClause * 9558 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9559 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9560 if (E.isInvalid()) 9561 return nullptr; 9562 return getDerived().RebuildOMPAllocatorClause( 9563 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9564 } 9565 9566 template <typename Derived> 9567 OMPClause * 9568 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9569 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9570 if (E.isInvalid()) 9571 return nullptr; 9572 return getDerived().RebuildOMPSimdlenClause( 9573 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9574 } 9575 9576 template <typename Derived> 9577 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9578 SmallVector<Expr *, 4> TransformedSizes; 9579 TransformedSizes.reserve(C->getNumSizes()); 9580 bool Changed = false; 9581 for (Expr *E : C->getSizesRefs()) { 9582 if (!E) { 9583 TransformedSizes.push_back(nullptr); 9584 continue; 9585 } 9586 9587 ExprResult T = getDerived().TransformExpr(E); 9588 if (T.isInvalid()) 9589 return nullptr; 9590 if (E != T.get()) 9591 Changed = true; 9592 TransformedSizes.push_back(T.get()); 9593 } 9594 9595 if (!Changed && !getDerived().AlwaysRebuild()) 9596 return C; 9597 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9598 C->getLParenLoc(), C->getEndLoc()); 9599 } 9600 9601 template <typename Derived> 9602 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9603 if (!getDerived().AlwaysRebuild()) 9604 return C; 9605 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9606 } 9607 9608 template <typename Derived> 9609 OMPClause * 9610 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9611 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9612 if (T.isInvalid()) 9613 return nullptr; 9614 Expr *Factor = T.get(); 9615 bool Changed = Factor != C->getFactor(); 9616 9617 if (!Changed && !getDerived().AlwaysRebuild()) 9618 return C; 9619 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9620 C->getEndLoc()); 9621 } 9622 9623 template <typename Derived> 9624 OMPClause * 9625 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9626 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9627 if (E.isInvalid()) 9628 return nullptr; 9629 return getDerived().RebuildOMPCollapseClause( 9630 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9631 } 9632 9633 template <typename Derived> 9634 OMPClause * 9635 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9636 return getDerived().RebuildOMPDefaultClause( 9637 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9638 C->getLParenLoc(), C->getEndLoc()); 9639 } 9640 9641 template <typename Derived> 9642 OMPClause * 9643 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9644 return getDerived().RebuildOMPProcBindClause( 9645 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9646 C->getLParenLoc(), C->getEndLoc()); 9647 } 9648 9649 template <typename Derived> 9650 OMPClause * 9651 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9652 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9653 if (E.isInvalid()) 9654 return nullptr; 9655 return getDerived().RebuildOMPScheduleClause( 9656 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9657 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9658 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9659 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9660 } 9661 9662 template <typename Derived> 9663 OMPClause * 9664 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9665 ExprResult E; 9666 if (auto *Num = C->getNumForLoops()) { 9667 E = getDerived().TransformExpr(Num); 9668 if (E.isInvalid()) 9669 return nullptr; 9670 } 9671 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9672 C->getLParenLoc(), E.get()); 9673 } 9674 9675 template <typename Derived> 9676 OMPClause * 9677 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9678 ExprResult E; 9679 if (Expr *Evt = C->getEventHandler()) { 9680 E = getDerived().TransformExpr(Evt); 9681 if (E.isInvalid()) 9682 return nullptr; 9683 } 9684 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9685 C->getLParenLoc(), C->getEndLoc()); 9686 } 9687 9688 template <typename Derived> 9689 OMPClause * 9690 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9691 // No need to rebuild this clause, no template-dependent parameters. 9692 return C; 9693 } 9694 9695 template <typename Derived> 9696 OMPClause * 9697 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9698 // No need to rebuild this clause, no template-dependent parameters. 9699 return C; 9700 } 9701 9702 template <typename Derived> 9703 OMPClause * 9704 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9705 // No need to rebuild this clause, no template-dependent parameters. 9706 return C; 9707 } 9708 9709 template <typename Derived> 9710 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9711 // No need to rebuild this clause, no template-dependent parameters. 9712 return C; 9713 } 9714 9715 template <typename Derived> 9716 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9717 // No need to rebuild this clause, no template-dependent parameters. 9718 return C; 9719 } 9720 9721 template <typename Derived> 9722 OMPClause * 9723 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9724 // No need to rebuild this clause, no template-dependent parameters. 9725 return C; 9726 } 9727 9728 template <typename Derived> 9729 OMPClause * 9730 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9731 // No need to rebuild this clause, no template-dependent parameters. 9732 return C; 9733 } 9734 9735 template <typename Derived> 9736 OMPClause * 9737 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9738 // No need to rebuild this clause, no template-dependent parameters. 9739 return C; 9740 } 9741 9742 template <typename Derived> 9743 OMPClause * 9744 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9745 // No need to rebuild this clause, no template-dependent parameters. 9746 return C; 9747 } 9748 9749 template <typename Derived> 9750 OMPClause * 9751 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9752 // No need to rebuild this clause, no template-dependent parameters. 9753 return C; 9754 } 9755 9756 template <typename Derived> 9757 OMPClause * 9758 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9759 // No need to rebuild this clause, no template-dependent parameters. 9760 return C; 9761 } 9762 9763 template <typename Derived> 9764 OMPClause * 9765 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9766 // No need to rebuild this clause, no template-dependent parameters. 9767 return C; 9768 } 9769 9770 template <typename Derived> 9771 OMPClause * 9772 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9773 // No need to rebuild this clause, no template-dependent parameters. 9774 return C; 9775 } 9776 9777 template <typename Derived> 9778 OMPClause * 9779 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9780 // No need to rebuild this clause, no template-dependent parameters. 9781 return C; 9782 } 9783 9784 template <typename Derived> 9785 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9786 // No need to rebuild this clause, no template-dependent parameters. 9787 return C; 9788 } 9789 9790 template <typename Derived> 9791 OMPClause * 9792 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9793 // No need to rebuild this clause, no template-dependent parameters. 9794 return C; 9795 } 9796 9797 template <typename Derived> 9798 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9799 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9800 if (IVR.isInvalid()) 9801 return nullptr; 9802 9803 OMPInteropInfo InteropInfo(C->getIsTarget(), C->getIsTargetSync()); 9804 InteropInfo.PreferTypes.reserve(C->varlist_size() - 1); 9805 for (Expr *E : llvm::drop_begin(C->varlists())) { 9806 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9807 if (ER.isInvalid()) 9808 return nullptr; 9809 InteropInfo.PreferTypes.push_back(ER.get()); 9810 } 9811 return getDerived().RebuildOMPInitClause(IVR.get(), InteropInfo, 9812 C->getBeginLoc(), C->getLParenLoc(), 9813 C->getVarLoc(), C->getEndLoc()); 9814 } 9815 9816 template <typename Derived> 9817 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9818 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9819 if (ER.isInvalid()) 9820 return nullptr; 9821 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9822 C->getLParenLoc(), C->getVarLoc(), 9823 C->getEndLoc()); 9824 } 9825 9826 template <typename Derived> 9827 OMPClause * 9828 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9829 ExprResult ER; 9830 if (Expr *IV = C->getInteropVar()) { 9831 ER = getDerived().TransformExpr(IV); 9832 if (ER.isInvalid()) 9833 return nullptr; 9834 } 9835 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9836 C->getLParenLoc(), C->getVarLoc(), 9837 C->getEndLoc()); 9838 } 9839 9840 template <typename Derived> 9841 OMPClause * 9842 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9843 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9844 if (Cond.isInvalid()) 9845 return nullptr; 9846 return getDerived().RebuildOMPNovariantsClause( 9847 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9848 } 9849 9850 template <typename Derived> 9851 OMPClause * 9852 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9853 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9854 if (Cond.isInvalid()) 9855 return nullptr; 9856 return getDerived().RebuildOMPNocontextClause( 9857 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9858 } 9859 9860 template <typename Derived> 9861 OMPClause * 9862 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9863 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9864 if (ThreadID.isInvalid()) 9865 return nullptr; 9866 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9867 C->getLParenLoc(), C->getEndLoc()); 9868 } 9869 9870 template <typename Derived> 9871 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9872 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9873 if (E.isInvalid()) 9874 return nullptr; 9875 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9876 C->getLParenLoc(), C->getEndLoc()); 9877 } 9878 9879 template <typename Derived> 9880 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9881 OMPUnifiedAddressClause *C) { 9882 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9883 } 9884 9885 template <typename Derived> 9886 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9887 OMPUnifiedSharedMemoryClause *C) { 9888 llvm_unreachable( 9889 "unified_shared_memory clause cannot appear in dependent context"); 9890 } 9891 9892 template <typename Derived> 9893 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9894 OMPReverseOffloadClause *C) { 9895 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9896 } 9897 9898 template <typename Derived> 9899 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9900 OMPDynamicAllocatorsClause *C) { 9901 llvm_unreachable( 9902 "dynamic_allocators clause cannot appear in dependent context"); 9903 } 9904 9905 template <typename Derived> 9906 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9907 OMPAtomicDefaultMemOrderClause *C) { 9908 llvm_unreachable( 9909 "atomic_default_mem_order clause cannot appear in dependent context"); 9910 } 9911 9912 template <typename Derived> 9913 OMPClause *TreeTransform<Derived>::TransformOMPAtClause(OMPAtClause *C) { 9914 return getDerived().RebuildOMPAtClause(C->getAtKind(), C->getAtKindKwLoc(), 9915 C->getBeginLoc(), C->getLParenLoc(), 9916 C->getEndLoc()); 9917 } 9918 9919 template <typename Derived> 9920 OMPClause * 9921 TreeTransform<Derived>::TransformOMPSeverityClause(OMPSeverityClause *C) { 9922 return getDerived().RebuildOMPSeverityClause( 9923 C->getSeverityKind(), C->getSeverityKindKwLoc(), C->getBeginLoc(), 9924 C->getLParenLoc(), C->getEndLoc()); 9925 } 9926 9927 template <typename Derived> 9928 OMPClause * 9929 TreeTransform<Derived>::TransformOMPMessageClause(OMPMessageClause *C) { 9930 ExprResult E = getDerived().TransformExpr(C->getMessageString()); 9931 if (E.isInvalid()) 9932 return nullptr; 9933 return getDerived().RebuildOMPMessageClause( 9934 C->getMessageString(), C->getBeginLoc(), C->getLParenLoc(), 9935 C->getEndLoc()); 9936 } 9937 9938 template <typename Derived> 9939 OMPClause * 9940 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9941 llvm::SmallVector<Expr *, 16> Vars; 9942 Vars.reserve(C->varlist_size()); 9943 for (auto *VE : C->varlists()) { 9944 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9945 if (EVar.isInvalid()) 9946 return nullptr; 9947 Vars.push_back(EVar.get()); 9948 } 9949 return getDerived().RebuildOMPPrivateClause( 9950 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9951 } 9952 9953 template <typename Derived> 9954 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9955 OMPFirstprivateClause *C) { 9956 llvm::SmallVector<Expr *, 16> Vars; 9957 Vars.reserve(C->varlist_size()); 9958 for (auto *VE : C->varlists()) { 9959 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9960 if (EVar.isInvalid()) 9961 return nullptr; 9962 Vars.push_back(EVar.get()); 9963 } 9964 return getDerived().RebuildOMPFirstprivateClause( 9965 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9966 } 9967 9968 template <typename Derived> 9969 OMPClause * 9970 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9971 llvm::SmallVector<Expr *, 16> Vars; 9972 Vars.reserve(C->varlist_size()); 9973 for (auto *VE : C->varlists()) { 9974 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9975 if (EVar.isInvalid()) 9976 return nullptr; 9977 Vars.push_back(EVar.get()); 9978 } 9979 return getDerived().RebuildOMPLastprivateClause( 9980 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9981 C->getLParenLoc(), C->getEndLoc()); 9982 } 9983 9984 template <typename Derived> 9985 OMPClause * 9986 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9987 llvm::SmallVector<Expr *, 16> Vars; 9988 Vars.reserve(C->varlist_size()); 9989 for (auto *VE : C->varlists()) { 9990 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9991 if (EVar.isInvalid()) 9992 return nullptr; 9993 Vars.push_back(EVar.get()); 9994 } 9995 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9996 C->getLParenLoc(), C->getEndLoc()); 9997 } 9998 9999 template <typename Derived> 10000 OMPClause * 10001 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 10002 llvm::SmallVector<Expr *, 16> Vars; 10003 Vars.reserve(C->varlist_size()); 10004 for (auto *VE : C->varlists()) { 10005 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10006 if (EVar.isInvalid()) 10007 return nullptr; 10008 Vars.push_back(EVar.get()); 10009 } 10010 CXXScopeSpec ReductionIdScopeSpec; 10011 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10012 10013 DeclarationNameInfo NameInfo = C->getNameInfo(); 10014 if (NameInfo.getName()) { 10015 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10016 if (!NameInfo.getName()) 10017 return nullptr; 10018 } 10019 // Build a list of all UDR decls with the same names ranged by the Scopes. 10020 // The Scope boundary is a duplication of the previous decl. 10021 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10022 for (auto *E : C->reduction_ops()) { 10023 // Transform all the decls. 10024 if (E) { 10025 auto *ULE = cast<UnresolvedLookupExpr>(E); 10026 UnresolvedSet<8> Decls; 10027 for (auto *D : ULE->decls()) { 10028 NamedDecl *InstD = 10029 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10030 Decls.addDecl(InstD, InstD->getAccess()); 10031 } 10032 UnresolvedReductions.push_back( 10033 UnresolvedLookupExpr::Create( 10034 SemaRef.Context, /*NamingClass=*/nullptr, 10035 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 10036 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 10037 Decls.begin(), Decls.end())); 10038 } else 10039 UnresolvedReductions.push_back(nullptr); 10040 } 10041 return getDerived().RebuildOMPReductionClause( 10042 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 10043 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 10044 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10045 } 10046 10047 template <typename Derived> 10048 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 10049 OMPTaskReductionClause *C) { 10050 llvm::SmallVector<Expr *, 16> Vars; 10051 Vars.reserve(C->varlist_size()); 10052 for (auto *VE : C->varlists()) { 10053 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10054 if (EVar.isInvalid()) 10055 return nullptr; 10056 Vars.push_back(EVar.get()); 10057 } 10058 CXXScopeSpec ReductionIdScopeSpec; 10059 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10060 10061 DeclarationNameInfo NameInfo = C->getNameInfo(); 10062 if (NameInfo.getName()) { 10063 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10064 if (!NameInfo.getName()) 10065 return nullptr; 10066 } 10067 // Build a list of all UDR decls with the same names ranged by the Scopes. 10068 // The Scope boundary is a duplication of the previous decl. 10069 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10070 for (auto *E : C->reduction_ops()) { 10071 // Transform all the decls. 10072 if (E) { 10073 auto *ULE = cast<UnresolvedLookupExpr>(E); 10074 UnresolvedSet<8> Decls; 10075 for (auto *D : ULE->decls()) { 10076 NamedDecl *InstD = 10077 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10078 Decls.addDecl(InstD, InstD->getAccess()); 10079 } 10080 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10081 SemaRef.Context, /*NamingClass=*/nullptr, 10082 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10083 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10084 } else 10085 UnresolvedReductions.push_back(nullptr); 10086 } 10087 return getDerived().RebuildOMPTaskReductionClause( 10088 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10089 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10090 } 10091 10092 template <typename Derived> 10093 OMPClause * 10094 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 10095 llvm::SmallVector<Expr *, 16> Vars; 10096 Vars.reserve(C->varlist_size()); 10097 for (auto *VE : C->varlists()) { 10098 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10099 if (EVar.isInvalid()) 10100 return nullptr; 10101 Vars.push_back(EVar.get()); 10102 } 10103 CXXScopeSpec ReductionIdScopeSpec; 10104 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 10105 10106 DeclarationNameInfo NameInfo = C->getNameInfo(); 10107 if (NameInfo.getName()) { 10108 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10109 if (!NameInfo.getName()) 10110 return nullptr; 10111 } 10112 // Build a list of all UDR decls with the same names ranged by the Scopes. 10113 // The Scope boundary is a duplication of the previous decl. 10114 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 10115 for (auto *E : C->reduction_ops()) { 10116 // Transform all the decls. 10117 if (E) { 10118 auto *ULE = cast<UnresolvedLookupExpr>(E); 10119 UnresolvedSet<8> Decls; 10120 for (auto *D : ULE->decls()) { 10121 NamedDecl *InstD = 10122 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 10123 Decls.addDecl(InstD, InstD->getAccess()); 10124 } 10125 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 10126 SemaRef.Context, /*NamingClass=*/nullptr, 10127 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 10128 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 10129 } else 10130 UnresolvedReductions.push_back(nullptr); 10131 } 10132 return getDerived().RebuildOMPInReductionClause( 10133 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10134 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 10135 } 10136 10137 template <typename Derived> 10138 OMPClause * 10139 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 10140 llvm::SmallVector<Expr *, 16> Vars; 10141 Vars.reserve(C->varlist_size()); 10142 for (auto *VE : C->varlists()) { 10143 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10144 if (EVar.isInvalid()) 10145 return nullptr; 10146 Vars.push_back(EVar.get()); 10147 } 10148 ExprResult Step = getDerived().TransformExpr(C->getStep()); 10149 if (Step.isInvalid()) 10150 return nullptr; 10151 return getDerived().RebuildOMPLinearClause( 10152 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 10153 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 10154 } 10155 10156 template <typename Derived> 10157 OMPClause * 10158 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 10159 llvm::SmallVector<Expr *, 16> Vars; 10160 Vars.reserve(C->varlist_size()); 10161 for (auto *VE : C->varlists()) { 10162 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10163 if (EVar.isInvalid()) 10164 return nullptr; 10165 Vars.push_back(EVar.get()); 10166 } 10167 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 10168 if (Alignment.isInvalid()) 10169 return nullptr; 10170 return getDerived().RebuildOMPAlignedClause( 10171 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 10172 C->getColonLoc(), C->getEndLoc()); 10173 } 10174 10175 template <typename Derived> 10176 OMPClause * 10177 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 10178 llvm::SmallVector<Expr *, 16> Vars; 10179 Vars.reserve(C->varlist_size()); 10180 for (auto *VE : C->varlists()) { 10181 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10182 if (EVar.isInvalid()) 10183 return nullptr; 10184 Vars.push_back(EVar.get()); 10185 } 10186 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 10187 C->getLParenLoc(), C->getEndLoc()); 10188 } 10189 10190 template <typename Derived> 10191 OMPClause * 10192 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 10193 llvm::SmallVector<Expr *, 16> Vars; 10194 Vars.reserve(C->varlist_size()); 10195 for (auto *VE : C->varlists()) { 10196 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10197 if (EVar.isInvalid()) 10198 return nullptr; 10199 Vars.push_back(EVar.get()); 10200 } 10201 return getDerived().RebuildOMPCopyprivateClause( 10202 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10203 } 10204 10205 template <typename Derived> 10206 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 10207 llvm::SmallVector<Expr *, 16> Vars; 10208 Vars.reserve(C->varlist_size()); 10209 for (auto *VE : C->varlists()) { 10210 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10211 if (EVar.isInvalid()) 10212 return nullptr; 10213 Vars.push_back(EVar.get()); 10214 } 10215 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 10216 C->getLParenLoc(), C->getEndLoc()); 10217 } 10218 10219 template <typename Derived> 10220 OMPClause * 10221 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 10222 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 10223 if (E.isInvalid()) 10224 return nullptr; 10225 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 10226 C->getLParenLoc(), C->getEndLoc()); 10227 } 10228 10229 template <typename Derived> 10230 OMPClause * 10231 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 10232 llvm::SmallVector<Expr *, 16> Vars; 10233 Expr *DepModifier = C->getModifier(); 10234 if (DepModifier) { 10235 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 10236 if (DepModRes.isInvalid()) 10237 return nullptr; 10238 DepModifier = DepModRes.get(); 10239 } 10240 Vars.reserve(C->varlist_size()); 10241 for (auto *VE : C->varlists()) { 10242 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10243 if (EVar.isInvalid()) 10244 return nullptr; 10245 Vars.push_back(EVar.get()); 10246 } 10247 return getDerived().RebuildOMPDependClause( 10248 {C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), 10249 C->getOmpAllMemoryLoc()}, 10250 DepModifier, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10251 } 10252 10253 template <typename Derived> 10254 OMPClause * 10255 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10256 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10257 if (E.isInvalid()) 10258 return nullptr; 10259 return getDerived().RebuildOMPDeviceClause( 10260 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10261 C->getModifierLoc(), C->getEndLoc()); 10262 } 10263 10264 template <typename Derived, class T> 10265 bool transformOMPMappableExprListClause( 10266 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10267 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10268 DeclarationNameInfo &MapperIdInfo, 10269 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10270 // Transform expressions in the list. 10271 Vars.reserve(C->varlist_size()); 10272 for (auto *VE : C->varlists()) { 10273 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10274 if (EVar.isInvalid()) 10275 return true; 10276 Vars.push_back(EVar.get()); 10277 } 10278 // Transform mapper scope specifier and identifier. 10279 NestedNameSpecifierLoc QualifierLoc; 10280 if (C->getMapperQualifierLoc()) { 10281 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10282 C->getMapperQualifierLoc()); 10283 if (!QualifierLoc) 10284 return true; 10285 } 10286 MapperIdScopeSpec.Adopt(QualifierLoc); 10287 MapperIdInfo = C->getMapperIdInfo(); 10288 if (MapperIdInfo.getName()) { 10289 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10290 if (!MapperIdInfo.getName()) 10291 return true; 10292 } 10293 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10294 // the previous user-defined mapper lookup in dependent environment. 10295 for (auto *E : C->mapperlists()) { 10296 // Transform all the decls. 10297 if (E) { 10298 auto *ULE = cast<UnresolvedLookupExpr>(E); 10299 UnresolvedSet<8> Decls; 10300 for (auto *D : ULE->decls()) { 10301 NamedDecl *InstD = 10302 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10303 Decls.addDecl(InstD, InstD->getAccess()); 10304 } 10305 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10306 TT.getSema().Context, /*NamingClass=*/nullptr, 10307 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10308 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10309 Decls.end())); 10310 } else { 10311 UnresolvedMappers.push_back(nullptr); 10312 } 10313 } 10314 return false; 10315 } 10316 10317 template <typename Derived> 10318 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10319 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10320 llvm::SmallVector<Expr *, 16> Vars; 10321 Expr *IteratorModifier = C->getIteratorModifier(); 10322 if (IteratorModifier) { 10323 ExprResult MapModRes = getDerived().TransformExpr(IteratorModifier); 10324 if (MapModRes.isInvalid()) 10325 return nullptr; 10326 IteratorModifier = MapModRes.get(); 10327 } 10328 CXXScopeSpec MapperIdScopeSpec; 10329 DeclarationNameInfo MapperIdInfo; 10330 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10331 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10332 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10333 return nullptr; 10334 return getDerived().RebuildOMPMapClause( 10335 IteratorModifier, C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), 10336 MapperIdScopeSpec, MapperIdInfo, C->getMapType(), C->isImplicitMapType(), 10337 C->getMapLoc(), C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10338 } 10339 10340 template <typename Derived> 10341 OMPClause * 10342 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10343 Expr *Allocator = C->getAllocator(); 10344 if (Allocator) { 10345 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10346 if (AllocatorRes.isInvalid()) 10347 return nullptr; 10348 Allocator = AllocatorRes.get(); 10349 } 10350 llvm::SmallVector<Expr *, 16> Vars; 10351 Vars.reserve(C->varlist_size()); 10352 for (auto *VE : C->varlists()) { 10353 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10354 if (EVar.isInvalid()) 10355 return nullptr; 10356 Vars.push_back(EVar.get()); 10357 } 10358 return getDerived().RebuildOMPAllocateClause( 10359 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10360 C->getEndLoc()); 10361 } 10362 10363 template <typename Derived> 10364 OMPClause * 10365 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10366 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10367 if (E.isInvalid()) 10368 return nullptr; 10369 return getDerived().RebuildOMPNumTeamsClause( 10370 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10371 } 10372 10373 template <typename Derived> 10374 OMPClause * 10375 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10376 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10377 if (E.isInvalid()) 10378 return nullptr; 10379 return getDerived().RebuildOMPThreadLimitClause( 10380 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10381 } 10382 10383 template <typename Derived> 10384 OMPClause * 10385 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10386 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10387 if (E.isInvalid()) 10388 return nullptr; 10389 return getDerived().RebuildOMPPriorityClause( 10390 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10391 } 10392 10393 template <typename Derived> 10394 OMPClause * 10395 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10396 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10397 if (E.isInvalid()) 10398 return nullptr; 10399 return getDerived().RebuildOMPGrainsizeClause( 10400 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10401 C->getModifierLoc(), C->getEndLoc()); 10402 } 10403 10404 template <typename Derived> 10405 OMPClause * 10406 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10407 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10408 if (E.isInvalid()) 10409 return nullptr; 10410 return getDerived().RebuildOMPNumTasksClause( 10411 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10412 C->getModifierLoc(), C->getEndLoc()); 10413 } 10414 10415 template <typename Derived> 10416 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10417 ExprResult E = getDerived().TransformExpr(C->getHint()); 10418 if (E.isInvalid()) 10419 return nullptr; 10420 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10421 C->getLParenLoc(), C->getEndLoc()); 10422 } 10423 10424 template <typename Derived> 10425 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10426 OMPDistScheduleClause *C) { 10427 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10428 if (E.isInvalid()) 10429 return nullptr; 10430 return getDerived().RebuildOMPDistScheduleClause( 10431 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10432 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10433 } 10434 10435 template <typename Derived> 10436 OMPClause * 10437 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10438 // Rebuild Defaultmap Clause since we need to invoke the checking of 10439 // defaultmap(none:variable-category) after template initialization. 10440 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10441 C->getDefaultmapKind(), 10442 C->getBeginLoc(), 10443 C->getLParenLoc(), 10444 C->getDefaultmapModifierLoc(), 10445 C->getDefaultmapKindLoc(), 10446 C->getEndLoc()); 10447 } 10448 10449 template <typename Derived> 10450 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10451 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10452 llvm::SmallVector<Expr *, 16> Vars; 10453 CXXScopeSpec MapperIdScopeSpec; 10454 DeclarationNameInfo MapperIdInfo; 10455 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10456 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10457 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10458 return nullptr; 10459 return getDerived().RebuildOMPToClause( 10460 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10461 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10462 } 10463 10464 template <typename Derived> 10465 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10466 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10467 llvm::SmallVector<Expr *, 16> Vars; 10468 CXXScopeSpec MapperIdScopeSpec; 10469 DeclarationNameInfo MapperIdInfo; 10470 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10471 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10472 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10473 return nullptr; 10474 return getDerived().RebuildOMPFromClause( 10475 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10476 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10477 } 10478 10479 template <typename Derived> 10480 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10481 OMPUseDevicePtrClause *C) { 10482 llvm::SmallVector<Expr *, 16> Vars; 10483 Vars.reserve(C->varlist_size()); 10484 for (auto *VE : C->varlists()) { 10485 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10486 if (EVar.isInvalid()) 10487 return nullptr; 10488 Vars.push_back(EVar.get()); 10489 } 10490 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10491 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10492 } 10493 10494 template <typename Derived> 10495 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10496 OMPUseDeviceAddrClause *C) { 10497 llvm::SmallVector<Expr *, 16> Vars; 10498 Vars.reserve(C->varlist_size()); 10499 for (auto *VE : C->varlists()) { 10500 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10501 if (EVar.isInvalid()) 10502 return nullptr; 10503 Vars.push_back(EVar.get()); 10504 } 10505 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10506 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10507 } 10508 10509 template <typename Derived> 10510 OMPClause * 10511 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10512 llvm::SmallVector<Expr *, 16> Vars; 10513 Vars.reserve(C->varlist_size()); 10514 for (auto *VE : C->varlists()) { 10515 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10516 if (EVar.isInvalid()) 10517 return nullptr; 10518 Vars.push_back(EVar.get()); 10519 } 10520 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10521 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10522 } 10523 10524 template <typename Derived> 10525 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause( 10526 OMPHasDeviceAddrClause *C) { 10527 llvm::SmallVector<Expr *, 16> Vars; 10528 Vars.reserve(C->varlist_size()); 10529 for (auto *VE : C->varlists()) { 10530 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10531 if (EVar.isInvalid()) 10532 return nullptr; 10533 Vars.push_back(EVar.get()); 10534 } 10535 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10536 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs); 10537 } 10538 10539 template <typename Derived> 10540 OMPClause * 10541 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10542 llvm::SmallVector<Expr *, 16> Vars; 10543 Vars.reserve(C->varlist_size()); 10544 for (auto *VE : C->varlists()) { 10545 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10546 if (EVar.isInvalid()) 10547 return nullptr; 10548 Vars.push_back(EVar.get()); 10549 } 10550 return getDerived().RebuildOMPNontemporalClause( 10551 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10552 } 10553 10554 template <typename Derived> 10555 OMPClause * 10556 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10557 llvm::SmallVector<Expr *, 16> Vars; 10558 Vars.reserve(C->varlist_size()); 10559 for (auto *VE : C->varlists()) { 10560 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10561 if (EVar.isInvalid()) 10562 return nullptr; 10563 Vars.push_back(EVar.get()); 10564 } 10565 return getDerived().RebuildOMPInclusiveClause( 10566 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10567 } 10568 10569 template <typename Derived> 10570 OMPClause * 10571 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10572 llvm::SmallVector<Expr *, 16> Vars; 10573 Vars.reserve(C->varlist_size()); 10574 for (auto *VE : C->varlists()) { 10575 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10576 if (EVar.isInvalid()) 10577 return nullptr; 10578 Vars.push_back(EVar.get()); 10579 } 10580 return getDerived().RebuildOMPExclusiveClause( 10581 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10582 } 10583 10584 template <typename Derived> 10585 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10586 OMPUsesAllocatorsClause *C) { 10587 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10588 Data.reserve(C->getNumberOfAllocators()); 10589 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10590 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10591 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10592 if (Allocator.isInvalid()) 10593 continue; 10594 ExprResult AllocatorTraits; 10595 if (Expr *AT = D.AllocatorTraits) { 10596 AllocatorTraits = getDerived().TransformExpr(AT); 10597 if (AllocatorTraits.isInvalid()) 10598 continue; 10599 } 10600 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10601 NewD.Allocator = Allocator.get(); 10602 NewD.AllocatorTraits = AllocatorTraits.get(); 10603 NewD.LParenLoc = D.LParenLoc; 10604 NewD.RParenLoc = D.RParenLoc; 10605 } 10606 return getDerived().RebuildOMPUsesAllocatorsClause( 10607 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10608 } 10609 10610 template <typename Derived> 10611 OMPClause * 10612 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10613 SmallVector<Expr *, 4> Locators; 10614 Locators.reserve(C->varlist_size()); 10615 ExprResult ModifierRes; 10616 if (Expr *Modifier = C->getModifier()) { 10617 ModifierRes = getDerived().TransformExpr(Modifier); 10618 if (ModifierRes.isInvalid()) 10619 return nullptr; 10620 } 10621 for (Expr *E : C->varlists()) { 10622 ExprResult Locator = getDerived().TransformExpr(E); 10623 if (Locator.isInvalid()) 10624 continue; 10625 Locators.push_back(Locator.get()); 10626 } 10627 return getDerived().RebuildOMPAffinityClause( 10628 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10629 ModifierRes.get(), Locators); 10630 } 10631 10632 template <typename Derived> 10633 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10634 return getDerived().RebuildOMPOrderClause( 10635 C->getKind(), C->getKindKwLoc(), C->getBeginLoc(), C->getLParenLoc(), 10636 C->getEndLoc(), C->getModifier(), C->getModifierKwLoc()); 10637 } 10638 10639 template <typename Derived> 10640 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10641 return getDerived().RebuildOMPBindClause( 10642 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10643 C->getLParenLoc(), C->getEndLoc()); 10644 } 10645 10646 template <typename Derived> 10647 OMPClause *TreeTransform<Derived>::TransformOMPXDynCGroupMemClause( 10648 OMPXDynCGroupMemClause *C) { 10649 ExprResult Size = getDerived().TransformExpr(C->getSize()); 10650 if (Size.isInvalid()) 10651 return nullptr; 10652 return getDerived().RebuildOMPXDynCGroupMemClause( 10653 Size.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10654 } 10655 10656 //===----------------------------------------------------------------------===// 10657 // Expression transformation 10658 //===----------------------------------------------------------------------===// 10659 template<typename Derived> 10660 ExprResult 10661 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10662 return TransformExpr(E->getSubExpr()); 10663 } 10664 10665 template <typename Derived> 10666 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10667 SYCLUniqueStableNameExpr *E) { 10668 if (!E->isTypeDependent()) 10669 return E; 10670 10671 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10672 10673 if (!NewT) 10674 return ExprError(); 10675 10676 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10677 return E; 10678 10679 return getDerived().RebuildSYCLUniqueStableNameExpr( 10680 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10681 } 10682 10683 template<typename Derived> 10684 ExprResult 10685 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10686 if (!E->isTypeDependent()) 10687 return E; 10688 10689 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10690 E->getIdentKind()); 10691 } 10692 10693 template<typename Derived> 10694 ExprResult 10695 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10696 NestedNameSpecifierLoc QualifierLoc; 10697 if (E->getQualifierLoc()) { 10698 QualifierLoc 10699 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10700 if (!QualifierLoc) 10701 return ExprError(); 10702 } 10703 10704 ValueDecl *ND 10705 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10706 E->getDecl())); 10707 if (!ND) 10708 return ExprError(); 10709 10710 NamedDecl *Found = ND; 10711 if (E->getFoundDecl() != E->getDecl()) { 10712 Found = cast_or_null<NamedDecl>( 10713 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10714 if (!Found) 10715 return ExprError(); 10716 } 10717 10718 DeclarationNameInfo NameInfo = E->getNameInfo(); 10719 if (NameInfo.getName()) { 10720 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10721 if (!NameInfo.getName()) 10722 return ExprError(); 10723 } 10724 10725 if (!getDerived().AlwaysRebuild() && 10726 QualifierLoc == E->getQualifierLoc() && 10727 ND == E->getDecl() && 10728 Found == E->getFoundDecl() && 10729 NameInfo.getName() == E->getDecl()->getDeclName() && 10730 !E->hasExplicitTemplateArgs()) { 10731 10732 // Mark it referenced in the new context regardless. 10733 // FIXME: this is a bit instantiation-specific. 10734 SemaRef.MarkDeclRefReferenced(E); 10735 10736 return E; 10737 } 10738 10739 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10740 if (E->hasExplicitTemplateArgs()) { 10741 TemplateArgs = &TransArgs; 10742 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10743 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10744 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10745 E->getNumTemplateArgs(), 10746 TransArgs)) 10747 return ExprError(); 10748 } 10749 10750 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10751 Found, TemplateArgs); 10752 } 10753 10754 template<typename Derived> 10755 ExprResult 10756 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10757 return E; 10758 } 10759 10760 template <typename Derived> 10761 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10762 FixedPointLiteral *E) { 10763 return E; 10764 } 10765 10766 template<typename Derived> 10767 ExprResult 10768 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10769 return E; 10770 } 10771 10772 template<typename Derived> 10773 ExprResult 10774 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10775 return E; 10776 } 10777 10778 template<typename Derived> 10779 ExprResult 10780 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10781 return E; 10782 } 10783 10784 template<typename Derived> 10785 ExprResult 10786 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10787 return E; 10788 } 10789 10790 template<typename Derived> 10791 ExprResult 10792 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10793 return getDerived().TransformCallExpr(E); 10794 } 10795 10796 template<typename Derived> 10797 ExprResult 10798 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10799 ExprResult ControllingExpr = 10800 getDerived().TransformExpr(E->getControllingExpr()); 10801 if (ControllingExpr.isInvalid()) 10802 return ExprError(); 10803 10804 SmallVector<Expr *, 4> AssocExprs; 10805 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10806 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10807 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10808 if (TSI) { 10809 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10810 if (!AssocType) 10811 return ExprError(); 10812 AssocTypes.push_back(AssocType); 10813 } else { 10814 AssocTypes.push_back(nullptr); 10815 } 10816 10817 ExprResult AssocExpr = 10818 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10819 if (AssocExpr.isInvalid()) 10820 return ExprError(); 10821 AssocExprs.push_back(AssocExpr.get()); 10822 } 10823 10824 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10825 E->getDefaultLoc(), 10826 E->getRParenLoc(), 10827 ControllingExpr.get(), 10828 AssocTypes, 10829 AssocExprs); 10830 } 10831 10832 template<typename Derived> 10833 ExprResult 10834 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10835 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10836 if (SubExpr.isInvalid()) 10837 return ExprError(); 10838 10839 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10840 return E; 10841 10842 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10843 E->getRParen()); 10844 } 10845 10846 /// The operand of a unary address-of operator has special rules: it's 10847 /// allowed to refer to a non-static member of a class even if there's no 'this' 10848 /// object available. 10849 template<typename Derived> 10850 ExprResult 10851 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10852 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10853 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10854 else 10855 return getDerived().TransformExpr(E); 10856 } 10857 10858 template<typename Derived> 10859 ExprResult 10860 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10861 ExprResult SubExpr; 10862 if (E->getOpcode() == UO_AddrOf) 10863 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10864 else 10865 SubExpr = TransformExpr(E->getSubExpr()); 10866 if (SubExpr.isInvalid()) 10867 return ExprError(); 10868 10869 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10870 return E; 10871 10872 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10873 E->getOpcode(), 10874 SubExpr.get()); 10875 } 10876 10877 template<typename Derived> 10878 ExprResult 10879 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10880 // Transform the type. 10881 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10882 if (!Type) 10883 return ExprError(); 10884 10885 // Transform all of the components into components similar to what the 10886 // parser uses. 10887 // FIXME: It would be slightly more efficient in the non-dependent case to 10888 // just map FieldDecls, rather than requiring the rebuilder to look for 10889 // the fields again. However, __builtin_offsetof is rare enough in 10890 // template code that we don't care. 10891 bool ExprChanged = false; 10892 typedef Sema::OffsetOfComponent Component; 10893 SmallVector<Component, 4> Components; 10894 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10895 const OffsetOfNode &ON = E->getComponent(I); 10896 Component Comp; 10897 Comp.isBrackets = true; 10898 Comp.LocStart = ON.getSourceRange().getBegin(); 10899 Comp.LocEnd = ON.getSourceRange().getEnd(); 10900 switch (ON.getKind()) { 10901 case OffsetOfNode::Array: { 10902 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10903 ExprResult Index = getDerived().TransformExpr(FromIndex); 10904 if (Index.isInvalid()) 10905 return ExprError(); 10906 10907 ExprChanged = ExprChanged || Index.get() != FromIndex; 10908 Comp.isBrackets = true; 10909 Comp.U.E = Index.get(); 10910 break; 10911 } 10912 10913 case OffsetOfNode::Field: 10914 case OffsetOfNode::Identifier: 10915 Comp.isBrackets = false; 10916 Comp.U.IdentInfo = ON.getFieldName(); 10917 if (!Comp.U.IdentInfo) 10918 continue; 10919 10920 break; 10921 10922 case OffsetOfNode::Base: 10923 // Will be recomputed during the rebuild. 10924 continue; 10925 } 10926 10927 Components.push_back(Comp); 10928 } 10929 10930 // If nothing changed, retain the existing expression. 10931 if (!getDerived().AlwaysRebuild() && 10932 Type == E->getTypeSourceInfo() && 10933 !ExprChanged) 10934 return E; 10935 10936 // Build a new offsetof expression. 10937 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10938 Components, E->getRParenLoc()); 10939 } 10940 10941 template<typename Derived> 10942 ExprResult 10943 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10944 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10945 "opaque value expression requires transformation"); 10946 return E; 10947 } 10948 10949 template<typename Derived> 10950 ExprResult 10951 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10952 return E; 10953 } 10954 10955 template <typename Derived> 10956 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10957 llvm::SmallVector<Expr *, 8> Children; 10958 bool Changed = false; 10959 for (Expr *C : E->subExpressions()) { 10960 ExprResult NewC = getDerived().TransformExpr(C); 10961 if (NewC.isInvalid()) 10962 return ExprError(); 10963 Children.push_back(NewC.get()); 10964 10965 Changed |= NewC.get() != C; 10966 } 10967 if (!getDerived().AlwaysRebuild() && !Changed) 10968 return E; 10969 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10970 Children, E->getType()); 10971 } 10972 10973 template<typename Derived> 10974 ExprResult 10975 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10976 // Rebuild the syntactic form. The original syntactic form has 10977 // opaque-value expressions in it, so strip those away and rebuild 10978 // the result. This is a really awful way of doing this, but the 10979 // better solution (rebuilding the semantic expressions and 10980 // rebinding OVEs as necessary) doesn't work; we'd need 10981 // TreeTransform to not strip away implicit conversions. 10982 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10983 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10984 if (result.isInvalid()) return ExprError(); 10985 10986 // If that gives us a pseudo-object result back, the pseudo-object 10987 // expression must have been an lvalue-to-rvalue conversion which we 10988 // should reapply. 10989 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10990 result = SemaRef.checkPseudoObjectRValue(result.get()); 10991 10992 return result; 10993 } 10994 10995 template<typename Derived> 10996 ExprResult 10997 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10998 UnaryExprOrTypeTraitExpr *E) { 10999 if (E->isArgumentType()) { 11000 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 11001 11002 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11003 if (!NewT) 11004 return ExprError(); 11005 11006 if (!getDerived().AlwaysRebuild() && OldT == NewT) 11007 return E; 11008 11009 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 11010 E->getKind(), 11011 E->getSourceRange()); 11012 } 11013 11014 // C++0x [expr.sizeof]p1: 11015 // The operand is either an expression, which is an unevaluated operand 11016 // [...] 11017 EnterExpressionEvaluationContext Unevaluated( 11018 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11019 Sema::ReuseLambdaContextDecl); 11020 11021 // Try to recover if we have something like sizeof(T::X) where X is a type. 11022 // Notably, there must be *exactly* one set of parens if X is a type. 11023 TypeSourceInfo *RecoveryTSI = nullptr; 11024 ExprResult SubExpr; 11025 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 11026 if (auto *DRE = 11027 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 11028 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 11029 PE, DRE, false, &RecoveryTSI); 11030 else 11031 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 11032 11033 if (RecoveryTSI) { 11034 return getDerived().RebuildUnaryExprOrTypeTrait( 11035 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 11036 } else if (SubExpr.isInvalid()) 11037 return ExprError(); 11038 11039 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 11040 return E; 11041 11042 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 11043 E->getOperatorLoc(), 11044 E->getKind(), 11045 E->getSourceRange()); 11046 } 11047 11048 template<typename Derived> 11049 ExprResult 11050 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 11051 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11052 if (LHS.isInvalid()) 11053 return ExprError(); 11054 11055 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11056 if (RHS.isInvalid()) 11057 return ExprError(); 11058 11059 11060 if (!getDerived().AlwaysRebuild() && 11061 LHS.get() == E->getLHS() && 11062 RHS.get() == E->getRHS()) 11063 return E; 11064 11065 return getDerived().RebuildArraySubscriptExpr( 11066 LHS.get(), 11067 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 11068 } 11069 11070 template <typename Derived> 11071 ExprResult 11072 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 11073 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11074 if (Base.isInvalid()) 11075 return ExprError(); 11076 11077 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 11078 if (RowIdx.isInvalid()) 11079 return ExprError(); 11080 11081 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 11082 if (ColumnIdx.isInvalid()) 11083 return ExprError(); 11084 11085 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11086 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 11087 return E; 11088 11089 return getDerived().RebuildMatrixSubscriptExpr( 11090 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 11091 } 11092 11093 template <typename Derived> 11094 ExprResult 11095 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 11096 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11097 if (Base.isInvalid()) 11098 return ExprError(); 11099 11100 ExprResult LowerBound; 11101 if (E->getLowerBound()) { 11102 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 11103 if (LowerBound.isInvalid()) 11104 return ExprError(); 11105 } 11106 11107 ExprResult Length; 11108 if (E->getLength()) { 11109 Length = getDerived().TransformExpr(E->getLength()); 11110 if (Length.isInvalid()) 11111 return ExprError(); 11112 } 11113 11114 ExprResult Stride; 11115 if (Expr *Str = E->getStride()) { 11116 Stride = getDerived().TransformExpr(Str); 11117 if (Stride.isInvalid()) 11118 return ExprError(); 11119 } 11120 11121 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 11122 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 11123 return E; 11124 11125 return getDerived().RebuildOMPArraySectionExpr( 11126 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 11127 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 11128 E->getRBracketLoc()); 11129 } 11130 11131 template <typename Derived> 11132 ExprResult 11133 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 11134 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11135 if (Base.isInvalid()) 11136 return ExprError(); 11137 11138 SmallVector<Expr *, 4> Dims; 11139 bool ErrorFound = false; 11140 for (Expr *Dim : E->getDimensions()) { 11141 ExprResult DimRes = getDerived().TransformExpr(Dim); 11142 if (DimRes.isInvalid()) { 11143 ErrorFound = true; 11144 continue; 11145 } 11146 Dims.push_back(DimRes.get()); 11147 } 11148 11149 if (ErrorFound) 11150 return ExprError(); 11151 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 11152 E->getRParenLoc(), Dims, 11153 E->getBracketsRanges()); 11154 } 11155 11156 template <typename Derived> 11157 ExprResult 11158 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 11159 unsigned NumIterators = E->numOfIterators(); 11160 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 11161 11162 bool ErrorFound = false; 11163 bool NeedToRebuild = getDerived().AlwaysRebuild(); 11164 for (unsigned I = 0; I < NumIterators; ++I) { 11165 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 11166 Data[I].DeclIdent = D->getIdentifier(); 11167 Data[I].DeclIdentLoc = D->getLocation(); 11168 if (D->getLocation() == D->getBeginLoc()) { 11169 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 11170 "Implicit type must be int."); 11171 } else { 11172 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 11173 QualType DeclTy = getDerived().TransformType(D->getType()); 11174 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 11175 } 11176 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 11177 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 11178 ExprResult End = getDerived().TransformExpr(Range.End); 11179 ExprResult Step = getDerived().TransformExpr(Range.Step); 11180 ErrorFound = ErrorFound || 11181 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 11182 !Data[I].Type.get().isNull())) || 11183 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 11184 if (ErrorFound) 11185 continue; 11186 Data[I].Range.Begin = Begin.get(); 11187 Data[I].Range.End = End.get(); 11188 Data[I].Range.Step = Step.get(); 11189 Data[I].AssignLoc = E->getAssignLoc(I); 11190 Data[I].ColonLoc = E->getColonLoc(I); 11191 Data[I].SecColonLoc = E->getSecondColonLoc(I); 11192 NeedToRebuild = 11193 NeedToRebuild || 11194 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 11195 D->getType().getTypePtrOrNull()) || 11196 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 11197 Range.Step != Data[I].Range.Step; 11198 } 11199 if (ErrorFound) 11200 return ExprError(); 11201 if (!NeedToRebuild) 11202 return E; 11203 11204 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 11205 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 11206 if (!Res.isUsable()) 11207 return Res; 11208 auto *IE = cast<OMPIteratorExpr>(Res.get()); 11209 for (unsigned I = 0; I < NumIterators; ++I) 11210 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 11211 IE->getIteratorDecl(I)); 11212 return Res; 11213 } 11214 11215 template<typename Derived> 11216 ExprResult 11217 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 11218 // Transform the callee. 11219 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11220 if (Callee.isInvalid()) 11221 return ExprError(); 11222 11223 // Transform arguments. 11224 bool ArgChanged = false; 11225 SmallVector<Expr*, 8> Args; 11226 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11227 &ArgChanged)) 11228 return ExprError(); 11229 11230 if (!getDerived().AlwaysRebuild() && 11231 Callee.get() == E->getCallee() && 11232 !ArgChanged) 11233 return SemaRef.MaybeBindToTemporary(E); 11234 11235 // FIXME: Wrong source location information for the '('. 11236 SourceLocation FakeLParenLoc 11237 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11238 11239 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11240 if (E->hasStoredFPFeatures()) { 11241 FPOptionsOverride NewOverrides = E->getFPFeatures(); 11242 getSema().CurFPFeatures = 11243 NewOverrides.applyOverrides(getSema().getLangOpts()); 11244 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11245 } 11246 11247 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11248 Args, 11249 E->getRParenLoc()); 11250 } 11251 11252 template<typename Derived> 11253 ExprResult 11254 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 11255 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11256 if (Base.isInvalid()) 11257 return ExprError(); 11258 11259 NestedNameSpecifierLoc QualifierLoc; 11260 if (E->hasQualifier()) { 11261 QualifierLoc 11262 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11263 11264 if (!QualifierLoc) 11265 return ExprError(); 11266 } 11267 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11268 11269 ValueDecl *Member 11270 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 11271 E->getMemberDecl())); 11272 if (!Member) 11273 return ExprError(); 11274 11275 NamedDecl *FoundDecl = E->getFoundDecl(); 11276 if (FoundDecl == E->getMemberDecl()) { 11277 FoundDecl = Member; 11278 } else { 11279 FoundDecl = cast_or_null<NamedDecl>( 11280 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11281 if (!FoundDecl) 11282 return ExprError(); 11283 } 11284 11285 if (!getDerived().AlwaysRebuild() && 11286 Base.get() == E->getBase() && 11287 QualifierLoc == E->getQualifierLoc() && 11288 Member == E->getMemberDecl() && 11289 FoundDecl == E->getFoundDecl() && 11290 !E->hasExplicitTemplateArgs()) { 11291 11292 // Skip for member expression of (this->f), rebuilt thisi->f is needed 11293 // for Openmp where the field need to be privatizized in the case. 11294 if (!(isa<CXXThisExpr>(E->getBase()) && 11295 getSema().isOpenMPRebuildMemberExpr(cast<ValueDecl>(Member)))) { 11296 // Mark it referenced in the new context regardless. 11297 // FIXME: this is a bit instantiation-specific. 11298 SemaRef.MarkMemberReferenced(E); 11299 return E; 11300 } 11301 } 11302 11303 TemplateArgumentListInfo TransArgs; 11304 if (E->hasExplicitTemplateArgs()) { 11305 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11306 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11307 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11308 E->getNumTemplateArgs(), 11309 TransArgs)) 11310 return ExprError(); 11311 } 11312 11313 // FIXME: Bogus source location for the operator 11314 SourceLocation FakeOperatorLoc = 11315 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11316 11317 // FIXME: to do this check properly, we will need to preserve the 11318 // first-qualifier-in-scope here, just in case we had a dependent 11319 // base (and therefore couldn't do the check) and a 11320 // nested-name-qualifier (and therefore could do the lookup). 11321 NamedDecl *FirstQualifierInScope = nullptr; 11322 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11323 if (MemberNameInfo.getName()) { 11324 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11325 if (!MemberNameInfo.getName()) 11326 return ExprError(); 11327 } 11328 11329 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11330 E->isArrow(), 11331 QualifierLoc, 11332 TemplateKWLoc, 11333 MemberNameInfo, 11334 Member, 11335 FoundDecl, 11336 (E->hasExplicitTemplateArgs() 11337 ? &TransArgs : nullptr), 11338 FirstQualifierInScope); 11339 } 11340 11341 template<typename Derived> 11342 ExprResult 11343 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11344 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11345 if (LHS.isInvalid()) 11346 return ExprError(); 11347 11348 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11349 if (RHS.isInvalid()) 11350 return ExprError(); 11351 11352 if (!getDerived().AlwaysRebuild() && 11353 LHS.get() == E->getLHS() && 11354 RHS.get() == E->getRHS()) 11355 return E; 11356 11357 if (E->isCompoundAssignmentOp()) 11358 // FPFeatures has already been established from trailing storage 11359 return getDerived().RebuildBinaryOperator( 11360 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11361 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11362 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11363 getSema().CurFPFeatures = 11364 NewOverrides.applyOverrides(getSema().getLangOpts()); 11365 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11366 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11367 LHS.get(), RHS.get()); 11368 } 11369 11370 template <typename Derived> 11371 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11372 CXXRewrittenBinaryOperator *E) { 11373 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11374 11375 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11376 if (LHS.isInvalid()) 11377 return ExprError(); 11378 11379 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11380 if (RHS.isInvalid()) 11381 return ExprError(); 11382 11383 // Extract the already-resolved callee declarations so that we can restrict 11384 // ourselves to using them as the unqualified lookup results when rebuilding. 11385 UnresolvedSet<2> UnqualLookups; 11386 bool ChangedAnyLookups = false; 11387 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11388 const_cast<Expr *>(Decomp.InnerBinOp)}; 11389 for (Expr *PossibleBinOp : PossibleBinOps) { 11390 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11391 if (!Op) 11392 continue; 11393 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11394 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11395 continue; 11396 11397 // Transform the callee in case we built a call to a local extern 11398 // declaration. 11399 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11400 E->getOperatorLoc(), Callee->getFoundDecl())); 11401 if (!Found) 11402 return ExprError(); 11403 if (Found != Callee->getFoundDecl()) 11404 ChangedAnyLookups = true; 11405 UnqualLookups.addDecl(Found); 11406 } 11407 11408 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11409 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11410 // Mark all functions used in the rewrite as referenced. Note that when 11411 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11412 // function calls, and/or there might be a user-defined conversion sequence 11413 // applied to the operands of the <. 11414 // FIXME: this is a bit instantiation-specific. 11415 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11416 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11417 return E; 11418 } 11419 11420 return getDerived().RebuildCXXRewrittenBinaryOperator( 11421 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11422 } 11423 11424 template<typename Derived> 11425 ExprResult 11426 TreeTransform<Derived>::TransformCompoundAssignOperator( 11427 CompoundAssignOperator *E) { 11428 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11429 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11430 getSema().CurFPFeatures = 11431 NewOverrides.applyOverrides(getSema().getLangOpts()); 11432 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11433 return getDerived().TransformBinaryOperator(E); 11434 } 11435 11436 template<typename Derived> 11437 ExprResult TreeTransform<Derived>:: 11438 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11439 // Just rebuild the common and RHS expressions and see whether we 11440 // get any changes. 11441 11442 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11443 if (commonExpr.isInvalid()) 11444 return ExprError(); 11445 11446 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11447 if (rhs.isInvalid()) 11448 return ExprError(); 11449 11450 if (!getDerived().AlwaysRebuild() && 11451 commonExpr.get() == e->getCommon() && 11452 rhs.get() == e->getFalseExpr()) 11453 return e; 11454 11455 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11456 e->getQuestionLoc(), 11457 nullptr, 11458 e->getColonLoc(), 11459 rhs.get()); 11460 } 11461 11462 template<typename Derived> 11463 ExprResult 11464 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11465 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11466 if (Cond.isInvalid()) 11467 return ExprError(); 11468 11469 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11470 if (LHS.isInvalid()) 11471 return ExprError(); 11472 11473 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11474 if (RHS.isInvalid()) 11475 return ExprError(); 11476 11477 if (!getDerived().AlwaysRebuild() && 11478 Cond.get() == E->getCond() && 11479 LHS.get() == E->getLHS() && 11480 RHS.get() == E->getRHS()) 11481 return E; 11482 11483 return getDerived().RebuildConditionalOperator(Cond.get(), 11484 E->getQuestionLoc(), 11485 LHS.get(), 11486 E->getColonLoc(), 11487 RHS.get()); 11488 } 11489 11490 template<typename Derived> 11491 ExprResult 11492 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11493 // Implicit casts are eliminated during transformation, since they 11494 // will be recomputed by semantic analysis after transformation. 11495 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11496 } 11497 11498 template<typename Derived> 11499 ExprResult 11500 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11501 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11502 if (!Type) 11503 return ExprError(); 11504 11505 ExprResult SubExpr 11506 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11507 if (SubExpr.isInvalid()) 11508 return ExprError(); 11509 11510 if (!getDerived().AlwaysRebuild() && 11511 Type == E->getTypeInfoAsWritten() && 11512 SubExpr.get() == E->getSubExpr()) 11513 return E; 11514 11515 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11516 Type, 11517 E->getRParenLoc(), 11518 SubExpr.get()); 11519 } 11520 11521 template<typename Derived> 11522 ExprResult 11523 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11524 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11525 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11526 if (!NewT) 11527 return ExprError(); 11528 11529 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11530 if (Init.isInvalid()) 11531 return ExprError(); 11532 11533 if (!getDerived().AlwaysRebuild() && 11534 OldT == NewT && 11535 Init.get() == E->getInitializer()) 11536 return SemaRef.MaybeBindToTemporary(E); 11537 11538 // Note: the expression type doesn't necessarily match the 11539 // type-as-written, but that's okay, because it should always be 11540 // derivable from the initializer. 11541 11542 return getDerived().RebuildCompoundLiteralExpr( 11543 E->getLParenLoc(), NewT, 11544 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11545 } 11546 11547 template<typename Derived> 11548 ExprResult 11549 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11550 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11551 if (Base.isInvalid()) 11552 return ExprError(); 11553 11554 if (!getDerived().AlwaysRebuild() && 11555 Base.get() == E->getBase()) 11556 return E; 11557 11558 // FIXME: Bad source location 11559 SourceLocation FakeOperatorLoc = 11560 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11561 return getDerived().RebuildExtVectorElementExpr( 11562 Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(), 11563 E->getAccessor()); 11564 } 11565 11566 template<typename Derived> 11567 ExprResult 11568 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11569 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11570 E = Syntactic; 11571 11572 bool InitChanged = false; 11573 11574 EnterExpressionEvaluationContext Context( 11575 getSema(), EnterExpressionEvaluationContext::InitList); 11576 11577 SmallVector<Expr*, 4> Inits; 11578 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11579 Inits, &InitChanged)) 11580 return ExprError(); 11581 11582 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11583 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11584 // in some cases. We can't reuse it in general, because the syntactic and 11585 // semantic forms are linked, and we can't know that semantic form will 11586 // match even if the syntactic form does. 11587 } 11588 11589 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11590 E->getRBraceLoc()); 11591 } 11592 11593 template<typename Derived> 11594 ExprResult 11595 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11596 Designation Desig; 11597 11598 // transform the initializer value 11599 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11600 if (Init.isInvalid()) 11601 return ExprError(); 11602 11603 // transform the designators. 11604 SmallVector<Expr*, 4> ArrayExprs; 11605 bool ExprChanged = false; 11606 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11607 if (D.isFieldDesignator()) { 11608 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11609 D.getDotLoc(), 11610 D.getFieldLoc())); 11611 if (D.getField()) { 11612 FieldDecl *Field = cast_or_null<FieldDecl>( 11613 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11614 if (Field != D.getField()) 11615 // Rebuild the expression when the transformed FieldDecl is 11616 // different to the already assigned FieldDecl. 11617 ExprChanged = true; 11618 } else { 11619 // Ensure that the designator expression is rebuilt when there isn't 11620 // a resolved FieldDecl in the designator as we don't want to assign 11621 // a FieldDecl to a pattern designator that will be instantiated again. 11622 ExprChanged = true; 11623 } 11624 continue; 11625 } 11626 11627 if (D.isArrayDesignator()) { 11628 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11629 if (Index.isInvalid()) 11630 return ExprError(); 11631 11632 Desig.AddDesignator( 11633 Designator::getArray(Index.get(), D.getLBracketLoc())); 11634 11635 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11636 ArrayExprs.push_back(Index.get()); 11637 continue; 11638 } 11639 11640 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11641 ExprResult Start 11642 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11643 if (Start.isInvalid()) 11644 return ExprError(); 11645 11646 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11647 if (End.isInvalid()) 11648 return ExprError(); 11649 11650 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11651 End.get(), 11652 D.getLBracketLoc(), 11653 D.getEllipsisLoc())); 11654 11655 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11656 End.get() != E->getArrayRangeEnd(D); 11657 11658 ArrayExprs.push_back(Start.get()); 11659 ArrayExprs.push_back(End.get()); 11660 } 11661 11662 if (!getDerived().AlwaysRebuild() && 11663 Init.get() == E->getInit() && 11664 !ExprChanged) 11665 return E; 11666 11667 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11668 E->getEqualOrColonLoc(), 11669 E->usesGNUSyntax(), Init.get()); 11670 } 11671 11672 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11673 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11674 template<typename Derived> 11675 ExprResult 11676 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11677 DesignatedInitUpdateExpr *E) { 11678 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11679 "initializer"); 11680 return ExprError(); 11681 } 11682 11683 template<typename Derived> 11684 ExprResult 11685 TreeTransform<Derived>::TransformNoInitExpr( 11686 NoInitExpr *E) { 11687 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11688 return ExprError(); 11689 } 11690 11691 template<typename Derived> 11692 ExprResult 11693 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11694 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11695 return ExprError(); 11696 } 11697 11698 template<typename Derived> 11699 ExprResult 11700 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11701 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11702 return ExprError(); 11703 } 11704 11705 template<typename Derived> 11706 ExprResult 11707 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11708 ImplicitValueInitExpr *E) { 11709 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11710 11711 // FIXME: Will we ever have proper type location here? Will we actually 11712 // need to transform the type? 11713 QualType T = getDerived().TransformType(E->getType()); 11714 if (T.isNull()) 11715 return ExprError(); 11716 11717 if (!getDerived().AlwaysRebuild() && 11718 T == E->getType()) 11719 return E; 11720 11721 return getDerived().RebuildImplicitValueInitExpr(T); 11722 } 11723 11724 template<typename Derived> 11725 ExprResult 11726 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11727 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11728 if (!TInfo) 11729 return ExprError(); 11730 11731 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11732 if (SubExpr.isInvalid()) 11733 return ExprError(); 11734 11735 if (!getDerived().AlwaysRebuild() && 11736 TInfo == E->getWrittenTypeInfo() && 11737 SubExpr.get() == E->getSubExpr()) 11738 return E; 11739 11740 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11741 TInfo, E->getRParenLoc()); 11742 } 11743 11744 template<typename Derived> 11745 ExprResult 11746 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11747 bool ArgumentChanged = false; 11748 SmallVector<Expr*, 4> Inits; 11749 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11750 &ArgumentChanged)) 11751 return ExprError(); 11752 11753 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11754 Inits, 11755 E->getRParenLoc()); 11756 } 11757 11758 /// Transform an address-of-label expression. 11759 /// 11760 /// By default, the transformation of an address-of-label expression always 11761 /// rebuilds the expression, so that the label identifier can be resolved to 11762 /// the corresponding label statement by semantic analysis. 11763 template<typename Derived> 11764 ExprResult 11765 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11766 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11767 E->getLabel()); 11768 if (!LD) 11769 return ExprError(); 11770 11771 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11772 cast<LabelDecl>(LD)); 11773 } 11774 11775 template<typename Derived> 11776 ExprResult 11777 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11778 SemaRef.ActOnStartStmtExpr(); 11779 StmtResult SubStmt 11780 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11781 if (SubStmt.isInvalid()) { 11782 SemaRef.ActOnStmtExprError(); 11783 return ExprError(); 11784 } 11785 11786 unsigned OldDepth = E->getTemplateDepth(); 11787 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11788 11789 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11790 SubStmt.get() == E->getSubStmt()) { 11791 // Calling this an 'error' is unintuitive, but it does the right thing. 11792 SemaRef.ActOnStmtExprError(); 11793 return SemaRef.MaybeBindToTemporary(E); 11794 } 11795 11796 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11797 E->getRParenLoc(), NewDepth); 11798 } 11799 11800 template<typename Derived> 11801 ExprResult 11802 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11803 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11804 if (Cond.isInvalid()) 11805 return ExprError(); 11806 11807 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11808 if (LHS.isInvalid()) 11809 return ExprError(); 11810 11811 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11812 if (RHS.isInvalid()) 11813 return ExprError(); 11814 11815 if (!getDerived().AlwaysRebuild() && 11816 Cond.get() == E->getCond() && 11817 LHS.get() == E->getLHS() && 11818 RHS.get() == E->getRHS()) 11819 return E; 11820 11821 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11822 Cond.get(), LHS.get(), RHS.get(), 11823 E->getRParenLoc()); 11824 } 11825 11826 template<typename Derived> 11827 ExprResult 11828 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11829 return E; 11830 } 11831 11832 template<typename Derived> 11833 ExprResult 11834 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11835 switch (E->getOperator()) { 11836 case OO_New: 11837 case OO_Delete: 11838 case OO_Array_New: 11839 case OO_Array_Delete: 11840 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11841 11842 case OO_Subscript: 11843 case OO_Call: { 11844 // This is a call to an object's operator(). 11845 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11846 11847 // Transform the object itself. 11848 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11849 if (Object.isInvalid()) 11850 return ExprError(); 11851 11852 // FIXME: Poor location information 11853 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11854 static_cast<Expr *>(Object.get())->getEndLoc()); 11855 11856 // Transform the call arguments. 11857 SmallVector<Expr*, 8> Args; 11858 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11859 Args)) 11860 return ExprError(); 11861 11862 if (E->getOperator() == OO_Subscript) 11863 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11864 Args, E->getEndLoc()); 11865 11866 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11867 E->getEndLoc()); 11868 } 11869 11870 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11871 case OO_##Name: \ 11872 break; 11873 11874 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11875 #include "clang/Basic/OperatorKinds.def" 11876 11877 case OO_Conditional: 11878 llvm_unreachable("conditional operator is not actually overloadable"); 11879 11880 case OO_None: 11881 case NUM_OVERLOADED_OPERATORS: 11882 llvm_unreachable("not an overloaded operator?"); 11883 } 11884 11885 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11886 if (Callee.isInvalid()) 11887 return ExprError(); 11888 11889 ExprResult First; 11890 if (E->getOperator() == OO_Amp) 11891 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11892 else 11893 First = getDerived().TransformExpr(E->getArg(0)); 11894 if (First.isInvalid()) 11895 return ExprError(); 11896 11897 ExprResult Second; 11898 if (E->getNumArgs() == 2) { 11899 Second = getDerived().TransformExpr(E->getArg(1)); 11900 if (Second.isInvalid()) 11901 return ExprError(); 11902 } 11903 11904 if (!getDerived().AlwaysRebuild() && 11905 Callee.get() == E->getCallee() && 11906 First.get() == E->getArg(0) && 11907 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11908 return SemaRef.MaybeBindToTemporary(E); 11909 11910 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11911 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11912 getSema().CurFPFeatures = 11913 NewOverrides.applyOverrides(getSema().getLangOpts()); 11914 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11915 11916 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11917 E->getOperatorLoc(), 11918 Callee.get(), 11919 First.get(), 11920 Second.get()); 11921 } 11922 11923 template<typename Derived> 11924 ExprResult 11925 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11926 return getDerived().TransformCallExpr(E); 11927 } 11928 11929 template <typename Derived> 11930 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11931 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11932 getSema().CurContext != E->getParentContext(); 11933 11934 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11935 return E; 11936 11937 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 11938 E->getBeginLoc(), E->getEndLoc(), 11939 getSema().CurContext); 11940 } 11941 11942 template<typename Derived> 11943 ExprResult 11944 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11945 // Transform the callee. 11946 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11947 if (Callee.isInvalid()) 11948 return ExprError(); 11949 11950 // Transform exec config. 11951 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11952 if (EC.isInvalid()) 11953 return ExprError(); 11954 11955 // Transform arguments. 11956 bool ArgChanged = false; 11957 SmallVector<Expr*, 8> Args; 11958 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11959 &ArgChanged)) 11960 return ExprError(); 11961 11962 if (!getDerived().AlwaysRebuild() && 11963 Callee.get() == E->getCallee() && 11964 !ArgChanged) 11965 return SemaRef.MaybeBindToTemporary(E); 11966 11967 // FIXME: Wrong source location information for the '('. 11968 SourceLocation FakeLParenLoc 11969 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11970 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11971 Args, 11972 E->getRParenLoc(), EC.get()); 11973 } 11974 11975 template<typename Derived> 11976 ExprResult 11977 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11978 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11979 if (!Type) 11980 return ExprError(); 11981 11982 ExprResult SubExpr 11983 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11984 if (SubExpr.isInvalid()) 11985 return ExprError(); 11986 11987 if (!getDerived().AlwaysRebuild() && 11988 Type == E->getTypeInfoAsWritten() && 11989 SubExpr.get() == E->getSubExpr()) 11990 return E; 11991 return getDerived().RebuildCXXNamedCastExpr( 11992 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11993 Type, E->getAngleBrackets().getEnd(), 11994 // FIXME. this should be '(' location 11995 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11996 } 11997 11998 template<typename Derived> 11999 ExprResult 12000 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 12001 TypeSourceInfo *TSI = 12002 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 12003 if (!TSI) 12004 return ExprError(); 12005 12006 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 12007 if (Sub.isInvalid()) 12008 return ExprError(); 12009 12010 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 12011 Sub.get(), BCE->getEndLoc()); 12012 } 12013 12014 template<typename Derived> 12015 ExprResult 12016 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 12017 return getDerived().TransformCXXNamedCastExpr(E); 12018 } 12019 12020 template<typename Derived> 12021 ExprResult 12022 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 12023 return getDerived().TransformCXXNamedCastExpr(E); 12024 } 12025 12026 template<typename Derived> 12027 ExprResult 12028 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 12029 CXXReinterpretCastExpr *E) { 12030 return getDerived().TransformCXXNamedCastExpr(E); 12031 } 12032 12033 template<typename Derived> 12034 ExprResult 12035 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 12036 return getDerived().TransformCXXNamedCastExpr(E); 12037 } 12038 12039 template<typename Derived> 12040 ExprResult 12041 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 12042 return getDerived().TransformCXXNamedCastExpr(E); 12043 } 12044 12045 template<typename Derived> 12046 ExprResult 12047 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 12048 CXXFunctionalCastExpr *E) { 12049 TypeSourceInfo *Type = 12050 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 12051 if (!Type) 12052 return ExprError(); 12053 12054 ExprResult SubExpr 12055 = getDerived().TransformExpr(E->getSubExprAsWritten()); 12056 if (SubExpr.isInvalid()) 12057 return ExprError(); 12058 12059 if (!getDerived().AlwaysRebuild() && 12060 Type == E->getTypeInfoAsWritten() && 12061 SubExpr.get() == E->getSubExpr()) 12062 return E; 12063 12064 return getDerived().RebuildCXXFunctionalCastExpr(Type, 12065 E->getLParenLoc(), 12066 SubExpr.get(), 12067 E->getRParenLoc(), 12068 E->isListInitialization()); 12069 } 12070 12071 template<typename Derived> 12072 ExprResult 12073 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 12074 if (E->isTypeOperand()) { 12075 TypeSourceInfo *TInfo 12076 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12077 if (!TInfo) 12078 return ExprError(); 12079 12080 if (!getDerived().AlwaysRebuild() && 12081 TInfo == E->getTypeOperandSourceInfo()) 12082 return E; 12083 12084 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12085 TInfo, E->getEndLoc()); 12086 } 12087 12088 // Typeid's operand is an unevaluated context, unless it's a polymorphic 12089 // type. We must not unilaterally enter unevaluated context here, as then 12090 // semantic processing can re-transform an already transformed operand. 12091 Expr *Op = E->getExprOperand(); 12092 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 12093 if (E->isGLValue()) 12094 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 12095 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 12096 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 12097 12098 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 12099 Sema::ReuseLambdaContextDecl); 12100 12101 ExprResult SubExpr = getDerived().TransformExpr(Op); 12102 if (SubExpr.isInvalid()) 12103 return ExprError(); 12104 12105 if (!getDerived().AlwaysRebuild() && 12106 SubExpr.get() == E->getExprOperand()) 12107 return E; 12108 12109 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 12110 SubExpr.get(), E->getEndLoc()); 12111 } 12112 12113 template<typename Derived> 12114 ExprResult 12115 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 12116 if (E->isTypeOperand()) { 12117 TypeSourceInfo *TInfo 12118 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 12119 if (!TInfo) 12120 return ExprError(); 12121 12122 if (!getDerived().AlwaysRebuild() && 12123 TInfo == E->getTypeOperandSourceInfo()) 12124 return E; 12125 12126 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12127 TInfo, E->getEndLoc()); 12128 } 12129 12130 EnterExpressionEvaluationContext Unevaluated( 12131 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12132 12133 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 12134 if (SubExpr.isInvalid()) 12135 return ExprError(); 12136 12137 if (!getDerived().AlwaysRebuild() && 12138 SubExpr.get() == E->getExprOperand()) 12139 return E; 12140 12141 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 12142 SubExpr.get(), E->getEndLoc()); 12143 } 12144 12145 template<typename Derived> 12146 ExprResult 12147 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 12148 return E; 12149 } 12150 12151 template<typename Derived> 12152 ExprResult 12153 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 12154 CXXNullPtrLiteralExpr *E) { 12155 return E; 12156 } 12157 12158 template<typename Derived> 12159 ExprResult 12160 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 12161 QualType T = getSema().getCurrentThisType(); 12162 12163 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 12164 // Mark it referenced in the new context regardless. 12165 // FIXME: this is a bit instantiation-specific. 12166 getSema().MarkThisReferenced(E); 12167 return E; 12168 } 12169 12170 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 12171 } 12172 12173 template<typename Derived> 12174 ExprResult 12175 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 12176 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12177 if (SubExpr.isInvalid()) 12178 return ExprError(); 12179 12180 if (!getDerived().AlwaysRebuild() && 12181 SubExpr.get() == E->getSubExpr()) 12182 return E; 12183 12184 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 12185 E->isThrownVariableInScope()); 12186 } 12187 12188 template<typename Derived> 12189 ExprResult 12190 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 12191 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 12192 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 12193 if (!Param) 12194 return ExprError(); 12195 12196 ExprResult InitRes; 12197 if (E->hasRewrittenInit()) { 12198 InitRes = getDerived().TransformExpr(E->getRewrittenExpr()); 12199 if (InitRes.isInvalid()) 12200 return ExprError(); 12201 } 12202 12203 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 12204 E->getUsedContext() == SemaRef.CurContext && 12205 InitRes.get() == E->getRewrittenExpr()) 12206 return E; 12207 12208 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param, 12209 InitRes.get()); 12210 } 12211 12212 template<typename Derived> 12213 ExprResult 12214 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 12215 FieldDecl *Field = cast_or_null<FieldDecl>( 12216 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 12217 if (!Field) 12218 return ExprError(); 12219 12220 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 12221 E->getUsedContext() == SemaRef.CurContext) 12222 return E; 12223 12224 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 12225 } 12226 12227 template<typename Derived> 12228 ExprResult 12229 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 12230 CXXScalarValueInitExpr *E) { 12231 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 12232 if (!T) 12233 return ExprError(); 12234 12235 if (!getDerived().AlwaysRebuild() && 12236 T == E->getTypeSourceInfo()) 12237 return E; 12238 12239 return getDerived().RebuildCXXScalarValueInitExpr(T, 12240 /*FIXME:*/T->getTypeLoc().getEndLoc(), 12241 E->getRParenLoc()); 12242 } 12243 12244 template<typename Derived> 12245 ExprResult 12246 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 12247 // Transform the type that we're allocating 12248 TypeSourceInfo *AllocTypeInfo = 12249 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 12250 if (!AllocTypeInfo) 12251 return ExprError(); 12252 12253 // Transform the size of the array we're allocating (if any). 12254 std::optional<Expr *> ArraySize; 12255 if (E->isArray()) { 12256 ExprResult NewArraySize; 12257 if (std::optional<Expr *> OldArraySize = E->getArraySize()) { 12258 NewArraySize = getDerived().TransformExpr(*OldArraySize); 12259 if (NewArraySize.isInvalid()) 12260 return ExprError(); 12261 } 12262 ArraySize = NewArraySize.get(); 12263 } 12264 12265 // Transform the placement arguments (if any). 12266 bool ArgumentChanged = false; 12267 SmallVector<Expr*, 8> PlacementArgs; 12268 if (getDerived().TransformExprs(E->getPlacementArgs(), 12269 E->getNumPlacementArgs(), true, 12270 PlacementArgs, &ArgumentChanged)) 12271 return ExprError(); 12272 12273 // Transform the initializer (if any). 12274 Expr *OldInit = E->getInitializer(); 12275 ExprResult NewInit; 12276 if (OldInit) 12277 NewInit = getDerived().TransformInitializer(OldInit, true); 12278 if (NewInit.isInvalid()) 12279 return ExprError(); 12280 12281 // Transform new operator and delete operator. 12282 FunctionDecl *OperatorNew = nullptr; 12283 if (E->getOperatorNew()) { 12284 OperatorNew = cast_or_null<FunctionDecl>( 12285 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 12286 if (!OperatorNew) 12287 return ExprError(); 12288 } 12289 12290 FunctionDecl *OperatorDelete = nullptr; 12291 if (E->getOperatorDelete()) { 12292 OperatorDelete = cast_or_null<FunctionDecl>( 12293 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12294 if (!OperatorDelete) 12295 return ExprError(); 12296 } 12297 12298 if (!getDerived().AlwaysRebuild() && 12299 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12300 ArraySize == E->getArraySize() && 12301 NewInit.get() == OldInit && 12302 OperatorNew == E->getOperatorNew() && 12303 OperatorDelete == E->getOperatorDelete() && 12304 !ArgumentChanged) { 12305 // Mark any declarations we need as referenced. 12306 // FIXME: instantiation-specific. 12307 if (OperatorNew) 12308 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12309 if (OperatorDelete) 12310 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12311 12312 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12313 QualType ElementType 12314 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12315 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12316 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12317 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12318 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12319 } 12320 } 12321 } 12322 12323 return E; 12324 } 12325 12326 QualType AllocType = AllocTypeInfo->getType(); 12327 if (!ArraySize) { 12328 // If no array size was specified, but the new expression was 12329 // instantiated with an array type (e.g., "new T" where T is 12330 // instantiated with "int[4]"), extract the outer bound from the 12331 // array type as our array size. We do this with constant and 12332 // dependently-sized array types. 12333 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12334 if (!ArrayT) { 12335 // Do nothing 12336 } else if (const ConstantArrayType *ConsArrayT 12337 = dyn_cast<ConstantArrayType>(ArrayT)) { 12338 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12339 SemaRef.Context.getSizeType(), 12340 /*FIXME:*/ E->getBeginLoc()); 12341 AllocType = ConsArrayT->getElementType(); 12342 } else if (const DependentSizedArrayType *DepArrayT 12343 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12344 if (DepArrayT->getSizeExpr()) { 12345 ArraySize = DepArrayT->getSizeExpr(); 12346 AllocType = DepArrayT->getElementType(); 12347 } 12348 } 12349 } 12350 12351 return getDerived().RebuildCXXNewExpr( 12352 E->getBeginLoc(), E->isGlobalNew(), 12353 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12354 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12355 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12356 } 12357 12358 template<typename Derived> 12359 ExprResult 12360 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12361 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12362 if (Operand.isInvalid()) 12363 return ExprError(); 12364 12365 // Transform the delete operator, if known. 12366 FunctionDecl *OperatorDelete = nullptr; 12367 if (E->getOperatorDelete()) { 12368 OperatorDelete = cast_or_null<FunctionDecl>( 12369 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12370 if (!OperatorDelete) 12371 return ExprError(); 12372 } 12373 12374 if (!getDerived().AlwaysRebuild() && 12375 Operand.get() == E->getArgument() && 12376 OperatorDelete == E->getOperatorDelete()) { 12377 // Mark any declarations we need as referenced. 12378 // FIXME: instantiation-specific. 12379 if (OperatorDelete) 12380 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12381 12382 if (!E->getArgument()->isTypeDependent()) { 12383 QualType Destroyed = SemaRef.Context.getBaseElementType( 12384 E->getDestroyedType()); 12385 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12386 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12387 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12388 SemaRef.LookupDestructor(Record)); 12389 } 12390 } 12391 12392 return E; 12393 } 12394 12395 return getDerived().RebuildCXXDeleteExpr( 12396 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12397 } 12398 12399 template<typename Derived> 12400 ExprResult 12401 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12402 CXXPseudoDestructorExpr *E) { 12403 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12404 if (Base.isInvalid()) 12405 return ExprError(); 12406 12407 ParsedType ObjectTypePtr; 12408 bool MayBePseudoDestructor = false; 12409 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12410 E->getOperatorLoc(), 12411 E->isArrow()? tok::arrow : tok::period, 12412 ObjectTypePtr, 12413 MayBePseudoDestructor); 12414 if (Base.isInvalid()) 12415 return ExprError(); 12416 12417 QualType ObjectType = ObjectTypePtr.get(); 12418 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12419 if (QualifierLoc) { 12420 QualifierLoc 12421 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12422 if (!QualifierLoc) 12423 return ExprError(); 12424 } 12425 CXXScopeSpec SS; 12426 SS.Adopt(QualifierLoc); 12427 12428 PseudoDestructorTypeStorage Destroyed; 12429 if (E->getDestroyedTypeInfo()) { 12430 TypeSourceInfo *DestroyedTypeInfo 12431 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12432 ObjectType, nullptr, SS); 12433 if (!DestroyedTypeInfo) 12434 return ExprError(); 12435 Destroyed = DestroyedTypeInfo; 12436 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12437 // We aren't likely to be able to resolve the identifier down to a type 12438 // now anyway, so just retain the identifier. 12439 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12440 E->getDestroyedTypeLoc()); 12441 } else { 12442 // Look for a destructor known with the given name. 12443 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12444 *E->getDestroyedTypeIdentifier(), 12445 E->getDestroyedTypeLoc(), 12446 /*Scope=*/nullptr, 12447 SS, ObjectTypePtr, 12448 false); 12449 if (!T) 12450 return ExprError(); 12451 12452 Destroyed 12453 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12454 E->getDestroyedTypeLoc()); 12455 } 12456 12457 TypeSourceInfo *ScopeTypeInfo = nullptr; 12458 if (E->getScopeTypeInfo()) { 12459 CXXScopeSpec EmptySS; 12460 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12461 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12462 if (!ScopeTypeInfo) 12463 return ExprError(); 12464 } 12465 12466 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12467 E->getOperatorLoc(), 12468 E->isArrow(), 12469 SS, 12470 ScopeTypeInfo, 12471 E->getColonColonLoc(), 12472 E->getTildeLoc(), 12473 Destroyed); 12474 } 12475 12476 template <typename Derived> 12477 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12478 bool RequiresADL, 12479 LookupResult &R) { 12480 // Transform all the decls. 12481 bool AllEmptyPacks = true; 12482 for (auto *OldD : Old->decls()) { 12483 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12484 if (!InstD) { 12485 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12486 // This can happen because of dependent hiding. 12487 if (isa<UsingShadowDecl>(OldD)) 12488 continue; 12489 else { 12490 R.clear(); 12491 return true; 12492 } 12493 } 12494 12495 // Expand using pack declarations. 12496 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12497 ArrayRef<NamedDecl*> Decls = SingleDecl; 12498 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12499 Decls = UPD->expansions(); 12500 12501 // Expand using declarations. 12502 for (auto *D : Decls) { 12503 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12504 for (auto *SD : UD->shadows()) 12505 R.addDecl(SD); 12506 } else { 12507 R.addDecl(D); 12508 } 12509 } 12510 12511 AllEmptyPacks &= Decls.empty(); 12512 }; 12513 12514 // C++ [temp.res]/8.4.2: 12515 // The program is ill-formed, no diagnostic required, if [...] lookup for 12516 // a name in the template definition found a using-declaration, but the 12517 // lookup in the corresponding scope in the instantiation odoes not find 12518 // any declarations because the using-declaration was a pack expansion and 12519 // the corresponding pack is empty 12520 if (AllEmptyPacks && !RequiresADL) { 12521 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12522 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12523 return true; 12524 } 12525 12526 // Resolve a kind, but don't do any further analysis. If it's 12527 // ambiguous, the callee needs to deal with it. 12528 R.resolveKind(); 12529 return false; 12530 } 12531 12532 template<typename Derived> 12533 ExprResult 12534 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12535 UnresolvedLookupExpr *Old) { 12536 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12537 Sema::LookupOrdinaryName); 12538 12539 // Transform the declaration set. 12540 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12541 return ExprError(); 12542 12543 // Rebuild the nested-name qualifier, if present. 12544 CXXScopeSpec SS; 12545 if (Old->getQualifierLoc()) { 12546 NestedNameSpecifierLoc QualifierLoc 12547 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12548 if (!QualifierLoc) 12549 return ExprError(); 12550 12551 SS.Adopt(QualifierLoc); 12552 } 12553 12554 if (Old->getNamingClass()) { 12555 CXXRecordDecl *NamingClass 12556 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12557 Old->getNameLoc(), 12558 Old->getNamingClass())); 12559 if (!NamingClass) { 12560 R.clear(); 12561 return ExprError(); 12562 } 12563 12564 R.setNamingClass(NamingClass); 12565 } 12566 12567 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12568 12569 // If we have neither explicit template arguments, nor the template keyword, 12570 // it's a normal declaration name or member reference. 12571 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12572 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12573 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12574 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12575 // give a good diagnostic. 12576 if (D && D->isCXXInstanceMember()) { 12577 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12578 /*TemplateArgs=*/nullptr, 12579 /*Scope=*/nullptr); 12580 } 12581 12582 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12583 } 12584 12585 // If we have template arguments, rebuild them, then rebuild the 12586 // templateid expression. 12587 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12588 if (Old->hasExplicitTemplateArgs() && 12589 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12590 Old->getNumTemplateArgs(), 12591 TransArgs)) { 12592 R.clear(); 12593 return ExprError(); 12594 } 12595 12596 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12597 Old->requiresADL(), &TransArgs); 12598 } 12599 12600 template<typename Derived> 12601 ExprResult 12602 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12603 bool ArgChanged = false; 12604 SmallVector<TypeSourceInfo *, 4> Args; 12605 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12606 TypeSourceInfo *From = E->getArg(I); 12607 TypeLoc FromTL = From->getTypeLoc(); 12608 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12609 TypeLocBuilder TLB; 12610 TLB.reserve(FromTL.getFullDataSize()); 12611 QualType To = getDerived().TransformType(TLB, FromTL); 12612 if (To.isNull()) 12613 return ExprError(); 12614 12615 if (To == From->getType()) 12616 Args.push_back(From); 12617 else { 12618 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12619 ArgChanged = true; 12620 } 12621 continue; 12622 } 12623 12624 ArgChanged = true; 12625 12626 // We have a pack expansion. Instantiate it. 12627 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12628 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12629 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12630 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12631 12632 // Determine whether the set of unexpanded parameter packs can and should 12633 // be expanded. 12634 bool Expand = true; 12635 bool RetainExpansion = false; 12636 std::optional<unsigned> OrigNumExpansions = 12637 ExpansionTL.getTypePtr()->getNumExpansions(); 12638 std::optional<unsigned> NumExpansions = OrigNumExpansions; 12639 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12640 PatternTL.getSourceRange(), 12641 Unexpanded, 12642 Expand, RetainExpansion, 12643 NumExpansions)) 12644 return ExprError(); 12645 12646 if (!Expand) { 12647 // The transform has determined that we should perform a simple 12648 // transformation on the pack expansion, producing another pack 12649 // expansion. 12650 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12651 12652 TypeLocBuilder TLB; 12653 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12654 12655 QualType To = getDerived().TransformType(TLB, PatternTL); 12656 if (To.isNull()) 12657 return ExprError(); 12658 12659 To = getDerived().RebuildPackExpansionType(To, 12660 PatternTL.getSourceRange(), 12661 ExpansionTL.getEllipsisLoc(), 12662 NumExpansions); 12663 if (To.isNull()) 12664 return ExprError(); 12665 12666 PackExpansionTypeLoc ToExpansionTL 12667 = TLB.push<PackExpansionTypeLoc>(To); 12668 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12669 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12670 continue; 12671 } 12672 12673 // Expand the pack expansion by substituting for each argument in the 12674 // pack(s). 12675 for (unsigned I = 0; I != *NumExpansions; ++I) { 12676 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12677 TypeLocBuilder TLB; 12678 TLB.reserve(PatternTL.getFullDataSize()); 12679 QualType To = getDerived().TransformType(TLB, PatternTL); 12680 if (To.isNull()) 12681 return ExprError(); 12682 12683 if (To->containsUnexpandedParameterPack()) { 12684 To = getDerived().RebuildPackExpansionType(To, 12685 PatternTL.getSourceRange(), 12686 ExpansionTL.getEllipsisLoc(), 12687 NumExpansions); 12688 if (To.isNull()) 12689 return ExprError(); 12690 12691 PackExpansionTypeLoc ToExpansionTL 12692 = TLB.push<PackExpansionTypeLoc>(To); 12693 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12694 } 12695 12696 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12697 } 12698 12699 if (!RetainExpansion) 12700 continue; 12701 12702 // If we're supposed to retain a pack expansion, do so by temporarily 12703 // forgetting the partially-substituted parameter pack. 12704 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12705 12706 TypeLocBuilder TLB; 12707 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12708 12709 QualType To = getDerived().TransformType(TLB, PatternTL); 12710 if (To.isNull()) 12711 return ExprError(); 12712 12713 To = getDerived().RebuildPackExpansionType(To, 12714 PatternTL.getSourceRange(), 12715 ExpansionTL.getEllipsisLoc(), 12716 NumExpansions); 12717 if (To.isNull()) 12718 return ExprError(); 12719 12720 PackExpansionTypeLoc ToExpansionTL 12721 = TLB.push<PackExpansionTypeLoc>(To); 12722 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12723 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12724 } 12725 12726 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12727 return E; 12728 12729 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12730 E->getEndLoc()); 12731 } 12732 12733 template<typename Derived> 12734 ExprResult 12735 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12736 ConceptSpecializationExpr *E) { 12737 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12738 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12739 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12740 Old->NumTemplateArgs, TransArgs)) 12741 return ExprError(); 12742 12743 return getDerived().RebuildConceptSpecializationExpr( 12744 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12745 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12746 &TransArgs); 12747 } 12748 12749 template<typename Derived> 12750 ExprResult 12751 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12752 SmallVector<ParmVarDecl*, 4> TransParams; 12753 SmallVector<QualType, 4> TransParamTypes; 12754 Sema::ExtParameterInfoBuilder ExtParamInfos; 12755 12756 // C++2a [expr.prim.req]p2 12757 // Expressions appearing within a requirement-body are unevaluated operands. 12758 EnterExpressionEvaluationContext Ctx( 12759 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 12760 Sema::ReuseLambdaContextDecl); 12761 12762 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12763 getSema().Context, getSema().CurContext, 12764 E->getBody()->getBeginLoc()); 12765 12766 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12767 12768 ExprResult TypeParamResult = getDerived().TransformRequiresTypeParams( 12769 E->getRequiresKWLoc(), E->getRBraceLoc(), E, Body, 12770 E->getLocalParameters(), TransParamTypes, TransParams, ExtParamInfos); 12771 12772 for (ParmVarDecl *Param : TransParams) 12773 if (Param) 12774 Param->setDeclContext(Body); 12775 12776 // On failure to transform, TransformRequiresTypeParams returns an expression 12777 // in the event that the transformation of the type params failed in some way. 12778 // It is expected that this will result in a 'not satisfied' Requires clause 12779 // when instantiating. 12780 if (!TypeParamResult.isUnset()) 12781 return TypeParamResult; 12782 12783 SmallVector<concepts::Requirement *, 4> TransReqs; 12784 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12785 TransReqs)) 12786 return ExprError(); 12787 12788 for (concepts::Requirement *Req : TransReqs) { 12789 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12790 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12791 ER->getReturnTypeRequirement() 12792 .getTypeConstraintTemplateParameterList()->getParam(0) 12793 ->setDeclContext(Body); 12794 } 12795 } 12796 } 12797 12798 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12799 TransParams, TransReqs, 12800 E->getRBraceLoc()); 12801 } 12802 12803 template<typename Derived> 12804 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12805 ArrayRef<concepts::Requirement *> Reqs, 12806 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12807 for (concepts::Requirement *Req : Reqs) { 12808 concepts::Requirement *TransReq = nullptr; 12809 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12810 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12811 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12812 TransReq = getDerived().TransformExprRequirement(ExprReq); 12813 else 12814 TransReq = getDerived().TransformNestedRequirement( 12815 cast<concepts::NestedRequirement>(Req)); 12816 if (!TransReq) 12817 return true; 12818 Transformed.push_back(TransReq); 12819 } 12820 return false; 12821 } 12822 12823 template<typename Derived> 12824 concepts::TypeRequirement * 12825 TreeTransform<Derived>::TransformTypeRequirement( 12826 concepts::TypeRequirement *Req) { 12827 if (Req->isSubstitutionFailure()) { 12828 if (getDerived().AlwaysRebuild()) 12829 return getDerived().RebuildTypeRequirement( 12830 Req->getSubstitutionDiagnostic()); 12831 return Req; 12832 } 12833 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12834 if (!TransType) 12835 return nullptr; 12836 return getDerived().RebuildTypeRequirement(TransType); 12837 } 12838 12839 template<typename Derived> 12840 concepts::ExprRequirement * 12841 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12842 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12843 if (Req->isExprSubstitutionFailure()) 12844 TransExpr = Req->getExprSubstitutionDiagnostic(); 12845 else { 12846 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12847 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12848 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12849 if (TransExprRes.isInvalid()) 12850 return nullptr; 12851 TransExpr = TransExprRes.get(); 12852 } 12853 12854 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12855 const auto &RetReq = Req->getReturnTypeRequirement(); 12856 if (RetReq.isEmpty()) 12857 TransRetReq.emplace(); 12858 else if (RetReq.isSubstitutionFailure()) 12859 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12860 else if (RetReq.isTypeConstraint()) { 12861 TemplateParameterList *OrigTPL = 12862 RetReq.getTypeConstraintTemplateParameterList(); 12863 TemplateParameterList *TPL = 12864 getDerived().TransformTemplateParameterList(OrigTPL); 12865 if (!TPL) 12866 return nullptr; 12867 TransRetReq.emplace(TPL); 12868 } 12869 assert(TransRetReq && "All code paths leading here must set TransRetReq"); 12870 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12871 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12872 Req->getNoexceptLoc(), 12873 std::move(*TransRetReq)); 12874 return getDerived().RebuildExprRequirement( 12875 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12876 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12877 } 12878 12879 template<typename Derived> 12880 concepts::NestedRequirement * 12881 TreeTransform<Derived>::TransformNestedRequirement( 12882 concepts::NestedRequirement *Req) { 12883 if (Req->hasInvalidConstraint()) { 12884 if (getDerived().AlwaysRebuild()) 12885 return getDerived().RebuildNestedRequirement( 12886 Req->getInvalidConstraintEntity(), Req->getConstraintSatisfaction()); 12887 return Req; 12888 } 12889 ExprResult TransConstraint = 12890 getDerived().TransformExpr(Req->getConstraintExpr()); 12891 if (TransConstraint.isInvalid()) 12892 return nullptr; 12893 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12894 } 12895 12896 template<typename Derived> 12897 ExprResult 12898 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12899 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12900 if (!T) 12901 return ExprError(); 12902 12903 if (!getDerived().AlwaysRebuild() && 12904 T == E->getQueriedTypeSourceInfo()) 12905 return E; 12906 12907 ExprResult SubExpr; 12908 { 12909 EnterExpressionEvaluationContext Unevaluated( 12910 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12911 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12912 if (SubExpr.isInvalid()) 12913 return ExprError(); 12914 12915 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12916 return E; 12917 } 12918 12919 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12920 SubExpr.get(), E->getEndLoc()); 12921 } 12922 12923 template<typename Derived> 12924 ExprResult 12925 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12926 ExprResult SubExpr; 12927 { 12928 EnterExpressionEvaluationContext Unevaluated( 12929 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12930 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12931 if (SubExpr.isInvalid()) 12932 return ExprError(); 12933 12934 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12935 return E; 12936 } 12937 12938 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12939 SubExpr.get(), E->getEndLoc()); 12940 } 12941 12942 template <typename Derived> 12943 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12944 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12945 TypeSourceInfo **RecoveryTSI) { 12946 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12947 DRE, AddrTaken, RecoveryTSI); 12948 12949 // Propagate both errors and recovered types, which return ExprEmpty. 12950 if (!NewDRE.isUsable()) 12951 return NewDRE; 12952 12953 // We got an expr, wrap it up in parens. 12954 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12955 return PE; 12956 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12957 PE->getRParen()); 12958 } 12959 12960 template <typename Derived> 12961 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12962 DependentScopeDeclRefExpr *E) { 12963 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12964 nullptr); 12965 } 12966 12967 template <typename Derived> 12968 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12969 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12970 TypeSourceInfo **RecoveryTSI) { 12971 assert(E->getQualifierLoc()); 12972 NestedNameSpecifierLoc QualifierLoc = 12973 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12974 if (!QualifierLoc) 12975 return ExprError(); 12976 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12977 12978 // TODO: If this is a conversion-function-id, verify that the 12979 // destination type name (if present) resolves the same way after 12980 // instantiation as it did in the local scope. 12981 12982 DeclarationNameInfo NameInfo = 12983 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12984 if (!NameInfo.getName()) 12985 return ExprError(); 12986 12987 if (!E->hasExplicitTemplateArgs()) { 12988 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12989 // Note: it is sufficient to compare the Name component of NameInfo: 12990 // if name has not changed, DNLoc has not changed either. 12991 NameInfo.getName() == E->getDeclName()) 12992 return E; 12993 12994 return getDerived().RebuildDependentScopeDeclRefExpr( 12995 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12996 IsAddressOfOperand, RecoveryTSI); 12997 } 12998 12999 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13000 if (getDerived().TransformTemplateArguments( 13001 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 13002 return ExprError(); 13003 13004 return getDerived().RebuildDependentScopeDeclRefExpr( 13005 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 13006 RecoveryTSI); 13007 } 13008 13009 template<typename Derived> 13010 ExprResult 13011 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 13012 // CXXConstructExprs other than for list-initialization and 13013 // CXXTemporaryObjectExpr are always implicit, so when we have 13014 // a 1-argument construction we just transform that argument. 13015 if (getDerived().AllowSkippingCXXConstructExpr() && 13016 ((E->getNumArgs() == 1 || 13017 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 13018 (!getDerived().DropCallArgument(E->getArg(0))) && 13019 !E->isListInitialization())) 13020 return getDerived().TransformInitializer(E->getArg(0), 13021 /*DirectInit*/ false); 13022 13023 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 13024 13025 QualType T = getDerived().TransformType(E->getType()); 13026 if (T.isNull()) 13027 return ExprError(); 13028 13029 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13030 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13031 if (!Constructor) 13032 return ExprError(); 13033 13034 bool ArgumentChanged = false; 13035 SmallVector<Expr*, 8> Args; 13036 { 13037 EnterExpressionEvaluationContext Context( 13038 getSema(), EnterExpressionEvaluationContext::InitList, 13039 E->isListInitialization()); 13040 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13041 &ArgumentChanged)) 13042 return ExprError(); 13043 } 13044 13045 if (!getDerived().AlwaysRebuild() && 13046 T == E->getType() && 13047 Constructor == E->getConstructor() && 13048 !ArgumentChanged) { 13049 // Mark the constructor as referenced. 13050 // FIXME: Instantiation-specific 13051 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13052 return E; 13053 } 13054 13055 return getDerived().RebuildCXXConstructExpr( 13056 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 13057 E->hadMultipleCandidates(), E->isListInitialization(), 13058 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 13059 E->getConstructionKind(), E->getParenOrBraceRange()); 13060 } 13061 13062 template<typename Derived> 13063 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 13064 CXXInheritedCtorInitExpr *E) { 13065 QualType T = getDerived().TransformType(E->getType()); 13066 if (T.isNull()) 13067 return ExprError(); 13068 13069 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13070 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13071 if (!Constructor) 13072 return ExprError(); 13073 13074 if (!getDerived().AlwaysRebuild() && 13075 T == E->getType() && 13076 Constructor == E->getConstructor()) { 13077 // Mark the constructor as referenced. 13078 // FIXME: Instantiation-specific 13079 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13080 return E; 13081 } 13082 13083 return getDerived().RebuildCXXInheritedCtorInitExpr( 13084 T, E->getLocation(), Constructor, 13085 E->constructsVBase(), E->inheritedFromVBase()); 13086 } 13087 13088 /// Transform a C++ temporary-binding expression. 13089 /// 13090 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 13091 /// transform the subexpression and return that. 13092 template<typename Derived> 13093 ExprResult 13094 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 13095 if (auto *Dtor = E->getTemporary()->getDestructor()) 13096 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 13097 const_cast<CXXDestructorDecl *>(Dtor)); 13098 return getDerived().TransformExpr(E->getSubExpr()); 13099 } 13100 13101 /// Transform a C++ expression that contains cleanups that should 13102 /// be run after the expression is evaluated. 13103 /// 13104 /// Since ExprWithCleanups nodes are implicitly generated, we 13105 /// just transform the subexpression and return that. 13106 template<typename Derived> 13107 ExprResult 13108 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 13109 return getDerived().TransformExpr(E->getSubExpr()); 13110 } 13111 13112 template<typename Derived> 13113 ExprResult 13114 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 13115 CXXTemporaryObjectExpr *E) { 13116 TypeSourceInfo *T = 13117 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13118 if (!T) 13119 return ExprError(); 13120 13121 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 13122 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 13123 if (!Constructor) 13124 return ExprError(); 13125 13126 bool ArgumentChanged = false; 13127 SmallVector<Expr*, 8> Args; 13128 Args.reserve(E->getNumArgs()); 13129 { 13130 EnterExpressionEvaluationContext Context( 13131 getSema(), EnterExpressionEvaluationContext::InitList, 13132 E->isListInitialization()); 13133 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 13134 &ArgumentChanged)) 13135 return ExprError(); 13136 } 13137 13138 if (!getDerived().AlwaysRebuild() && 13139 T == E->getTypeSourceInfo() && 13140 Constructor == E->getConstructor() && 13141 !ArgumentChanged) { 13142 // FIXME: Instantiation-specific 13143 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 13144 return SemaRef.MaybeBindToTemporary(E); 13145 } 13146 13147 // FIXME: We should just pass E->isListInitialization(), but we're not 13148 // prepared to handle list-initialization without a child InitListExpr. 13149 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 13150 return getDerived().RebuildCXXTemporaryObjectExpr( 13151 T, LParenLoc, Args, E->getEndLoc(), 13152 /*ListInitialization=*/LParenLoc.isInvalid()); 13153 } 13154 13155 template<typename Derived> 13156 ExprResult 13157 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 13158 // Transform any init-capture expressions before entering the scope of the 13159 // lambda body, because they are not semantically within that scope. 13160 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 13161 struct TransformedInitCapture { 13162 // The location of the ... if the result is retaining a pack expansion. 13163 SourceLocation EllipsisLoc; 13164 // Zero or more expansions of the init-capture. 13165 SmallVector<InitCaptureInfoTy, 4> Expansions; 13166 }; 13167 SmallVector<TransformedInitCapture, 4> InitCaptures; 13168 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 13169 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13170 CEnd = E->capture_end(); 13171 C != CEnd; ++C) { 13172 if (!E->isInitCapture(C)) 13173 continue; 13174 13175 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 13176 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13177 13178 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 13179 std::optional<unsigned> NumExpansions) { 13180 ExprResult NewExprInitResult = getDerived().TransformInitializer( 13181 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 13182 13183 if (NewExprInitResult.isInvalid()) { 13184 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 13185 return; 13186 } 13187 Expr *NewExprInit = NewExprInitResult.get(); 13188 13189 QualType NewInitCaptureType = 13190 getSema().buildLambdaInitCaptureInitialization( 13191 C->getLocation(), C->getCaptureKind() == LCK_ByRef, 13192 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 13193 cast<VarDecl>(C->getCapturedVar())->getInitStyle() != 13194 VarDecl::CInit, 13195 NewExprInit); 13196 Result.Expansions.push_back( 13197 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 13198 }; 13199 13200 // If this is an init-capture pack, consider expanding the pack now. 13201 if (OldVD->isParameterPack()) { 13202 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 13203 ->getTypeLoc() 13204 .castAs<PackExpansionTypeLoc>(); 13205 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13206 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 13207 13208 // Determine whether the set of unexpanded parameter packs can and should 13209 // be expanded. 13210 bool Expand = true; 13211 bool RetainExpansion = false; 13212 std::optional<unsigned> OrigNumExpansions = 13213 ExpansionTL.getTypePtr()->getNumExpansions(); 13214 std::optional<unsigned> NumExpansions = OrigNumExpansions; 13215 if (getDerived().TryExpandParameterPacks( 13216 ExpansionTL.getEllipsisLoc(), 13217 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 13218 RetainExpansion, NumExpansions)) 13219 return ExprError(); 13220 if (Expand) { 13221 for (unsigned I = 0; I != *NumExpansions; ++I) { 13222 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13223 SubstInitCapture(SourceLocation(), std::nullopt); 13224 } 13225 } 13226 if (!Expand || RetainExpansion) { 13227 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13228 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 13229 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 13230 } 13231 } else { 13232 SubstInitCapture(SourceLocation(), std::nullopt); 13233 } 13234 } 13235 13236 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 13237 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 13238 13239 // Transform the template parameters, and add them to the current 13240 // instantiation scope. The null case is handled correctly. 13241 auto TPL = getDerived().TransformTemplateParameterList( 13242 E->getTemplateParameterList()); 13243 LSI->GLTemplateParameterList = TPL; 13244 13245 // Transform the type of the original lambda's call operator. 13246 // The transformation MUST be done in the CurrentInstantiationScope since 13247 // it introduces a mapping of the original to the newly created 13248 // transformed parameters. 13249 TypeSourceInfo *NewCallOpTSI = nullptr; 13250 { 13251 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 13252 FunctionProtoTypeLoc OldCallOpFPTL = 13253 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 13254 13255 TypeLocBuilder NewCallOpTLBuilder; 13256 SmallVector<QualType, 4> ExceptionStorage; 13257 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 13258 QualType NewCallOpType = TransformFunctionProtoType( 13259 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 13260 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 13261 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 13262 ExceptionStorage, Changed); 13263 }); 13264 if (NewCallOpType.isNull()) 13265 return ExprError(); 13266 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 13267 NewCallOpType); 13268 } 13269 13270 // Create the local class that will describe the lambda. 13271 13272 // FIXME: DependencyKind below is wrong when substituting inside a templated 13273 // context that isn't a DeclContext (such as a variable template), or when 13274 // substituting an unevaluated lambda inside of a function's parameter's type 13275 // - as parameter types are not instantiated from within a function's DC. We 13276 // use evaluation contexts to distinguish the function parameter case. 13277 CXXRecordDecl::LambdaDependencyKind DependencyKind = 13278 CXXRecordDecl::LDK_Unknown; 13279 if ((getSema().isUnevaluatedContext() || 13280 getSema().isConstantEvaluatedContext()) && 13281 (getSema().CurContext->isFileContext() || 13282 !getSema().CurContext->getParent()->isDependentContext())) 13283 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 13284 13285 CXXRecordDecl *OldClass = E->getLambdaClass(); 13286 CXXRecordDecl *Class = 13287 getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI, 13288 DependencyKind, E->getCaptureDefault()); 13289 13290 getDerived().transformedLocalDecl(OldClass, {Class}); 13291 13292 std::optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 13293 if (getDerived().ReplacingOriginal()) 13294 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 13295 OldClass->getLambdaManglingNumber(), 13296 OldClass->getDeviceLambdaManglingNumber(), 13297 OldClass->getLambdaContextDecl()); 13298 13299 // Build the call operator. 13300 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 13301 Class, E->getIntroducerRange(), NewCallOpTSI, 13302 E->getCallOperator()->getEndLoc(), 13303 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 13304 E->getCallOperator()->getConstexprKind(), 13305 E->getCallOperator()->getStorageClass(), 13306 E->getCallOperator()->getTrailingRequiresClause()); 13307 13308 LSI->CallOperator = NewCallOperator; 13309 13310 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13311 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13312 13313 // Number the lambda for linkage purposes if necessary. 13314 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 13315 13316 // Introduce the context of the call operator. 13317 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13318 /*NewThisContext*/false); 13319 13320 // Enter the scope of the lambda. 13321 getSema().buildLambdaScope(LSI, NewCallOperator, 13322 E->getIntroducerRange(), 13323 E->getCaptureDefault(), 13324 E->getCaptureDefaultLoc(), 13325 E->hasExplicitParameters(), 13326 E->hasExplicitResultType(), 13327 E->isMutable()); 13328 13329 bool Invalid = false; 13330 13331 // Transform captures. 13332 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13333 CEnd = E->capture_end(); 13334 C != CEnd; ++C) { 13335 // When we hit the first implicit capture, tell Sema that we've finished 13336 // the list of explicit captures. 13337 if (C->isImplicit()) 13338 break; 13339 13340 // Capturing 'this' is trivial. 13341 if (C->capturesThis()) { 13342 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13343 /*BuildAndDiagnose*/ true, nullptr, 13344 C->getCaptureKind() == LCK_StarThis); 13345 continue; 13346 } 13347 // Captured expression will be recaptured during captured variables 13348 // rebuilding. 13349 if (C->capturesVLAType()) 13350 continue; 13351 13352 // Rebuild init-captures, including the implied field declaration. 13353 if (E->isInitCapture(C)) { 13354 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13355 13356 auto *OldVD = cast<VarDecl>(C->getCapturedVar()); 13357 llvm::SmallVector<Decl*, 4> NewVDs; 13358 13359 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13360 ExprResult Init = Info.first; 13361 QualType InitQualType = Info.second; 13362 if (Init.isInvalid() || InitQualType.isNull()) { 13363 Invalid = true; 13364 break; 13365 } 13366 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13367 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13368 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13369 if (!NewVD) { 13370 Invalid = true; 13371 break; 13372 } 13373 NewVDs.push_back(NewVD); 13374 getSema().addInitCapture(LSI, NewVD, C->getCaptureKind() == LCK_ByRef); 13375 } 13376 13377 if (Invalid) 13378 break; 13379 13380 getDerived().transformedLocalDecl(OldVD, NewVDs); 13381 continue; 13382 } 13383 13384 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13385 13386 // Determine the capture kind for Sema. 13387 Sema::TryCaptureKind Kind 13388 = C->isImplicit()? Sema::TryCapture_Implicit 13389 : C->getCaptureKind() == LCK_ByCopy 13390 ? Sema::TryCapture_ExplicitByVal 13391 : Sema::TryCapture_ExplicitByRef; 13392 SourceLocation EllipsisLoc; 13393 if (C->isPackExpansion()) { 13394 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13395 bool ShouldExpand = false; 13396 bool RetainExpansion = false; 13397 std::optional<unsigned> NumExpansions; 13398 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13399 C->getLocation(), 13400 Unexpanded, 13401 ShouldExpand, RetainExpansion, 13402 NumExpansions)) { 13403 Invalid = true; 13404 continue; 13405 } 13406 13407 if (ShouldExpand) { 13408 // The transform has determined that we should perform an expansion; 13409 // transform and capture each of the arguments. 13410 // expansion of the pattern. Do so. 13411 auto *Pack = cast<VarDecl>(C->getCapturedVar()); 13412 for (unsigned I = 0; I != *NumExpansions; ++I) { 13413 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13414 VarDecl *CapturedVar 13415 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13416 Pack)); 13417 if (!CapturedVar) { 13418 Invalid = true; 13419 continue; 13420 } 13421 13422 // Capture the transformed variable. 13423 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13424 } 13425 13426 // FIXME: Retain a pack expansion if RetainExpansion is true. 13427 13428 continue; 13429 } 13430 13431 EllipsisLoc = C->getEllipsisLoc(); 13432 } 13433 13434 // Transform the captured variable. 13435 auto *CapturedVar = cast_or_null<ValueDecl>( 13436 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13437 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13438 Invalid = true; 13439 continue; 13440 } 13441 13442 // Capture the transformed variable. 13443 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13444 EllipsisLoc); 13445 } 13446 getSema().finishLambdaExplicitCaptures(LSI); 13447 13448 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13449 // evaluation context even if we're not transforming the function body. 13450 getSema().PushExpressionEvaluationContext( 13451 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13452 13453 // Instantiate the body of the lambda expression. 13454 StmtResult Body = 13455 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13456 13457 // ActOnLambda* will pop the function scope for us. 13458 FuncScopeCleanup.disable(); 13459 13460 if (Body.isInvalid()) { 13461 SavedContext.pop(); 13462 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13463 /*IsInstantiation=*/true); 13464 return ExprError(); 13465 } 13466 13467 // Copy the LSI before ActOnFinishFunctionBody removes it. 13468 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13469 // the call operator. 13470 auto LSICopy = *LSI; 13471 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13472 /*IsInstantiation*/ true); 13473 SavedContext.pop(); 13474 13475 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13476 &LSICopy); 13477 } 13478 13479 template<typename Derived> 13480 StmtResult 13481 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13482 return TransformStmt(S); 13483 } 13484 13485 template<typename Derived> 13486 StmtResult 13487 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13488 // Transform captures. 13489 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13490 CEnd = E->capture_end(); 13491 C != CEnd; ++C) { 13492 // When we hit the first implicit capture, tell Sema that we've finished 13493 // the list of explicit captures. 13494 if (!C->isImplicit()) 13495 continue; 13496 13497 // Capturing 'this' is trivial. 13498 if (C->capturesThis()) { 13499 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13500 /*BuildAndDiagnose*/ true, nullptr, 13501 C->getCaptureKind() == LCK_StarThis); 13502 continue; 13503 } 13504 // Captured expression will be recaptured during captured variables 13505 // rebuilding. 13506 if (C->capturesVLAType()) 13507 continue; 13508 13509 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13510 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13511 13512 // Transform the captured variable. 13513 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13514 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13515 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13516 return StmtError(); 13517 13518 // Capture the transformed variable. 13519 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13520 } 13521 13522 return S; 13523 } 13524 13525 template<typename Derived> 13526 ExprResult 13527 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13528 CXXUnresolvedConstructExpr *E) { 13529 TypeSourceInfo *T = 13530 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13531 if (!T) 13532 return ExprError(); 13533 13534 bool ArgumentChanged = false; 13535 SmallVector<Expr*, 8> Args; 13536 Args.reserve(E->getNumArgs()); 13537 { 13538 EnterExpressionEvaluationContext Context( 13539 getSema(), EnterExpressionEvaluationContext::InitList, 13540 E->isListInitialization()); 13541 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13542 &ArgumentChanged)) 13543 return ExprError(); 13544 } 13545 13546 if (!getDerived().AlwaysRebuild() && 13547 T == E->getTypeSourceInfo() && 13548 !ArgumentChanged) 13549 return E; 13550 13551 // FIXME: we're faking the locations of the commas 13552 return getDerived().RebuildCXXUnresolvedConstructExpr( 13553 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13554 } 13555 13556 template<typename Derived> 13557 ExprResult 13558 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13559 CXXDependentScopeMemberExpr *E) { 13560 // Transform the base of the expression. 13561 ExprResult Base((Expr*) nullptr); 13562 Expr *OldBase; 13563 QualType BaseType; 13564 QualType ObjectType; 13565 if (!E->isImplicitAccess()) { 13566 OldBase = E->getBase(); 13567 Base = getDerived().TransformExpr(OldBase); 13568 if (Base.isInvalid()) 13569 return ExprError(); 13570 13571 // Start the member reference and compute the object's type. 13572 ParsedType ObjectTy; 13573 bool MayBePseudoDestructor = false; 13574 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13575 E->getOperatorLoc(), 13576 E->isArrow()? tok::arrow : tok::period, 13577 ObjectTy, 13578 MayBePseudoDestructor); 13579 if (Base.isInvalid()) 13580 return ExprError(); 13581 13582 ObjectType = ObjectTy.get(); 13583 BaseType = ((Expr*) Base.get())->getType(); 13584 } else { 13585 OldBase = nullptr; 13586 BaseType = getDerived().TransformType(E->getBaseType()); 13587 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13588 } 13589 13590 // Transform the first part of the nested-name-specifier that qualifies 13591 // the member name. 13592 NamedDecl *FirstQualifierInScope 13593 = getDerived().TransformFirstQualifierInScope( 13594 E->getFirstQualifierFoundInScope(), 13595 E->getQualifierLoc().getBeginLoc()); 13596 13597 NestedNameSpecifierLoc QualifierLoc; 13598 if (E->getQualifier()) { 13599 QualifierLoc 13600 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13601 ObjectType, 13602 FirstQualifierInScope); 13603 if (!QualifierLoc) 13604 return ExprError(); 13605 } 13606 13607 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13608 13609 // TODO: If this is a conversion-function-id, verify that the 13610 // destination type name (if present) resolves the same way after 13611 // instantiation as it did in the local scope. 13612 13613 DeclarationNameInfo NameInfo 13614 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13615 if (!NameInfo.getName()) 13616 return ExprError(); 13617 13618 if (!E->hasExplicitTemplateArgs()) { 13619 // This is a reference to a member without an explicitly-specified 13620 // template argument list. Optimize for this common case. 13621 if (!getDerived().AlwaysRebuild() && 13622 Base.get() == OldBase && 13623 BaseType == E->getBaseType() && 13624 QualifierLoc == E->getQualifierLoc() && 13625 NameInfo.getName() == E->getMember() && 13626 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13627 return E; 13628 13629 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13630 BaseType, 13631 E->isArrow(), 13632 E->getOperatorLoc(), 13633 QualifierLoc, 13634 TemplateKWLoc, 13635 FirstQualifierInScope, 13636 NameInfo, 13637 /*TemplateArgs*/nullptr); 13638 } 13639 13640 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13641 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13642 E->getNumTemplateArgs(), 13643 TransArgs)) 13644 return ExprError(); 13645 13646 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13647 BaseType, 13648 E->isArrow(), 13649 E->getOperatorLoc(), 13650 QualifierLoc, 13651 TemplateKWLoc, 13652 FirstQualifierInScope, 13653 NameInfo, 13654 &TransArgs); 13655 } 13656 13657 template <typename Derived> 13658 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13659 UnresolvedMemberExpr *Old) { 13660 // Transform the base of the expression. 13661 ExprResult Base((Expr *)nullptr); 13662 QualType BaseType; 13663 if (!Old->isImplicitAccess()) { 13664 Base = getDerived().TransformExpr(Old->getBase()); 13665 if (Base.isInvalid()) 13666 return ExprError(); 13667 Base = 13668 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13669 if (Base.isInvalid()) 13670 return ExprError(); 13671 BaseType = Base.get()->getType(); 13672 } else { 13673 BaseType = getDerived().TransformType(Old->getBaseType()); 13674 } 13675 13676 NestedNameSpecifierLoc QualifierLoc; 13677 if (Old->getQualifierLoc()) { 13678 QualifierLoc = 13679 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13680 if (!QualifierLoc) 13681 return ExprError(); 13682 } 13683 13684 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13685 13686 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13687 13688 // Transform the declaration set. 13689 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13690 return ExprError(); 13691 13692 // Determine the naming class. 13693 if (Old->getNamingClass()) { 13694 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13695 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13696 if (!NamingClass) 13697 return ExprError(); 13698 13699 R.setNamingClass(NamingClass); 13700 } 13701 13702 TemplateArgumentListInfo TransArgs; 13703 if (Old->hasExplicitTemplateArgs()) { 13704 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13705 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13706 if (getDerived().TransformTemplateArguments( 13707 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13708 return ExprError(); 13709 } 13710 13711 // FIXME: to do this check properly, we will need to preserve the 13712 // first-qualifier-in-scope here, just in case we had a dependent 13713 // base (and therefore couldn't do the check) and a 13714 // nested-name-qualifier (and therefore could do the lookup). 13715 NamedDecl *FirstQualifierInScope = nullptr; 13716 13717 return getDerived().RebuildUnresolvedMemberExpr( 13718 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13719 TemplateKWLoc, FirstQualifierInScope, R, 13720 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13721 } 13722 13723 template<typename Derived> 13724 ExprResult 13725 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13726 EnterExpressionEvaluationContext Unevaluated( 13727 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13728 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13729 if (SubExpr.isInvalid()) 13730 return ExprError(); 13731 13732 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13733 return E; 13734 13735 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13736 } 13737 13738 template<typename Derived> 13739 ExprResult 13740 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13741 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13742 if (Pattern.isInvalid()) 13743 return ExprError(); 13744 13745 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13746 return E; 13747 13748 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13749 E->getNumExpansions()); 13750 } 13751 13752 template<typename Derived> 13753 ExprResult 13754 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13755 // If E is not value-dependent, then nothing will change when we transform it. 13756 // Note: This is an instantiation-centric view. 13757 if (!E->isValueDependent()) 13758 return E; 13759 13760 EnterExpressionEvaluationContext Unevaluated( 13761 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13762 13763 ArrayRef<TemplateArgument> PackArgs; 13764 TemplateArgument ArgStorage; 13765 13766 // Find the argument list to transform. 13767 if (E->isPartiallySubstituted()) { 13768 PackArgs = E->getPartialArguments(); 13769 } else if (E->isValueDependent()) { 13770 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13771 bool ShouldExpand = false; 13772 bool RetainExpansion = false; 13773 std::optional<unsigned> NumExpansions; 13774 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13775 Unexpanded, 13776 ShouldExpand, RetainExpansion, 13777 NumExpansions)) 13778 return ExprError(); 13779 13780 // If we need to expand the pack, build a template argument from it and 13781 // expand that. 13782 if (ShouldExpand) { 13783 auto *Pack = E->getPack(); 13784 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13785 ArgStorage = getSema().Context.getPackExpansionType( 13786 getSema().Context.getTypeDeclType(TTPD), std::nullopt); 13787 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13788 ArgStorage = TemplateArgument(TemplateName(TTPD), std::nullopt); 13789 } else { 13790 auto *VD = cast<ValueDecl>(Pack); 13791 ExprResult DRE = getSema().BuildDeclRefExpr( 13792 VD, VD->getType().getNonLValueExprType(getSema().Context), 13793 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13794 E->getPackLoc()); 13795 if (DRE.isInvalid()) 13796 return ExprError(); 13797 ArgStorage = new (getSema().Context) 13798 PackExpansionExpr(getSema().Context.DependentTy, DRE.get(), 13799 E->getPackLoc(), std::nullopt); 13800 } 13801 PackArgs = ArgStorage; 13802 } 13803 } 13804 13805 // If we're not expanding the pack, just transform the decl. 13806 if (!PackArgs.size()) { 13807 auto *Pack = cast_or_null<NamedDecl>( 13808 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13809 if (!Pack) 13810 return ExprError(); 13811 return getDerived().RebuildSizeOfPackExpr( 13812 E->getOperatorLoc(), Pack, E->getPackLoc(), E->getRParenLoc(), 13813 std::nullopt, std::nullopt); 13814 } 13815 13816 // Try to compute the result without performing a partial substitution. 13817 std::optional<unsigned> Result = 0; 13818 for (const TemplateArgument &Arg : PackArgs) { 13819 if (!Arg.isPackExpansion()) { 13820 Result = *Result + 1; 13821 continue; 13822 } 13823 13824 TemplateArgumentLoc ArgLoc; 13825 InventTemplateArgumentLoc(Arg, ArgLoc); 13826 13827 // Find the pattern of the pack expansion. 13828 SourceLocation Ellipsis; 13829 std::optional<unsigned> OrigNumExpansions; 13830 TemplateArgumentLoc Pattern = 13831 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13832 OrigNumExpansions); 13833 13834 // Substitute under the pack expansion. Do not expand the pack (yet). 13835 TemplateArgumentLoc OutPattern; 13836 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13837 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13838 /*Uneval*/ true)) 13839 return true; 13840 13841 // See if we can determine the number of arguments from the result. 13842 std::optional<unsigned> NumExpansions = 13843 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13844 if (!NumExpansions) { 13845 // No: we must be in an alias template expansion, and we're going to need 13846 // to actually expand the packs. 13847 Result = std::nullopt; 13848 break; 13849 } 13850 13851 Result = *Result + *NumExpansions; 13852 } 13853 13854 // Common case: we could determine the number of expansions without 13855 // substituting. 13856 if (Result) 13857 return getDerived().RebuildSizeOfPackExpr( 13858 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 13859 *Result, std::nullopt); 13860 13861 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13862 E->getPackLoc()); 13863 { 13864 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13865 typedef TemplateArgumentLocInventIterator< 13866 Derived, const TemplateArgument*> PackLocIterator; 13867 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13868 PackLocIterator(*this, PackArgs.end()), 13869 TransformedPackArgs, /*Uneval*/true)) 13870 return ExprError(); 13871 } 13872 13873 // Check whether we managed to fully-expand the pack. 13874 // FIXME: Is it possible for us to do so and not hit the early exit path? 13875 SmallVector<TemplateArgument, 8> Args; 13876 bool PartialSubstitution = false; 13877 for (auto &Loc : TransformedPackArgs.arguments()) { 13878 Args.push_back(Loc.getArgument()); 13879 if (Loc.getArgument().isPackExpansion()) 13880 PartialSubstitution = true; 13881 } 13882 13883 if (PartialSubstitution) 13884 return getDerived().RebuildSizeOfPackExpr( 13885 E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), 13886 std::nullopt, Args); 13887 13888 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13889 E->getPackLoc(), E->getRParenLoc(), 13890 Args.size(), std::nullopt); 13891 } 13892 13893 template<typename Derived> 13894 ExprResult 13895 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13896 SubstNonTypeTemplateParmPackExpr *E) { 13897 // Default behavior is to do nothing with this transformation. 13898 return E; 13899 } 13900 13901 template<typename Derived> 13902 ExprResult 13903 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13904 SubstNonTypeTemplateParmExpr *E) { 13905 // Default behavior is to do nothing with this transformation. 13906 return E; 13907 } 13908 13909 template<typename Derived> 13910 ExprResult 13911 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13912 // Default behavior is to do nothing with this transformation. 13913 return E; 13914 } 13915 13916 template<typename Derived> 13917 ExprResult 13918 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13919 MaterializeTemporaryExpr *E) { 13920 return getDerived().TransformExpr(E->getSubExpr()); 13921 } 13922 13923 template<typename Derived> 13924 ExprResult 13925 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13926 UnresolvedLookupExpr *Callee = nullptr; 13927 if (Expr *OldCallee = E->getCallee()) { 13928 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13929 if (CalleeResult.isInvalid()) 13930 return ExprError(); 13931 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13932 } 13933 13934 Expr *Pattern = E->getPattern(); 13935 13936 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13937 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13938 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13939 13940 // Determine whether the set of unexpanded parameter packs can and should 13941 // be expanded. 13942 bool Expand = true; 13943 bool RetainExpansion = false; 13944 std::optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13945 NumExpansions = OrigNumExpansions; 13946 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13947 Pattern->getSourceRange(), 13948 Unexpanded, 13949 Expand, RetainExpansion, 13950 NumExpansions)) 13951 return true; 13952 13953 if (!Expand) { 13954 // Do not expand any packs here, just transform and rebuild a fold 13955 // expression. 13956 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13957 13958 ExprResult LHS = 13959 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13960 if (LHS.isInvalid()) 13961 return true; 13962 13963 ExprResult RHS = 13964 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13965 if (RHS.isInvalid()) 13966 return true; 13967 13968 if (!getDerived().AlwaysRebuild() && 13969 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13970 return E; 13971 13972 return getDerived().RebuildCXXFoldExpr( 13973 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13974 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13975 } 13976 13977 // Formally a fold expression expands to nested parenthesized expressions. 13978 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13979 // them. 13980 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13981 SemaRef.Diag(E->getEllipsisLoc(), 13982 clang::diag::err_fold_expression_limit_exceeded) 13983 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13984 << E->getSourceRange(); 13985 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13986 return ExprError(); 13987 } 13988 13989 // The transform has determined that we should perform an elementwise 13990 // expansion of the pattern. Do so. 13991 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13992 if (Result.isInvalid()) 13993 return true; 13994 bool LeftFold = E->isLeftFold(); 13995 13996 // If we're retaining an expansion for a right fold, it is the innermost 13997 // component and takes the init (if any). 13998 if (!LeftFold && RetainExpansion) { 13999 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14000 14001 ExprResult Out = getDerived().TransformExpr(Pattern); 14002 if (Out.isInvalid()) 14003 return true; 14004 14005 Result = getDerived().RebuildCXXFoldExpr( 14006 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 14007 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 14008 if (Result.isInvalid()) 14009 return true; 14010 } 14011 14012 for (unsigned I = 0; I != *NumExpansions; ++I) { 14013 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 14014 getSema(), LeftFold ? I : *NumExpansions - I - 1); 14015 ExprResult Out = getDerived().TransformExpr(Pattern); 14016 if (Out.isInvalid()) 14017 return true; 14018 14019 if (Out.get()->containsUnexpandedParameterPack()) { 14020 // We still have a pack; retain a pack expansion for this slice. 14021 Result = getDerived().RebuildCXXFoldExpr( 14022 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 14023 E->getOperator(), E->getEllipsisLoc(), 14024 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 14025 OrigNumExpansions); 14026 } else if (Result.isUsable()) { 14027 // We've got down to a single element; build a binary operator. 14028 Expr *LHS = LeftFold ? Result.get() : Out.get(); 14029 Expr *RHS = LeftFold ? Out.get() : Result.get(); 14030 if (Callee) 14031 Result = getDerived().RebuildCXXOperatorCallExpr( 14032 BinaryOperator::getOverloadedOperator(E->getOperator()), 14033 E->getEllipsisLoc(), Callee, LHS, RHS); 14034 else 14035 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 14036 E->getOperator(), LHS, RHS); 14037 } else 14038 Result = Out; 14039 14040 if (Result.isInvalid()) 14041 return true; 14042 } 14043 14044 // If we're retaining an expansion for a left fold, it is the outermost 14045 // component and takes the complete expansion so far as its init (if any). 14046 if (LeftFold && RetainExpansion) { 14047 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 14048 14049 ExprResult Out = getDerived().TransformExpr(Pattern); 14050 if (Out.isInvalid()) 14051 return true; 14052 14053 Result = getDerived().RebuildCXXFoldExpr( 14054 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 14055 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 14056 if (Result.isInvalid()) 14057 return true; 14058 } 14059 14060 // If we had no init and an empty pack, and we're not retaining an expansion, 14061 // then produce a fallback value or error. 14062 if (Result.isUnset()) 14063 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 14064 E->getOperator()); 14065 14066 return Result; 14067 } 14068 14069 template <typename Derived> 14070 ExprResult 14071 TreeTransform<Derived>::TransformCXXParenListInitExpr(CXXParenListInitExpr *E) { 14072 SmallVector<Expr *, 4> TransformedInits; 14073 ArrayRef<Expr *> InitExprs = E->getInitExprs(); 14074 if (TransformExprs(InitExprs.data(), InitExprs.size(), true, 14075 TransformedInits)) 14076 return ExprError(); 14077 14078 return getDerived().RebuildCXXParenListInitExpr( 14079 TransformedInits, E->getType(), E->getUserSpecifiedInitExprs().size(), 14080 E->getInitLoc(), E->getBeginLoc(), E->getEndLoc()); 14081 } 14082 14083 template<typename Derived> 14084 ExprResult 14085 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 14086 CXXStdInitializerListExpr *E) { 14087 return getDerived().TransformExpr(E->getSubExpr()); 14088 } 14089 14090 template<typename Derived> 14091 ExprResult 14092 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 14093 return SemaRef.MaybeBindToTemporary(E); 14094 } 14095 14096 template<typename Derived> 14097 ExprResult 14098 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 14099 return E; 14100 } 14101 14102 template<typename Derived> 14103 ExprResult 14104 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 14105 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 14106 if (SubExpr.isInvalid()) 14107 return ExprError(); 14108 14109 if (!getDerived().AlwaysRebuild() && 14110 SubExpr.get() == E->getSubExpr()) 14111 return E; 14112 14113 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 14114 } 14115 14116 template<typename Derived> 14117 ExprResult 14118 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 14119 // Transform each of the elements. 14120 SmallVector<Expr *, 8> Elements; 14121 bool ArgChanged = false; 14122 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 14123 /*IsCall=*/false, Elements, &ArgChanged)) 14124 return ExprError(); 14125 14126 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14127 return SemaRef.MaybeBindToTemporary(E); 14128 14129 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 14130 Elements.data(), 14131 Elements.size()); 14132 } 14133 14134 template<typename Derived> 14135 ExprResult 14136 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 14137 ObjCDictionaryLiteral *E) { 14138 // Transform each of the elements. 14139 SmallVector<ObjCDictionaryElement, 8> Elements; 14140 bool ArgChanged = false; 14141 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 14142 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 14143 14144 if (OrigElement.isPackExpansion()) { 14145 // This key/value element is a pack expansion. 14146 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 14147 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 14148 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 14149 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 14150 14151 // Determine whether the set of unexpanded parameter packs can 14152 // and should be expanded. 14153 bool Expand = true; 14154 bool RetainExpansion = false; 14155 std::optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 14156 std::optional<unsigned> NumExpansions = OrigNumExpansions; 14157 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 14158 OrigElement.Value->getEndLoc()); 14159 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 14160 PatternRange, Unexpanded, Expand, 14161 RetainExpansion, NumExpansions)) 14162 return ExprError(); 14163 14164 if (!Expand) { 14165 // The transform has determined that we should perform a simple 14166 // transformation on the pack expansion, producing another pack 14167 // expansion. 14168 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 14169 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14170 if (Key.isInvalid()) 14171 return ExprError(); 14172 14173 if (Key.get() != OrigElement.Key) 14174 ArgChanged = true; 14175 14176 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14177 if (Value.isInvalid()) 14178 return ExprError(); 14179 14180 if (Value.get() != OrigElement.Value) 14181 ArgChanged = true; 14182 14183 ObjCDictionaryElement Expansion = { 14184 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 14185 }; 14186 Elements.push_back(Expansion); 14187 continue; 14188 } 14189 14190 // Record right away that the argument was changed. This needs 14191 // to happen even if the array expands to nothing. 14192 ArgChanged = true; 14193 14194 // The transform has determined that we should perform an elementwise 14195 // expansion of the pattern. Do so. 14196 for (unsigned I = 0; I != *NumExpansions; ++I) { 14197 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 14198 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14199 if (Key.isInvalid()) 14200 return ExprError(); 14201 14202 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 14203 if (Value.isInvalid()) 14204 return ExprError(); 14205 14206 ObjCDictionaryElement Element = { 14207 Key.get(), Value.get(), SourceLocation(), NumExpansions 14208 }; 14209 14210 // If any unexpanded parameter packs remain, we still have a 14211 // pack expansion. 14212 // FIXME: Can this really happen? 14213 if (Key.get()->containsUnexpandedParameterPack() || 14214 Value.get()->containsUnexpandedParameterPack()) 14215 Element.EllipsisLoc = OrigElement.EllipsisLoc; 14216 14217 Elements.push_back(Element); 14218 } 14219 14220 // FIXME: Retain a pack expansion if RetainExpansion is true. 14221 14222 // We've finished with this pack expansion. 14223 continue; 14224 } 14225 14226 // Transform and check key. 14227 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 14228 if (Key.isInvalid()) 14229 return ExprError(); 14230 14231 if (Key.get() != OrigElement.Key) 14232 ArgChanged = true; 14233 14234 // Transform and check value. 14235 ExprResult Value 14236 = getDerived().TransformExpr(OrigElement.Value); 14237 if (Value.isInvalid()) 14238 return ExprError(); 14239 14240 if (Value.get() != OrigElement.Value) 14241 ArgChanged = true; 14242 14243 ObjCDictionaryElement Element = {Key.get(), Value.get(), SourceLocation(), 14244 std::nullopt}; 14245 Elements.push_back(Element); 14246 } 14247 14248 if (!getDerived().AlwaysRebuild() && !ArgChanged) 14249 return SemaRef.MaybeBindToTemporary(E); 14250 14251 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 14252 Elements); 14253 } 14254 14255 template<typename Derived> 14256 ExprResult 14257 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 14258 TypeSourceInfo *EncodedTypeInfo 14259 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 14260 if (!EncodedTypeInfo) 14261 return ExprError(); 14262 14263 if (!getDerived().AlwaysRebuild() && 14264 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 14265 return E; 14266 14267 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 14268 EncodedTypeInfo, 14269 E->getRParenLoc()); 14270 } 14271 14272 template<typename Derived> 14273 ExprResult TreeTransform<Derived>:: 14274 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 14275 // This is a kind of implicit conversion, and it needs to get dropped 14276 // and recomputed for the same general reasons that ImplicitCastExprs 14277 // do, as well a more specific one: this expression is only valid when 14278 // it appears *immediately* as an argument expression. 14279 return getDerived().TransformExpr(E->getSubExpr()); 14280 } 14281 14282 template<typename Derived> 14283 ExprResult TreeTransform<Derived>:: 14284 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 14285 TypeSourceInfo *TSInfo 14286 = getDerived().TransformType(E->getTypeInfoAsWritten()); 14287 if (!TSInfo) 14288 return ExprError(); 14289 14290 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 14291 if (Result.isInvalid()) 14292 return ExprError(); 14293 14294 if (!getDerived().AlwaysRebuild() && 14295 TSInfo == E->getTypeInfoAsWritten() && 14296 Result.get() == E->getSubExpr()) 14297 return E; 14298 14299 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 14300 E->getBridgeKeywordLoc(), TSInfo, 14301 Result.get()); 14302 } 14303 14304 template <typename Derived> 14305 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14306 ObjCAvailabilityCheckExpr *E) { 14307 return E; 14308 } 14309 14310 template<typename Derived> 14311 ExprResult 14312 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14313 // Transform arguments. 14314 bool ArgChanged = false; 14315 SmallVector<Expr*, 8> Args; 14316 Args.reserve(E->getNumArgs()); 14317 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14318 &ArgChanged)) 14319 return ExprError(); 14320 14321 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14322 // Class message: transform the receiver type. 14323 TypeSourceInfo *ReceiverTypeInfo 14324 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14325 if (!ReceiverTypeInfo) 14326 return ExprError(); 14327 14328 // If nothing changed, just retain the existing message send. 14329 if (!getDerived().AlwaysRebuild() && 14330 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14331 return SemaRef.MaybeBindToTemporary(E); 14332 14333 // Build a new class message send. 14334 SmallVector<SourceLocation, 16> SelLocs; 14335 E->getSelectorLocs(SelLocs); 14336 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14337 E->getSelector(), 14338 SelLocs, 14339 E->getMethodDecl(), 14340 E->getLeftLoc(), 14341 Args, 14342 E->getRightLoc()); 14343 } 14344 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14345 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14346 if (!E->getMethodDecl()) 14347 return ExprError(); 14348 14349 // Build a new class message send to 'super'. 14350 SmallVector<SourceLocation, 16> SelLocs; 14351 E->getSelectorLocs(SelLocs); 14352 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14353 E->getSelector(), 14354 SelLocs, 14355 E->getReceiverType(), 14356 E->getMethodDecl(), 14357 E->getLeftLoc(), 14358 Args, 14359 E->getRightLoc()); 14360 } 14361 14362 // Instance message: transform the receiver 14363 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14364 "Only class and instance messages may be instantiated"); 14365 ExprResult Receiver 14366 = getDerived().TransformExpr(E->getInstanceReceiver()); 14367 if (Receiver.isInvalid()) 14368 return ExprError(); 14369 14370 // If nothing changed, just retain the existing message send. 14371 if (!getDerived().AlwaysRebuild() && 14372 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14373 return SemaRef.MaybeBindToTemporary(E); 14374 14375 // Build a new instance message send. 14376 SmallVector<SourceLocation, 16> SelLocs; 14377 E->getSelectorLocs(SelLocs); 14378 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14379 E->getSelector(), 14380 SelLocs, 14381 E->getMethodDecl(), 14382 E->getLeftLoc(), 14383 Args, 14384 E->getRightLoc()); 14385 } 14386 14387 template<typename Derived> 14388 ExprResult 14389 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14390 return E; 14391 } 14392 14393 template<typename Derived> 14394 ExprResult 14395 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14396 return E; 14397 } 14398 14399 template<typename Derived> 14400 ExprResult 14401 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14402 // Transform the base expression. 14403 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14404 if (Base.isInvalid()) 14405 return ExprError(); 14406 14407 // We don't need to transform the ivar; it will never change. 14408 14409 // If nothing changed, just retain the existing expression. 14410 if (!getDerived().AlwaysRebuild() && 14411 Base.get() == E->getBase()) 14412 return E; 14413 14414 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14415 E->getLocation(), 14416 E->isArrow(), E->isFreeIvar()); 14417 } 14418 14419 template<typename Derived> 14420 ExprResult 14421 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14422 // 'super' and types never change. Property never changes. Just 14423 // retain the existing expression. 14424 if (!E->isObjectReceiver()) 14425 return E; 14426 14427 // Transform the base expression. 14428 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14429 if (Base.isInvalid()) 14430 return ExprError(); 14431 14432 // We don't need to transform the property; it will never change. 14433 14434 // If nothing changed, just retain the existing expression. 14435 if (!getDerived().AlwaysRebuild() && 14436 Base.get() == E->getBase()) 14437 return E; 14438 14439 if (E->isExplicitProperty()) 14440 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14441 E->getExplicitProperty(), 14442 E->getLocation()); 14443 14444 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14445 SemaRef.Context.PseudoObjectTy, 14446 E->getImplicitPropertyGetter(), 14447 E->getImplicitPropertySetter(), 14448 E->getLocation()); 14449 } 14450 14451 template<typename Derived> 14452 ExprResult 14453 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14454 // Transform the base expression. 14455 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14456 if (Base.isInvalid()) 14457 return ExprError(); 14458 14459 // Transform the key expression. 14460 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14461 if (Key.isInvalid()) 14462 return ExprError(); 14463 14464 // If nothing changed, just retain the existing expression. 14465 if (!getDerived().AlwaysRebuild() && 14466 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14467 return E; 14468 14469 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14470 Base.get(), Key.get(), 14471 E->getAtIndexMethodDecl(), 14472 E->setAtIndexMethodDecl()); 14473 } 14474 14475 template<typename Derived> 14476 ExprResult 14477 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14478 // Transform the base expression. 14479 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14480 if (Base.isInvalid()) 14481 return ExprError(); 14482 14483 // If nothing changed, just retain the existing expression. 14484 if (!getDerived().AlwaysRebuild() && 14485 Base.get() == E->getBase()) 14486 return E; 14487 14488 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14489 E->getOpLoc(), 14490 E->isArrow()); 14491 } 14492 14493 template<typename Derived> 14494 ExprResult 14495 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14496 bool ArgumentChanged = false; 14497 SmallVector<Expr*, 8> SubExprs; 14498 SubExprs.reserve(E->getNumSubExprs()); 14499 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14500 SubExprs, &ArgumentChanged)) 14501 return ExprError(); 14502 14503 if (!getDerived().AlwaysRebuild() && 14504 !ArgumentChanged) 14505 return E; 14506 14507 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14508 SubExprs, 14509 E->getRParenLoc()); 14510 } 14511 14512 template<typename Derived> 14513 ExprResult 14514 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14515 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14516 if (SrcExpr.isInvalid()) 14517 return ExprError(); 14518 14519 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14520 if (!Type) 14521 return ExprError(); 14522 14523 if (!getDerived().AlwaysRebuild() && 14524 Type == E->getTypeSourceInfo() && 14525 SrcExpr.get() == E->getSrcExpr()) 14526 return E; 14527 14528 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14529 SrcExpr.get(), Type, 14530 E->getRParenLoc()); 14531 } 14532 14533 template<typename Derived> 14534 ExprResult 14535 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14536 BlockDecl *oldBlock = E->getBlockDecl(); 14537 14538 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14539 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14540 14541 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14542 blockScope->TheDecl->setBlockMissingReturnType( 14543 oldBlock->blockMissingReturnType()); 14544 14545 SmallVector<ParmVarDecl*, 4> params; 14546 SmallVector<QualType, 4> paramTypes; 14547 14548 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14549 14550 // Parameter substitution. 14551 Sema::ExtParameterInfoBuilder extParamInfos; 14552 if (getDerived().TransformFunctionTypeParams( 14553 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14554 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14555 extParamInfos)) { 14556 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14557 return ExprError(); 14558 } 14559 14560 QualType exprResultType = 14561 getDerived().TransformType(exprFunctionType->getReturnType()); 14562 14563 auto epi = exprFunctionType->getExtProtoInfo(); 14564 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14565 14566 QualType functionType = 14567 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14568 blockScope->FunctionType = functionType; 14569 14570 // Set the parameters on the block decl. 14571 if (!params.empty()) 14572 blockScope->TheDecl->setParams(params); 14573 14574 if (!oldBlock->blockMissingReturnType()) { 14575 blockScope->HasImplicitReturnType = false; 14576 blockScope->ReturnType = exprResultType; 14577 } 14578 14579 // Transform the body 14580 StmtResult body = getDerived().TransformStmt(E->getBody()); 14581 if (body.isInvalid()) { 14582 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14583 return ExprError(); 14584 } 14585 14586 #ifndef NDEBUG 14587 // In builds with assertions, make sure that we captured everything we 14588 // captured before. 14589 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14590 for (const auto &I : oldBlock->captures()) { 14591 VarDecl *oldCapture = I.getVariable(); 14592 14593 // Ignore parameter packs. 14594 if (oldCapture->isParameterPack()) 14595 continue; 14596 14597 VarDecl *newCapture = 14598 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14599 oldCapture)); 14600 assert(blockScope->CaptureMap.count(newCapture)); 14601 } 14602 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14603 } 14604 #endif 14605 14606 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14607 /*Scope=*/nullptr); 14608 } 14609 14610 template<typename Derived> 14611 ExprResult 14612 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14613 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14614 if (SrcExpr.isInvalid()) 14615 return ExprError(); 14616 14617 QualType Type = getDerived().TransformType(E->getType()); 14618 14619 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14620 E->getRParenLoc()); 14621 } 14622 14623 template<typename Derived> 14624 ExprResult 14625 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14626 bool ArgumentChanged = false; 14627 SmallVector<Expr*, 8> SubExprs; 14628 SubExprs.reserve(E->getNumSubExprs()); 14629 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14630 SubExprs, &ArgumentChanged)) 14631 return ExprError(); 14632 14633 if (!getDerived().AlwaysRebuild() && 14634 !ArgumentChanged) 14635 return E; 14636 14637 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14638 E->getOp(), E->getRParenLoc()); 14639 } 14640 14641 //===----------------------------------------------------------------------===// 14642 // Type reconstruction 14643 //===----------------------------------------------------------------------===// 14644 14645 template<typename Derived> 14646 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14647 SourceLocation Star) { 14648 return SemaRef.BuildPointerType(PointeeType, Star, 14649 getDerived().getBaseEntity()); 14650 } 14651 14652 template<typename Derived> 14653 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14654 SourceLocation Star) { 14655 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14656 getDerived().getBaseEntity()); 14657 } 14658 14659 template<typename Derived> 14660 QualType 14661 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14662 bool WrittenAsLValue, 14663 SourceLocation Sigil) { 14664 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14665 Sigil, getDerived().getBaseEntity()); 14666 } 14667 14668 template<typename Derived> 14669 QualType 14670 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14671 QualType ClassType, 14672 SourceLocation Sigil) { 14673 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14674 getDerived().getBaseEntity()); 14675 } 14676 14677 template<typename Derived> 14678 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14679 const ObjCTypeParamDecl *Decl, 14680 SourceLocation ProtocolLAngleLoc, 14681 ArrayRef<ObjCProtocolDecl *> Protocols, 14682 ArrayRef<SourceLocation> ProtocolLocs, 14683 SourceLocation ProtocolRAngleLoc) { 14684 return SemaRef.BuildObjCTypeParamType(Decl, 14685 ProtocolLAngleLoc, Protocols, 14686 ProtocolLocs, ProtocolRAngleLoc, 14687 /*FailOnError=*/true); 14688 } 14689 14690 template<typename Derived> 14691 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14692 QualType BaseType, 14693 SourceLocation Loc, 14694 SourceLocation TypeArgsLAngleLoc, 14695 ArrayRef<TypeSourceInfo *> TypeArgs, 14696 SourceLocation TypeArgsRAngleLoc, 14697 SourceLocation ProtocolLAngleLoc, 14698 ArrayRef<ObjCProtocolDecl *> Protocols, 14699 ArrayRef<SourceLocation> ProtocolLocs, 14700 SourceLocation ProtocolRAngleLoc) { 14701 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, TypeArgs, 14702 TypeArgsRAngleLoc, ProtocolLAngleLoc, 14703 Protocols, ProtocolLocs, ProtocolRAngleLoc, 14704 /*FailOnError=*/true, 14705 /*Rebuilding=*/true); 14706 } 14707 14708 template<typename Derived> 14709 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14710 QualType PointeeType, 14711 SourceLocation Star) { 14712 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14713 } 14714 14715 template<typename Derived> 14716 QualType 14717 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14718 ArrayType::ArraySizeModifier SizeMod, 14719 const llvm::APInt *Size, 14720 Expr *SizeExpr, 14721 unsigned IndexTypeQuals, 14722 SourceRange BracketsRange) { 14723 if (SizeExpr || !Size) 14724 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14725 IndexTypeQuals, BracketsRange, 14726 getDerived().getBaseEntity()); 14727 14728 QualType Types[] = { 14729 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14730 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14731 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14732 }; 14733 QualType SizeType; 14734 for (const auto &T : Types) 14735 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(T)) { 14736 SizeType = T; 14737 break; 14738 } 14739 14740 // Note that we can return a VariableArrayType here in the case where 14741 // the element type was a dependent VariableArrayType. 14742 IntegerLiteral *ArraySize 14743 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14744 /*FIXME*/BracketsRange.getBegin()); 14745 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14746 IndexTypeQuals, BracketsRange, 14747 getDerived().getBaseEntity()); 14748 } 14749 14750 template<typename Derived> 14751 QualType 14752 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14753 ArrayType::ArraySizeModifier SizeMod, 14754 const llvm::APInt &Size, 14755 Expr *SizeExpr, 14756 unsigned IndexTypeQuals, 14757 SourceRange BracketsRange) { 14758 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14759 IndexTypeQuals, BracketsRange); 14760 } 14761 14762 template<typename Derived> 14763 QualType 14764 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14765 ArrayType::ArraySizeModifier SizeMod, 14766 unsigned IndexTypeQuals, 14767 SourceRange BracketsRange) { 14768 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14769 IndexTypeQuals, BracketsRange); 14770 } 14771 14772 template<typename Derived> 14773 QualType 14774 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14775 ArrayType::ArraySizeModifier SizeMod, 14776 Expr *SizeExpr, 14777 unsigned IndexTypeQuals, 14778 SourceRange BracketsRange) { 14779 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14780 SizeExpr, 14781 IndexTypeQuals, BracketsRange); 14782 } 14783 14784 template<typename Derived> 14785 QualType 14786 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14787 ArrayType::ArraySizeModifier SizeMod, 14788 Expr *SizeExpr, 14789 unsigned IndexTypeQuals, 14790 SourceRange BracketsRange) { 14791 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14792 SizeExpr, 14793 IndexTypeQuals, BracketsRange); 14794 } 14795 14796 template <typename Derived> 14797 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14798 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14799 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14800 AttributeLoc); 14801 } 14802 14803 template <typename Derived> 14804 QualType 14805 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14806 unsigned NumElements, 14807 VectorType::VectorKind VecKind) { 14808 // FIXME: semantic checking! 14809 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14810 } 14811 14812 template <typename Derived> 14813 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14814 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14815 VectorType::VectorKind VecKind) { 14816 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14817 } 14818 14819 template<typename Derived> 14820 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14821 unsigned NumElements, 14822 SourceLocation AttributeLoc) { 14823 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14824 NumElements, true); 14825 IntegerLiteral *VectorSize 14826 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14827 AttributeLoc); 14828 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14829 } 14830 14831 template<typename Derived> 14832 QualType 14833 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14834 Expr *SizeExpr, 14835 SourceLocation AttributeLoc) { 14836 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14837 } 14838 14839 template <typename Derived> 14840 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14841 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14842 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14843 NumColumns); 14844 } 14845 14846 template <typename Derived> 14847 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14848 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14849 SourceLocation AttributeLoc) { 14850 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14851 AttributeLoc); 14852 } 14853 14854 template<typename Derived> 14855 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14856 QualType T, 14857 MutableArrayRef<QualType> ParamTypes, 14858 const FunctionProtoType::ExtProtoInfo &EPI) { 14859 return SemaRef.BuildFunctionType(T, ParamTypes, 14860 getDerived().getBaseLocation(), 14861 getDerived().getBaseEntity(), 14862 EPI); 14863 } 14864 14865 template<typename Derived> 14866 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14867 return SemaRef.Context.getFunctionNoProtoType(T); 14868 } 14869 14870 template<typename Derived> 14871 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14872 Decl *D) { 14873 assert(D && "no decl found"); 14874 if (D->isInvalidDecl()) return QualType(); 14875 14876 // FIXME: Doesn't account for ObjCInterfaceDecl! 14877 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14878 // A valid resolved using typename pack expansion decl can have multiple 14879 // UsingDecls, but they must each have exactly one type, and it must be 14880 // the same type in every case. But we must have at least one expansion! 14881 if (UPD->expansions().empty()) { 14882 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14883 << UPD->isCXXClassMember() << UPD; 14884 return QualType(); 14885 } 14886 14887 // We might still have some unresolved types. Try to pick a resolved type 14888 // if we can. The final instantiation will check that the remaining 14889 // unresolved types instantiate to the type we pick. 14890 QualType FallbackT; 14891 QualType T; 14892 for (auto *E : UPD->expansions()) { 14893 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14894 if (ThisT.isNull()) 14895 continue; 14896 else if (ThisT->getAs<UnresolvedUsingType>()) 14897 FallbackT = ThisT; 14898 else if (T.isNull()) 14899 T = ThisT; 14900 else 14901 assert(getSema().Context.hasSameType(ThisT, T) && 14902 "mismatched resolved types in using pack expansion"); 14903 } 14904 return T.isNull() ? FallbackT : T; 14905 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14906 assert(Using->hasTypename() && 14907 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14908 14909 // A valid resolved using typename decl points to exactly one type decl. 14910 assert(++Using->shadow_begin() == Using->shadow_end()); 14911 14912 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14913 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14914 return QualType(); 14915 return SemaRef.Context.getUsingType( 14916 Shadow, SemaRef.Context.getTypeDeclType( 14917 cast<TypeDecl>(Shadow->getTargetDecl()))); 14918 } else { 14919 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14920 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14921 return SemaRef.Context.getTypeDeclType( 14922 cast<UnresolvedUsingTypenameDecl>(D)); 14923 } 14924 } 14925 14926 template <typename Derived> 14927 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, SourceLocation, 14928 TypeOfKind Kind) { 14929 return SemaRef.BuildTypeofExprType(E, Kind); 14930 } 14931 14932 template<typename Derived> 14933 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying, 14934 TypeOfKind Kind) { 14935 return SemaRef.Context.getTypeOfType(Underlying, Kind); 14936 } 14937 14938 template <typename Derived> 14939 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14940 return SemaRef.BuildDecltypeType(E); 14941 } 14942 14943 template<typename Derived> 14944 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14945 UnaryTransformType::UTTKind UKind, 14946 SourceLocation Loc) { 14947 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14948 } 14949 14950 template<typename Derived> 14951 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14952 TemplateName Template, 14953 SourceLocation TemplateNameLoc, 14954 TemplateArgumentListInfo &TemplateArgs) { 14955 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14956 } 14957 14958 template<typename Derived> 14959 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14960 SourceLocation KWLoc) { 14961 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14962 } 14963 14964 template<typename Derived> 14965 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14966 SourceLocation KWLoc, 14967 bool isReadPipe) { 14968 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14969 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14970 } 14971 14972 template <typename Derived> 14973 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14974 unsigned NumBits, 14975 SourceLocation Loc) { 14976 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14977 NumBits, true); 14978 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14979 SemaRef.Context.IntTy, Loc); 14980 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14981 } 14982 14983 template <typename Derived> 14984 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14985 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14986 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14987 } 14988 14989 template<typename Derived> 14990 TemplateName 14991 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14992 bool TemplateKW, 14993 TemplateDecl *Template) { 14994 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14995 TemplateName(Template)); 14996 } 14997 14998 template<typename Derived> 14999 TemplateName 15000 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15001 SourceLocation TemplateKWLoc, 15002 const IdentifierInfo &Name, 15003 SourceLocation NameLoc, 15004 QualType ObjectType, 15005 NamedDecl *FirstQualifierInScope, 15006 bool AllowInjectedClassName) { 15007 UnqualifiedId TemplateName; 15008 TemplateName.setIdentifier(&Name, NameLoc); 15009 Sema::TemplateTy Template; 15010 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 15011 TemplateName, ParsedType::make(ObjectType), 15012 /*EnteringContext=*/false, Template, 15013 AllowInjectedClassName); 15014 return Template.get(); 15015 } 15016 15017 template<typename Derived> 15018 TemplateName 15019 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 15020 SourceLocation TemplateKWLoc, 15021 OverloadedOperatorKind Operator, 15022 SourceLocation NameLoc, 15023 QualType ObjectType, 15024 bool AllowInjectedClassName) { 15025 UnqualifiedId Name; 15026 // FIXME: Bogus location information. 15027 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 15028 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 15029 Sema::TemplateTy Template; 15030 getSema().ActOnTemplateName( 15031 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 15032 /*EnteringContext=*/false, Template, AllowInjectedClassName); 15033 return Template.get(); 15034 } 15035 15036 template<typename Derived> 15037 ExprResult 15038 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 15039 SourceLocation OpLoc, 15040 Expr *OrigCallee, 15041 Expr *First, 15042 Expr *Second) { 15043 Expr *Callee = OrigCallee->IgnoreParenCasts(); 15044 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 15045 15046 if (First->getObjectKind() == OK_ObjCProperty) { 15047 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15048 if (BinaryOperator::isAssignmentOp(Opc)) 15049 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 15050 First, Second); 15051 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 15052 if (Result.isInvalid()) 15053 return ExprError(); 15054 First = Result.get(); 15055 } 15056 15057 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 15058 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 15059 if (Result.isInvalid()) 15060 return ExprError(); 15061 Second = Result.get(); 15062 } 15063 15064 // Determine whether this should be a builtin operation. 15065 if (Op == OO_Subscript) { 15066 if (!First->getType()->isOverloadableType() && 15067 !Second->getType()->isOverloadableType()) 15068 return getSema().CreateBuiltinArraySubscriptExpr( 15069 First, Callee->getBeginLoc(), Second, OpLoc); 15070 } else if (Op == OO_Arrow) { 15071 // It is possible that the type refers to a RecoveryExpr created earlier 15072 // in the tree transformation. 15073 if (First->getType()->isDependentType()) 15074 return ExprError(); 15075 // -> is never a builtin operation. 15076 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 15077 } else if (Second == nullptr || isPostIncDec) { 15078 if (!First->getType()->isOverloadableType() || 15079 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 15080 // The argument is not of overloadable type, or this is an expression 15081 // of the form &Class::member, so try to create a built-in unary 15082 // operation. 15083 UnaryOperatorKind Opc 15084 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15085 15086 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 15087 } 15088 } else { 15089 if (!First->getType()->isOverloadableType() && 15090 !Second->getType()->isOverloadableType()) { 15091 // Neither of the arguments is an overloadable type, so try to 15092 // create a built-in binary operation. 15093 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15094 ExprResult Result 15095 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 15096 if (Result.isInvalid()) 15097 return ExprError(); 15098 15099 return Result; 15100 } 15101 } 15102 15103 // Compute the transformed set of functions (and function templates) to be 15104 // used during overload resolution. 15105 UnresolvedSet<16> Functions; 15106 bool RequiresADL; 15107 15108 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 15109 Functions.append(ULE->decls_begin(), ULE->decls_end()); 15110 // If the overload could not be resolved in the template definition 15111 // (because we had a dependent argument), ADL is performed as part of 15112 // template instantiation. 15113 RequiresADL = ULE->requiresADL(); 15114 } else { 15115 // If we've resolved this to a particular non-member function, just call 15116 // that function. If we resolved it to a member function, 15117 // CreateOverloaded* will find that function for us. 15118 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 15119 if (!isa<CXXMethodDecl>(ND)) 15120 Functions.addDecl(ND); 15121 RequiresADL = false; 15122 } 15123 15124 // Add any functions found via argument-dependent lookup. 15125 Expr *Args[2] = { First, Second }; 15126 unsigned NumArgs = 1 + (Second != nullptr); 15127 15128 // Create the overloaded operator invocation for unary operators. 15129 if (NumArgs == 1 || isPostIncDec) { 15130 UnaryOperatorKind Opc 15131 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 15132 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 15133 RequiresADL); 15134 } 15135 15136 if (Op == OO_Subscript) { 15137 SourceLocation LBrace; 15138 SourceLocation RBrace; 15139 15140 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 15141 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 15142 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 15143 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 15144 } else { 15145 LBrace = Callee->getBeginLoc(); 15146 RBrace = OpLoc; 15147 } 15148 15149 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 15150 First, Second); 15151 } 15152 15153 // Create the overloaded operator invocation for binary operators. 15154 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 15155 ExprResult Result = SemaRef.CreateOverloadedBinOp( 15156 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 15157 if (Result.isInvalid()) 15158 return ExprError(); 15159 15160 return Result; 15161 } 15162 15163 template<typename Derived> 15164 ExprResult 15165 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 15166 SourceLocation OperatorLoc, 15167 bool isArrow, 15168 CXXScopeSpec &SS, 15169 TypeSourceInfo *ScopeType, 15170 SourceLocation CCLoc, 15171 SourceLocation TildeLoc, 15172 PseudoDestructorTypeStorage Destroyed) { 15173 QualType BaseType = Base->getType(); 15174 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 15175 (!isArrow && !BaseType->getAs<RecordType>()) || 15176 (isArrow && BaseType->getAs<PointerType>() && 15177 !BaseType->castAs<PointerType>()->getPointeeType() 15178 ->template getAs<RecordType>())){ 15179 // This pseudo-destructor expression is still a pseudo-destructor. 15180 return SemaRef.BuildPseudoDestructorExpr( 15181 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 15182 CCLoc, TildeLoc, Destroyed); 15183 } 15184 15185 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 15186 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 15187 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 15188 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 15189 NameInfo.setNamedTypeInfo(DestroyedType); 15190 15191 // The scope type is now known to be a valid nested name specifier 15192 // component. Tack it on to the end of the nested name specifier. 15193 if (ScopeType) { 15194 if (!ScopeType->getType()->getAs<TagType>()) { 15195 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 15196 diag::err_expected_class_or_namespace) 15197 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 15198 return ExprError(); 15199 } 15200 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 15201 CCLoc); 15202 } 15203 15204 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 15205 return getSema().BuildMemberReferenceExpr(Base, BaseType, 15206 OperatorLoc, isArrow, 15207 SS, TemplateKWLoc, 15208 /*FIXME: FirstQualifier*/ nullptr, 15209 NameInfo, 15210 /*TemplateArgs*/ nullptr, 15211 /*S*/nullptr); 15212 } 15213 15214 template<typename Derived> 15215 StmtResult 15216 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 15217 SourceLocation Loc = S->getBeginLoc(); 15218 CapturedDecl *CD = S->getCapturedDecl(); 15219 unsigned NumParams = CD->getNumParams(); 15220 unsigned ContextParamPos = CD->getContextParamPosition(); 15221 SmallVector<Sema::CapturedParamNameType, 4> Params; 15222 for (unsigned I = 0; I < NumParams; ++I) { 15223 if (I != ContextParamPos) { 15224 Params.push_back( 15225 std::make_pair( 15226 CD->getParam(I)->getName(), 15227 getDerived().TransformType(CD->getParam(I)->getType()))); 15228 } else { 15229 Params.push_back(std::make_pair(StringRef(), QualType())); 15230 } 15231 } 15232 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 15233 S->getCapturedRegionKind(), Params); 15234 StmtResult Body; 15235 { 15236 Sema::CompoundScopeRAII CompoundScope(getSema()); 15237 Body = getDerived().TransformStmt(S->getCapturedStmt()); 15238 } 15239 15240 if (Body.isInvalid()) { 15241 getSema().ActOnCapturedRegionError(); 15242 return StmtError(); 15243 } 15244 15245 return getSema().ActOnCapturedRegionEnd(Body.get()); 15246 } 15247 15248 } // end namespace clang 15249 15250 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15251